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
6 changes: 3 additions & 3 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ body:
value: |
Thanks for taking the time to report this.

**If this is a security or privacy vulnerability, please stop and read [SECURITY.md](https://github.com/impel-intelligence/Minna/blob/main/SECURITY.md) instead — those should be reported privately, not in a public issue.**
**If this is a security or privacy vulnerability, please stop and read [SECURITY.md](https://github.com/impel-intelligence/Minna/blob/main/SECURITY.md) instead - those should be reported privately, not in a public issue.**

- type: textarea
id: what-happened
Expand All @@ -33,7 +33,7 @@ body:
id: minna-version
attributes:
label: Minna version
description: Found under Minna → About.
description: Found under Minna -> About.
placeholder: "0.13.1"
validations:
required: true
Expand Down Expand Up @@ -78,7 +78,7 @@ body:
attributes:
label: Logs
description: |
Minna logs to Console.app — filter by the Minna process. Paste anything relevant here.
Minna logs to Console.app - filter by the Minna process. Paste anything relevant here.

**Please review before pasting.** Logs may include file names or paths from your indexed documents. Redact anything you would rather not publish.
render: text
Expand Down
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ body:
id: contribution
attributes:
label: Would you be interested in implementing this?
description: Entirely optional — proposals are welcome without it.
description: Entirely optional - proposals are welcome without it.
options:
- label: I'd be willing to open a pull request for this
required: false
4 changes: 1 addition & 3 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
<!-- Edited by Claude Opus 5 (Anthropic) on 2026-08-13 -->

## What does this change?

<!-- Describe the change and, more importantly, why it's needed. If it fixes an open issue, write "Fixes #123" so GitHub links them. -->

## How was it tested?

<!-- What did you actually run? Manual steps are fine — say what you did. -->
<!-- What did you actually run? Manual steps are fine - say what you did. -->

## Checklist

Expand Down
12 changes: 6 additions & 6 deletions .github/review-guidelines.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@ Report only what a change actually warrants. A one-line bug fix should not attra

Minna is Apache-2.0 and commercially distributed, so licensing drift is a real cost rather than a formality. Flag a PR when:

- **A new third-party component is vendored into the repository** — a binary framework, a bundled model, copied source, an icon set, a font — and `NOTICE` is not updated to record it. Vendored code carries its own license, and most licenses require the notice travel with the code.
- **A new third-party component is vendored into the repository** - a binary framework, a bundled model, copied source, an icon set, a font - and `NOTICE` is not updated to record it. Vendored code carries its own license, and most licenses require the notice travel with the code.
- **Code is copied from an external source** (Stack Overflow, a blog, another project) without an attribution comment naming the source and its license. Stack Overflow answers are CC BY-SA, which is not Apache-2.0. See `Minna/objc/CatchException.m` for the expected form.
- **A new local Swift package is added** without an Apache-2.0 `LICENSE` file of its own.
- **A dependency is added whose license is not Apache-2.0-compatible.** MIT, BSD, and Apache-2.0 are fine. GPL, LGPL, AGPL, and source-available licenses (BUSL, SSPL, PolyForm) are not, and need a decision before merge.
- **New brand assets are added** — a logo, an app icon, a wordmark — and `TRADEMARK.md` still lists only the old ones. That file enumerates what a fork must replace, so it has to stay current or it stops being useful.
- **New brand assets are added** - a logo, an app icon, a wordmark - and `TRADEMARK.md` still lists only the old ones. That file enumerates what a fork must replace, so it has to stay current or it stops being useful.
- **The product or company name changes**, or a new name is introduced, without `TRADEMARK.md` and `NOTICE` following.
- **`LICENSE` is edited.** It is verbatim canonical Apache-2.0 and should not be modified. The same goes for `Frameworks/Sparkle.framework/LICENSE` and `CODE_OF_CONDUCT.md`, which are verbatim third-party text.
- **A copyright header is removed or reassigned.** Attribution gets added alongside, never replaced.
Expand All @@ -27,7 +27,7 @@ Minna is Apache-2.0 and commercially distributed, so licensing drift is a real c
- `Config.xcconfig` must keep every value **blank**. It is committed, and a populated value there ships credentials to everyone. Real values go only in `Config.local.xcconfig`.
- New telemetry or network calls must fail closed when unconfigured, matching `BuildConfiguration.swift`: absent configuration means the feature is off, not that it falls back to a default endpoint.
- Any new network destination must be added to the list in `SECURITY.md`. That list is a promise to users about what leaves their machine, and an undocumented endpoint makes it false.
- Watch for secrets passed as command-line arguments in scripts and workflows — they leak into process listings and logs. Use environment variables.
- Watch for secrets passed as command-line arguments in scripts and workflows - they leak into process listings and logs. Use environment variables.
- GitHub Actions workflows that consume secrets must stay gated to trusted actors, and must not switch from `pull_request` to `pull_request_target`, which would expose secrets to fork code.

## Privacy
Expand All @@ -53,7 +53,7 @@ Flag when:

- Every user-facing change needs an entry under `## [Unreleased]` in `CHANGELOG.md`, in Keep a Changelog format.
- Entries should be written for a Minna user, not a developer reading the diff. "Fixed a crash when opening a malformed database" is right; "Fixed nil unwrap in IrisDBController" is not.
- Internal refactors with no user-visible effect don't need one — don't insist.
- Internal refactors with no user-visible effect don't need one - don't insist.

## Agent attribution

Expand All @@ -67,7 +67,7 @@ Per `AGENTS.md`, AI-authored work identifies itself. Flag when:

## Formatting

- Prose must not be hard wrapped — paragraphs, comments, doc comments, and commit bodies are single continuous lines. The exception is verbatim external text, where the original wrapping is preserved.
- Prose must not be hard wrapped - paragraphs, comments, doc comments, and commit bodies are single continuous lines. The exception is verbatim external text, where the original wrapping is preserved.
- Match the surrounding code's style. SwiftLint and SwiftFormat cover the rest.
- Use `SFSafeSymbols` (`systemSymbol:`) rather than `Image(systemName:)`.

Expand All @@ -80,4 +80,4 @@ Per `AGENTS.md`, AI-authored work identifies itself. Flag when:

## Extending this file

Add a section when a class of mistake becomes worth catching automatically. Keep each item concrete enough to check against a diff — "flag when X changes but Y doesn't" is actionable; "ensure good architecture" is not. Sections are independent, so new feature areas can be appended without disturbing what's here.
Add a section when a class of mistake becomes worth catching automatically. Keep each item concrete enough to check against a diff - "flag when X changes but Y doesn't" is actionable; "ensure good architecture" is not. Sections are independent, so new feature areas can be appended without disturbing what's here.
6 changes: 3 additions & 3 deletions .github/workflows/claude-code-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ on:

jobs:
claude-review:
# Restricted to an explicit allowlist of logins, currently just @ActuallyTaylor, since this job spends CLAUDE_CODE_OAUTH_TOKEN. This is a hardcoded login check rather than a permission or role check, so it does not widen automatically when a collaborator is added — extend the condition below to grant access.
# Restricted to an explicit allowlist of logins, currently just @ActuallyTaylor, since this job spends CLAUDE_CODE_OAUTH_TOKEN. This is a hardcoded login check rather than a permission or role check, so it does not widen automatically when a collaborator is added - extend the condition below to grant access.
#
# NOTE: this workflow uses `pull_request` rather than `pull_request_target`, which is the safe choice — a pull request from a fork runs without access to repository secrets. The consequence is that this job cannot review fork pull requests at all, and will simply not run on them. That is expected behaviour, not a misconfiguration. Switching to `pull_request_target` to "fix" it would expose secrets to untrusted code from forks.
# NOTE: this workflow uses `pull_request` rather than `pull_request_target`, which is the safe choice - a pull request from a fork runs without access to repository secrets. The consequence is that this job cannot review fork pull requests at all, and will simply not run on them. That is expected behaviour, not a misconfiguration. Switching to `pull_request_target` to "fix" it would expose secrets to untrusted code from forks.
if: github.actor == 'ActuallyTaylor'

runs-on: ubuntu-latest
Expand Down Expand Up @@ -43,7 +43,7 @@ jobs:

Additionally, read `.github/review-guidelines.md` and review this pull request against the project-specific criteria it defines. They cover licensing and the currency of NOTICE and TRADEMARK.md, secrets and build configuration, Minna's privacy guarantees, documentation drift, CHANGELOG entries, agent attribution, and release integrity.

Apply those criteria only where the diff actually warrants it — a small fix should not attract commentary on sections it does not touch. Where a guideline is violated, name the specific file that needs updating and why.
Apply those criteria only where the diff actually warrants it - a small fix should not attract commentary on sections it does not touch. Where a guideline is violated, name the specific file that needs updating and why.
# See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
# or https://code.claude.com/docs/en/cli-reference for available options

10 changes: 5 additions & 5 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Agent instructions

These instructions apply to **every AI coding agent** working in this repository — OpenAI Codex, Claude Code, Cursor, GitHub Copilot, Gemini, Jules, or anything else. Wherever the rules below say "you", they mean whichever agent is reading them.
These instructions apply to **every AI coding agent** working in this repository - OpenAI Codex, Claude Code, Cursor, GitHub Copilot, Gemini, Jules, or anything else. Wherever the rules below say "you", they mean whichever agent is reading them.

`AGENTS.md` is the canonical file. `CLAUDE.md` is a symlink to it, because Claude Code looks for that filename — so there is exactly one copy of these instructions and it cannot drift. Edit `AGENTS.md`; never replace the symlink with a real file.
`AGENTS.md` is the canonical file. `CLAUDE.md` is a symlink to it, because Claude Code looks for that filename - so there is exactly one copy of these instructions and it cannot drift. Edit `AGENTS.md`; never replace the symlink with a real file.

## Attribution

Expand All @@ -15,7 +15,7 @@ Examples of well-formed identities:
- `GPT-5 Codex (OpenAI)`
- `Claude Opus 4.8 (Anthropic)`
- `Gemini 2.5 Pro (Google)`
- `Cursor Composer (Anthropic Claude Sonnet 4.6)` — name the harness and the underlying model when they differ and you know both
- `Cursor Composer (Anthropic Claude Sonnet 4.6)` - name the harness and the underlying model when they differ and you know both

### File-level attribution

Expand Down Expand Up @@ -56,13 +56,13 @@ Co-Authored-By: GPT-5 Codex (OpenAI) <noreply@openai.com>
Co-Authored-By: Claude Opus 4.8 (Anthropic) <noreply@anthropic.com>
```

Use a `noreply` address for your vendor. If you don't know one, `agent@noreply.invalid` is fine — the name matters more than the address. This makes AI-authored work visible in `git log`, `git shortlog`, and the GitHub contributors view: the same tracking the file-level and doc-comment rules provide, extended to history.
Use a `noreply` address for your vendor. If you don't know one, `agent@noreply.invalid` is fine - the name matters more than the address. This makes AI-authored work visible in `git log`, `git shortlog`, and the GitHub contributors view: the same tracking the file-level and doc-comment rules provide, extended to history.

Note that contributions to this repository also require a DCO sign-off (`git commit -s`). The sign-off belongs to the **human** directing the work, who takes responsibility for the contribution; your co-author trailer is separate and additional. Never add a `Signed-off-by` line for yourself.

### Guidelines

- Keep attribution concise — a single line is enough.
- Keep attribution concise - a single line is enough.
- Don't overwrite or remove attribution from another author, human or agent; add yours alongside.
- Only attribute files you actually changed in the current task.
- If a file already carries your attribution from a previous session, update the date rather than adding a second line.
Expand Down
14 changes: 7 additions & 7 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

Thanks for your interest in Minna. This document covers how to build the project, what we expect in a pull request, and how contributions are licensed.

Minna is a commercial product published as open source so that anyone can audit how it handles your data. Contributions are welcome, and so is scrutiny — if you find something in the privacy or security behavior that looks wrong, that is a particularly valuable thing to report.
Minna is a commercial product published as open source so that anyone can audit how it handles your data. Contributions are welcome, and so is scrutiny - if you find something in the privacy or security behavior that looks wrong, that is a particularly valuable thing to report.

## Getting set up

Expand Down Expand Up @@ -43,7 +43,7 @@ If you need to set a signing team or your own telemetry endpoints:
cp Config.local.example.xcconfig Config.local.xcconfig
```

Fill in what you need. `Config.local.xcconfig` is gitignored and is picked up automatically. Note that xcconfig treats `//` as a comment, so URL values are stored without their scheme — the file explains this where it matters.
Fill in what you need. `Config.local.xcconfig` is gitignored and is picked up automatically. Note that xcconfig treats `//` as a comment, so URL values are stored without their scheme - the file explains this where it matters.

### Tests

Expand All @@ -61,14 +61,14 @@ The project uses SwiftLint and SwiftFormat, configured in `.swiftlint.yml` and `
A few conventions worth knowing:

- Use `SFSafeSymbols` (`systemSymbol:`) rather than stringly-typed `Image(systemName:)`. There is a custom lint rule enforcing this.
- Swift 6 language mode is on. Concurrency warnings are errors in practice — please don't silence them with `@unchecked Sendable` without a comment explaining why it is actually safe.
- Swift 6 language mode is on. Concurrency warnings are errors in practice - please don't silence them with `@unchecked Sendable` without a comment explaining why it is actually safe.
- Don't hard wrap prose. Write comments and documentation as continuous lines and let your editor soft wrap them, so that editing a sentence doesn't reflow and touch every line after it in the diff.

## Pull requests

1. **Open an issue first for anything substantial.** Small fixes can go straight to a PR, but for a feature or refactor it saves everyone time to agree on the approach before you write it.
2. **Keep PRs focused.** One logical change per pull request.
3. **Update `CHANGELOG.md`.** Every user-facing change needs an entry under the `## [Unreleased]` heading, in the existing [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) format — `### Added`, `### Fixed`, `### Changed`, and so on. Write it for a Minna user, not for a developer reading the diff. Internal refactors with no user-visible effect don't need an entry.
3. **Update `CHANGELOG.md`.** Every user-facing change needs an entry under the `## [Unreleased]` heading, in the existing [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) format - `### Added`, `### Fixed`, `### Changed`, and so on. Write it for a Minna user, not for a developer reading the diff. Internal refactors with no user-visible effect don't need an entry.
4. **Sign off your commits** (see below).
5. **Describe what you changed and why.** The PR template will prompt you.

Expand All @@ -92,13 +92,13 @@ Use your real name and an email you can be reached at. If you forget, amend with

Minna is licensed under the [Apache License, Version 2.0](LICENSE). By contributing, you agree that your contribution is licensed under the same terms. Apache-2.0 includes an express patent grant, which protects both you and other users of the project.

Note that the Apache license covers the code only. The Minna name and marks are not licensed with it — see [TRADEMARK.md](TRADEMARK.md).
Note that the Apache license covers the code only. The Minna name and marks are not licensed with it - see [TRADEMARK.md](TRADEMARK.md).

### AI-assisted contributions

These are fine, and Minna's own history includes them. If you use an AI coding agent, please say so in the pull request, and note that you remain responsible for the correctness and licensing of what you submit — review it as you would your own code.
These are fine, and Minna's own history includes them. If you use an AI coding agent, please say so in the pull request, and note that you remain responsible for the correctness and licensing of what you submit - review it as you would your own code.

This repository asks agents to identify themselves in the work they produce: a comment in files they create or meaningfully edit, an attribution line in doc comments they write, and a `Co-Authored-By` trailer on commits they author. The instructions are in [AGENTS.md](AGENTS.md), symlinked as `CLAUDE.md` for tools that look for that filename. They apply to any agent — Codex, Claude, Cursor, Copilot, Gemini, or otherwise.
This repository asks agents to identify themselves in the work they produce: a comment in files they create or meaningfully edit, an attribution line in doc comments they write, and a `Co-Authored-By` trailer on commits they author. The instructions are in [AGENTS.md](AGENTS.md), symlinked as `CLAUDE.md` for tools that look for that filename. They apply to any agent - Codex, Claude, Cursor, Copilot, Gemini, or otherwise.

The DCO sign-off is separate and always belongs to **you**, the human submitting the work. An agent's co-author trailer does not substitute for it.

Expand Down
2 changes: 2 additions & 0 deletions Minna/Database/FrontendDatabase.swift
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,15 @@ class FrontendDatabase: Database {

let modelConfiguration = ModelConfiguration(schema: Schema.minnaSchema)


// Edited by Claude Sonnet 4.6 (Anthropic) on 2026-08-13
do {
modelContainer = try ModelContainer(
for: Schema.minnaSchema,
migrationPlan: DatabaseMigrationPlan.self,
configurations: modelConfiguration
)

fileDescriptionWriter = FileDescriptionWriter(modelContainer: modelContainer)
try populateStartupData()
try? sendAnalytics()
Expand Down
Loading
Loading