Stop tracking .memory, .qlty and .quality
The three directories stay on disk but are git-ignored from now on, so they no longer appear in the remote repository. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
225c7e7 parent: 45c23b4 modified
.gitignore +5 -0 | @@ -4,3 +4,8 @@ tmp | ||
| 4 | 4 | mm |
| 5 | 5 | .mm/ |
| 6 | 6 | blog |
| 7 | +ebook | |
| 8 | +sandboxes | |
| 9 | +.memory | |
| 10 | +.qlty | |
| 11 | +.quality | |
| @@ -4,3 +4,8 @@ tmp | |||
| 4 | mm | 4 | mm |
| 5 | .mm/ | 5 | .mm/ |
| 6 | blog | 6 | blog |
| 7 | +ebook | ||
| 8 | +sandboxes | ||
| 9 | +.memory | ||
| 10 | +.qlty | ||
| 11 | +.quality | ||
deleted
.memory/README.md +0 -11 | deleted file mode 100644 | ||
| @@ -1,11 +0,0 @@ | ||
| 1 | -# .memory — project record for whoever continues building mini-me | |
| 2 | - | |
| 3 | -Read this directory before doing anything else in a session. | |
| 4 | - | |
| 5 | -| File | What it is | | |
| 6 | -|------|------------| | |
| 7 | -| `summary.md` | Snapshot of the project as it is now: architecture, decisions in force, real commands. Edited in place, never regenerated. | | |
| 8 | -| `history.md` | One dated entry per session, appended at the end, never rewritten. | | |
| 9 | -| `handoffs/YYYY-MM-DD-<slug>.md` | Where a session stopped: work in flight, next steps, traps. | | |
| 10 | - | |
| 11 | -`docs/` is for people who use `mm`; this directory is for people who build it. | |
| deleted file mode 100644 | |||
| @@ -1,11 +0,0 @@ | |||
| 1 | -# .memory — project record for whoever continues building mini-me | ||
| 2 | - | ||
| 3 | -Read this directory before doing anything else in a session. | ||
| 4 | - | ||
| 5 | -| File | What it is | | ||
| 6 | -|------|------------| | ||
| 7 | -| `summary.md` | Snapshot of the project as it is now: architecture, decisions in force, real commands. Edited in place, never regenerated. | | ||
| 8 | -| `history.md` | One dated entry per session, appended at the end, never rewritten. | | ||
| 9 | -| `handoffs/YYYY-MM-DD-<slug>.md` | Where a session stopped: work in flight, next steps, traps. | | ||
| 10 | - | ||
| 11 | -`docs/` is for people who use `mm`; this directory is for people who build it. | ||
deleted
.memory/handoffs/2026-09-15-diataxis-docs.md +0 -50 | deleted file mode 100644 | ||
| @@ -1,50 +0,0 @@ | ||
| 1 | -# Handoff — 2026-09-15 — Diátaxis documentation bootstrap (agent "riker") | |
| 2 | - | |
| 3 | -## Where it stopped | |
| 4 | - | |
| 5 | -`docs/` exists with a complete bilingual four-quadrant structure (`docs/en/`, `docs/fr/`, identical file names). Every page is "complete, not finished": usable now, open to growth. All relative links resolve (checked with a shell loop over `](…)` targets). Nothing committed — the whole repository is untracked apart from two old commits. | |
| 6 | - | |
| 7 | -## Filing plan that was applied (compass) | |
| 8 | - | |
| 9 | -| Topic | Quadrant | File (both languages) | | |
| 10 | -|-------|----------|-----------------------| | |
| 11 | -| First session with DMR | Tutorial | `tutorials/getting-started.md` | | |
| 12 | -| Run on llama.cpp | How-to | `how-to/run-with-llama-cpp.md` | | |
| 13 | -| Host in an editor (ACP/Zed) | How-to | `how-to/use-from-an-editor.md` | | |
| 14 | -| Add a skill | How-to | `how-to/add-a-skill.md` | | |
| 15 | -| Long session inside the window | How-to | `how-to/manage-the-context-window.md` | | |
| 16 | -| Start a new session (`/new`) | How-to | `how-to/start-a-new-session.md` — written by the other agent (bob) | | |
| 17 | -| CLI flags, env vars, banner, exit codes | Reference | `reference/cli.md` | | |
| 18 | -| Slash commands and keys | Reference | `reference/slash-commands.md` — bob edited the `/new` row after me | | |
| 19 | -| YAML keys, defaults, validation errors | Reference | `reference/configuration.md` | | |
| 20 | -| Built-in tools | Reference | `reference/tools.md` | | |
| 21 | -| Skill file format | Reference | `reference/skill-format.md` | | |
| 22 | -| ACP surface | Reference | `reference/acp.md` | | |
| 23 | -| One loop, two front ends | Explanation | `explanation/architecture.md` | | |
| 24 | -| Providers | Explanation | `explanation/providers.md` | | |
| 25 | -| Context compression | Explanation | `explanation/context-compression.md` | | |
| 26 | - | |
| 27 | -The skill's mandatory language question was not asked (user unavailable); "Both" was taken from the methodical-dev convention. If the user wants a single language, delete the other tree and the selector in `docs/README.md`. | |
| 28 | - | |
| 29 | -## Traps found (documented, not fixed — no Go changes were in my scope) | |
| 30 | - | |
| 31 | -1. **Shipped skills are invisible.** `skills.List` globs `<skillsDir>/*.md`; the examples are `skills/<name>/SKILL.md`. Banner shows `skills: 0`, `read_skill` is never declared. Either flatten the files or teach the loader to read `*/SKILL.md`. The docs describe the current behaviour and tell the user to flatten. | |
| 32 | -2. **`go test ./...` fails** in `mm/internal/skills`: `TestShippedSkillsHaveDescriptions` hard-codes `../../../demo/skills`, a path from the project this code was extracted from. Fix the path (and the layout above) or the quality gate will never be green. | |
| 33 | -3. The tutorial's banner line was captured verbatim from a real run; it now includes `"/new" to start a new session.` because bob changed `agent.go`. If the banner text changes again, update both tutorials. | |
| 34 | -4. `agent.yaml` calls the agent "Bob", ACP `agentInfo.name` is `bob` / version `0.11.0`, the binary is `mm`. The docs use `mm` for the binary and quote the ACP values as-is. | |
| 35 | - | |
| 36 | -## Not verified | |
| 37 | - | |
| 38 | -- No model server in the sandbox: step 3 of the tutorial (a real generation) was written from the code paths, not observed. The banner and `-h` output were observed. | |
| 39 | -- `docs/diagrams/packages.drawio` was created by bob; I linked it from both indexes and both architecture pages without validating its content. | |
| 40 | - | |
| 41 | -## Suggested next increments | |
| 42 | - | |
| 43 | -- A how-to for `editTools: false` (bash-only A/B mode) once someone has actually run it. | |
| 44 | -- A reference page for the engine's runtime messages (`[watchdog: …]`, `Retrying without streaming`) — currently only mentioned in passing. | |
| 45 | -- Explanation of the loop detector once its thresholds (history 10, threshold 3, set in `main.go`) are considered stable. | |
| 46 | -- bob updated `reference/slash-commands.md` and `reference/acp.md` in both languages for `/new` (row, ACP section, `available_commands_update`) after I wrote them; at the end of my session they were consistent with the code. Re-check only if `/new` changes again. | |
| 47 | - | |
| 48 | -## Addendum (same day, orchestrator) | |
| 49 | - | |
| 50 | -The Zed snippet in `how-to/use-from-an-editor.md` (EN + FR) was missing `"type": "custom"`; the user confirmed Zed needs it. Fixed in both pages. Any future editor how-to must include that key. | |
| deleted file mode 100644 | |||
| @@ -1,50 +0,0 @@ | |||
| 1 | -# Handoff — 2026-09-15 — Diátaxis documentation bootstrap (agent "riker") | ||
| 2 | - | ||
| 3 | -## Where it stopped | ||
| 4 | - | ||
| 5 | -`docs/` exists with a complete bilingual four-quadrant structure (`docs/en/`, `docs/fr/`, identical file names). Every page is "complete, not finished": usable now, open to growth. All relative links resolve (checked with a shell loop over `](…)` targets). Nothing committed — the whole repository is untracked apart from two old commits. | ||
| 6 | - | ||
| 7 | -## Filing plan that was applied (compass) | ||
| 8 | - | ||
| 9 | -| Topic | Quadrant | File (both languages) | | ||
| 10 | -|-------|----------|-----------------------| | ||
| 11 | -| First session with DMR | Tutorial | `tutorials/getting-started.md` | | ||
| 12 | -| Run on llama.cpp | How-to | `how-to/run-with-llama-cpp.md` | | ||
| 13 | -| Host in an editor (ACP/Zed) | How-to | `how-to/use-from-an-editor.md` | | ||
| 14 | -| Add a skill | How-to | `how-to/add-a-skill.md` | | ||
| 15 | -| Long session inside the window | How-to | `how-to/manage-the-context-window.md` | | ||
| 16 | -| Start a new session (`/new`) | How-to | `how-to/start-a-new-session.md` — written by the other agent (bob) | | ||
| 17 | -| CLI flags, env vars, banner, exit codes | Reference | `reference/cli.md` | | ||
| 18 | -| Slash commands and keys | Reference | `reference/slash-commands.md` — bob edited the `/new` row after me | | ||
| 19 | -| YAML keys, defaults, validation errors | Reference | `reference/configuration.md` | | ||
| 20 | -| Built-in tools | Reference | `reference/tools.md` | | ||
| 21 | -| Skill file format | Reference | `reference/skill-format.md` | | ||
| 22 | -| ACP surface | Reference | `reference/acp.md` | | ||
| 23 | -| One loop, two front ends | Explanation | `explanation/architecture.md` | | ||
| 24 | -| Providers | Explanation | `explanation/providers.md` | | ||
| 25 | -| Context compression | Explanation | `explanation/context-compression.md` | | ||
| 26 | - | ||
| 27 | -The skill's mandatory language question was not asked (user unavailable); "Both" was taken from the methodical-dev convention. If the user wants a single language, delete the other tree and the selector in `docs/README.md`. | ||
| 28 | - | ||
| 29 | -## Traps found (documented, not fixed — no Go changes were in my scope) | ||
| 30 | - | ||
| 31 | -1. **Shipped skills are invisible.** `skills.List` globs `<skillsDir>/*.md`; the examples are `skills/<name>/SKILL.md`. Banner shows `skills: 0`, `read_skill` is never declared. Either flatten the files or teach the loader to read `*/SKILL.md`. The docs describe the current behaviour and tell the user to flatten. | ||
| 32 | -2. **`go test ./...` fails** in `mm/internal/skills`: `TestShippedSkillsHaveDescriptions` hard-codes `../../../demo/skills`, a path from the project this code was extracted from. Fix the path (and the layout above) or the quality gate will never be green. | ||
| 33 | -3. The tutorial's banner line was captured verbatim from a real run; it now includes `"/new" to start a new session.` because bob changed `agent.go`. If the banner text changes again, update both tutorials. | ||
| 34 | -4. `agent.yaml` calls the agent "Bob", ACP `agentInfo.name` is `bob` / version `0.11.0`, the binary is `mm`. The docs use `mm` for the binary and quote the ACP values as-is. | ||
| 35 | - | ||
| 36 | -## Not verified | ||
| 37 | - | ||
| 38 | -- No model server in the sandbox: step 3 of the tutorial (a real generation) was written from the code paths, not observed. The banner and `-h` output were observed. | ||
| 39 | -- `docs/diagrams/packages.drawio` was created by bob; I linked it from both indexes and both architecture pages without validating its content. | ||
| 40 | - | ||
| 41 | -## Suggested next increments | ||
| 42 | - | ||
| 43 | -- A how-to for `editTools: false` (bash-only A/B mode) once someone has actually run it. | ||
| 44 | -- A reference page for the engine's runtime messages (`[watchdog: …]`, `Retrying without streaming`) — currently only mentioned in passing. | ||
| 45 | -- Explanation of the loop detector once its thresholds (history 10, threshold 3, set in `main.go`) are considered stable. | ||
| 46 | -- bob updated `reference/slash-commands.md` and `reference/acp.md` in both languages for `/new` (row, ACP section, `available_commands_update`) after I wrote them; at the end of my session they were consistent with the code. Re-check only if `/new` changes again. | ||
| 47 | - | ||
| 48 | -## Addendum (same day, orchestrator) | ||
| 49 | - | ||
| 50 | -The Zed snippet in `how-to/use-from-an-editor.md` (EN + FR) was missing `"type": "custom"`; the user confirmed Zed needs it. Fixed in both pages. Any future editor how-to must include that key. | ||
deleted
.memory/handoffs/2026-09-15-new-command.md +0 -41 | deleted file mode 100644 | ||
| @@ -1,41 +0,0 @@ | ||
| 1 | -# Handoff — 2026-09-15 — `/new` slash command | |
| 2 | - | |
| 3 | -## State | |
| 4 | - | |
| 5 | -`/new` works in both front ends and is documented in EN and FR. `go build`, `go vet` and every test pass except one pre-existing failure (below). The quality gate is configured (`.qlty/qlty.toml`, exclusions `kits/**` and `tmp/**`) and FAILS on pre-existing debt only. `.memory/` was created by this session. Nothing is committed: all of `internal/`, `main.go`, `go.mod`, `docs/`, `.qlty/`, `.quality/`, `.memory/` are untracked (only `README.md`, `git.sh`, `.tickets/*.yaml`, `.vscode/` are tracked). | |
| 6 | - | |
| 7 | -## In flight | |
| 8 | - | |
| 9 | -Nothing on the `/new` feature itself. Agent "riker" was writing `docs/` at the same time; the pages this session edited in place (`docs/{en,fr}/reference/slash-commands.md`, `acp.md`, both `README.md`, both `explanation/architecture.md`) may be rewritten by riker — check that the `/new` rows, the "ACP mode" paragraph, the "Available commands" section and the `packages.drawio` link survived. | |
| 10 | - | |
| 11 | -## Next steps | |
| 12 | - | |
| 13 | -1. Decide the pre-existing test: `internal/skills/skills_test.go` `TestShippedSkillsHaveDescriptions` looks for `../../../demo/skills`; this repo has `./skills`. Changing the path to `../../skills` is a one-line fix, left to the user. | |
| 14 | -2. Decide the quality debt: bump `go.mod` `go 1.25.0` → `1.26` (clears 47 of 55 osv findings), `go get -u` the indirect deps flagged (`jsonparser`, `otel`, `x/sys`), fix the 12 `errcheck` sites, and refactor `agent.Run` (complexity 121) — the last one needs tests around the REPL first. | |
| 15 | -3. Verify in a real Zed that the slash menu shows `/new` (the notification is sent before the `session/new` response). | |
| 16 | -4. Commit: propose one commit for code + tests + docs + `.qlty/` + `.quality/` + `.memory/` (see history entry). Not done — the skill forbids committing without an explicit request. | |
| 17 | - | |
| 18 | -## Open questions / blockers | |
| 19 | - | |
| 20 | -- Should `/compact` also be exposed over ACP? Not asked; the code deliberately advertises only what `session/prompt` intercepts. | |
| 21 | -- Should `/new` over ACP also drop "allow always" grants? This session chose to keep them (same session id, same promise to the user). | |
| 22 | - | |
| 23 | -## Watch out for | |
| 24 | - | |
| 25 | -- `qlty init` only looks at git-tracked files: it detected no Go here and enabled no Go plugin. The Go plugins were added by hand in `.qlty/qlty.toml`; do not re-run `qlty init`. | |
| 26 | -- qlty's default `exclude_patterns` contains `**/config/**`, which would silently hide `internal/config`. It was removed from the list; do not paste the defaults back. | |
| 27 | -- Inside `internal/acp`, `mm/internal/session` is imported as `history` because the package has its own `session` struct. | |
| 28 | -- Piped stdin to the REPL loses lines after the first (the `bufio.Reader` is re-created per iteration). Use the scripted JSON-RPC client approach (python `subprocess`, one JSON object per line) to smoke-test ACP, and expect only the first line of a piped REPL session to be read. | |
| 29 | -- Run Go through `bash -l -c "..."` when `go` is not on `PATH`. | |
| 30 | - | |
| 31 | -## Addendum (same day, orchestrator) — step 3 done, root cause found | |
| 32 | - | |
| 33 | -The user tried it in Zed: "Available commands for mini-me: none". Cause: the notification went out before the `session/new` response, and Zed drops updates for a session id it does not know yet. Fixed by a `responseWriter` wrapper around the SDK's output that fires the notification after the response line is written (see `internal/acp/acp.go`, history entry of the same day). Verified on the wire with the real binary and with a pipe-driven test; still to be confirmed by the user inside Zed. If Zed still shows no commands, the next suspect is the `initialize` exchange (Zed may require `protocolVersion` ≥ 1 and reads `agentCapabilities`), not the ordering. | |
| 34 | - | |
| 35 | -## Addendum 2 (same day, orchestrator) — `/compact` and `/abort` over ACP | |
| 36 | - | |
| 37 | -User confirmed `/new` appears in Zed after the ordering fix. `/compact` and `/abort` were added the same way (history entry of the same day). Left for the user to confirm in Zed: the two new menu entries, and `/abort` while a generation runs — Zed may not send a prompt during a running turn, in which case `/abort` will only ever say "No generation in progress" and the stop button remains the way to cancel. If so, the honest move is to drop `/abort` from `availableCommands()` rather than advertise a no-op. | |
| 38 | - | |
| 39 | -## Addendum 3 — trap: sandbox builds clobber the Mac binary | |
| 40 | - | |
| 41 | -`go build -o mm .` in the sandbox writes a linux/arm64 ELF at the repo's `./mm`, the same path the user's `install.sh` builds and copies from. Do not run `install.sh` from the sandbox, and tell the user to rebuild natively after sandbox builds. Separately, `install.sh` copies over the installed binary in place; on Apple Silicon that can yield `Killed: 9` until the target is removed first — fix pending the user's go-ahead. | |
| deleted file mode 100644 | |||
| @@ -1,41 +0,0 @@ | |||
| 1 | -# Handoff — 2026-09-15 — `/new` slash command | ||
| 2 | - | ||
| 3 | -## State | ||
| 4 | - | ||
| 5 | -`/new` works in both front ends and is documented in EN and FR. `go build`, `go vet` and every test pass except one pre-existing failure (below). The quality gate is configured (`.qlty/qlty.toml`, exclusions `kits/**` and `tmp/**`) and FAILS on pre-existing debt only. `.memory/` was created by this session. Nothing is committed: all of `internal/`, `main.go`, `go.mod`, `docs/`, `.qlty/`, `.quality/`, `.memory/` are untracked (only `README.md`, `git.sh`, `.tickets/*.yaml`, `.vscode/` are tracked). | ||
| 6 | - | ||
| 7 | -## In flight | ||
| 8 | - | ||
| 9 | -Nothing on the `/new` feature itself. Agent "riker" was writing `docs/` at the same time; the pages this session edited in place (`docs/{en,fr}/reference/slash-commands.md`, `acp.md`, both `README.md`, both `explanation/architecture.md`) may be rewritten by riker — check that the `/new` rows, the "ACP mode" paragraph, the "Available commands" section and the `packages.drawio` link survived. | ||
| 10 | - | ||
| 11 | -## Next steps | ||
| 12 | - | ||
| 13 | -1. Decide the pre-existing test: `internal/skills/skills_test.go` `TestShippedSkillsHaveDescriptions` looks for `../../../demo/skills`; this repo has `./skills`. Changing the path to `../../skills` is a one-line fix, left to the user. | ||
| 14 | -2. Decide the quality debt: bump `go.mod` `go 1.25.0` → `1.26` (clears 47 of 55 osv findings), `go get -u` the indirect deps flagged (`jsonparser`, `otel`, `x/sys`), fix the 12 `errcheck` sites, and refactor `agent.Run` (complexity 121) — the last one needs tests around the REPL first. | ||
| 15 | -3. Verify in a real Zed that the slash menu shows `/new` (the notification is sent before the `session/new` response). | ||
| 16 | -4. Commit: propose one commit for code + tests + docs + `.qlty/` + `.quality/` + `.memory/` (see history entry). Not done — the skill forbids committing without an explicit request. | ||
| 17 | - | ||
| 18 | -## Open questions / blockers | ||
| 19 | - | ||
| 20 | -- Should `/compact` also be exposed over ACP? Not asked; the code deliberately advertises only what `session/prompt` intercepts. | ||
| 21 | -- Should `/new` over ACP also drop "allow always" grants? This session chose to keep them (same session id, same promise to the user). | ||
| 22 | - | ||
| 23 | -## Watch out for | ||
| 24 | - | ||
| 25 | -- `qlty init` only looks at git-tracked files: it detected no Go here and enabled no Go plugin. The Go plugins were added by hand in `.qlty/qlty.toml`; do not re-run `qlty init`. | ||
| 26 | -- qlty's default `exclude_patterns` contains `**/config/**`, which would silently hide `internal/config`. It was removed from the list; do not paste the defaults back. | ||
| 27 | -- Inside `internal/acp`, `mm/internal/session` is imported as `history` because the package has its own `session` struct. | ||
| 28 | -- Piped stdin to the REPL loses lines after the first (the `bufio.Reader` is re-created per iteration). Use the scripted JSON-RPC client approach (python `subprocess`, one JSON object per line) to smoke-test ACP, and expect only the first line of a piped REPL session to be read. | ||
| 29 | -- Run Go through `bash -l -c "..."` when `go` is not on `PATH`. | ||
| 30 | - | ||
| 31 | -## Addendum (same day, orchestrator) — step 3 done, root cause found | ||
| 32 | - | ||
| 33 | -The user tried it in Zed: "Available commands for mini-me: none". Cause: the notification went out before the `session/new` response, and Zed drops updates for a session id it does not know yet. Fixed by a `responseWriter` wrapper around the SDK's output that fires the notification after the response line is written (see `internal/acp/acp.go`, history entry of the same day). Verified on the wire with the real binary and with a pipe-driven test; still to be confirmed by the user inside Zed. If Zed still shows no commands, the next suspect is the `initialize` exchange (Zed may require `protocolVersion` ≥ 1 and reads `agentCapabilities`), not the ordering. | ||
| 34 | - | ||
| 35 | -## Addendum 2 (same day, orchestrator) — `/compact` and `/abort` over ACP | ||
| 36 | - | ||
| 37 | -User confirmed `/new` appears in Zed after the ordering fix. `/compact` and `/abort` were added the same way (history entry of the same day). Left for the user to confirm in Zed: the two new menu entries, and `/abort` while a generation runs — Zed may not send a prompt during a running turn, in which case `/abort` will only ever say "No generation in progress" and the stop button remains the way to cancel. If so, the honest move is to drop `/abort` from `availableCommands()` rather than advertise a no-op. | ||
| 38 | - | ||
| 39 | -## Addendum 3 — trap: sandbox builds clobber the Mac binary | ||
| 40 | - | ||
| 41 | -`go build -o mm .` in the sandbox writes a linux/arm64 ELF at the repo's `./mm`, the same path the user's `install.sh` builds and copies from. Do not run `install.sh` from the sandbox, and tell the user to rebuild natively after sandbox builds. Separately, `install.sh` copies over the installed binary in place; on Apple Silicon that can yield `Killed: 9` until the target is removed first — fix pending the user's go-ahead. | ||
deleted
.memory/handoffs/2026-09-15-skills-layout.md +0 -25 | deleted file mode 100644 | ||
| @@ -1,25 +0,0 @@ | ||
| 1 | -# Handoff — 2026-09-15 — skills layout and skillsDir resolution | |
| 2 | - | |
| 3 | -## Where it stopped | |
| 4 | - | |
| 5 | -Done and green: the loader accepts `<skillsDir>/<name>.md` and `<skillsDir>/<name>/SKILL.md`; a relative `skillsDir` is resolved from the directory `mm` is started in (terminal) or next to the config file (ACP with a config); the banner warns with the absolute path when nothing is found. `/abort` no longer exists over ACP (user's call: Escape in Zed already cancels). Nothing committed. | |
| 6 | - | |
| 7 | -## For the user to do on the Mac | |
| 8 | - | |
| 9 | -- `sudo rm /usr/local/bin/mm && ./install.sh` — remove-then-copy avoids the `Killed: 9` of an in-place `cp` on Apple Silicon (see history entry "mm killed"). | |
| 10 | -- Start `mm` from the repository root: the banner must say `skills: 3` and list `read_skill`. | |
| 11 | -- `agent.yaml` was renamed `agent.dmr.yaml`: a Zed `AGENT_CONFIG` still pointing at `agent.yaml` names a missing file, which is a hard config error. Point it at `agent.dmr.yaml` or `agent.llamacpp.yaml` (absolute path). | |
| 12 | - | |
| 13 | -## Traps | |
| 14 | - | |
| 15 | -- Never `go build -o mm .` from the sandbox: it clobbers the user's Mach-O at the same path. Build to `/tmp/…` for checks. | |
| 16 | -- `install.sh` still copies in place; making it `rm` first (or use `install`) is proposed, not applied. | |
| 17 | - | |
| 18 | -## Next increments (suggested) | |
| 19 | - | |
| 20 | -- In ACP mode without a config file, `skillsDir` follows the process cwd; using each session's `cwd` from `session/new` would let one `mm` serve several projects' skills. | |
| 21 | -- `install.sh`: remove the target before copying. | |
| 22 | - | |
| 23 | -## Addendum — `@path` notation (same day) | |
| 24 | - | |
| 25 | -Implemented in `internal/mention`, wired in both front ends, documented EN+FR (`how-to/attach-a-file.md`). Not verified: a real model turn reading the attached file (no server in the sandbox). Possible next steps if asked: quoted mentions for paths with spaces (`@"my file.md"`), a `@dir/` listing hint, or inlining small files when `editTools` is off. | |
| deleted file mode 100644 | |||
| @@ -1,25 +0,0 @@ | |||
| 1 | -# Handoff — 2026-09-15 — skills layout and skillsDir resolution | ||
| 2 | - | ||
| 3 | -## Where it stopped | ||
| 4 | - | ||
| 5 | -Done and green: the loader accepts `<skillsDir>/<name>.md` and `<skillsDir>/<name>/SKILL.md`; a relative `skillsDir` is resolved from the directory `mm` is started in (terminal) or next to the config file (ACP with a config); the banner warns with the absolute path when nothing is found. `/abort` no longer exists over ACP (user's call: Escape in Zed already cancels). Nothing committed. | ||
| 6 | - | ||
| 7 | -## For the user to do on the Mac | ||
| 8 | - | ||
| 9 | -- `sudo rm /usr/local/bin/mm && ./install.sh` — remove-then-copy avoids the `Killed: 9` of an in-place `cp` on Apple Silicon (see history entry "mm killed"). | ||
| 10 | -- Start `mm` from the repository root: the banner must say `skills: 3` and list `read_skill`. | ||
| 11 | -- `agent.yaml` was renamed `agent.dmr.yaml`: a Zed `AGENT_CONFIG` still pointing at `agent.yaml` names a missing file, which is a hard config error. Point it at `agent.dmr.yaml` or `agent.llamacpp.yaml` (absolute path). | ||
| 12 | - | ||
| 13 | -## Traps | ||
| 14 | - | ||
| 15 | -- Never `go build -o mm .` from the sandbox: it clobbers the user's Mach-O at the same path. Build to `/tmp/…` for checks. | ||
| 16 | -- `install.sh` still copies in place; making it `rm` first (or use `install`) is proposed, not applied. | ||
| 17 | - | ||
| 18 | -## Next increments (suggested) | ||
| 19 | - | ||
| 20 | -- In ACP mode without a config file, `skillsDir` follows the process cwd; using each session's `cwd` from `session/new` would let one `mm` serve several projects' skills. | ||
| 21 | -- `install.sh`: remove the target before copying. | ||
| 22 | - | ||
| 23 | -## Addendum — `@path` notation (same day) | ||
| 24 | - | ||
| 25 | -Implemented in `internal/mention`, wired in both front ends, documented EN+FR (`how-to/attach-a-file.md`). Not verified: a real model turn reading the attached file (no server in the sandbox). Possible next steps if asked: quoted mentions for paths with spaces (`@"my file.md"`), a `@dir/` listing hint, or inlining small files when `editTools` is off. | ||
deleted
.memory/handoffs/2026-09-16-blog-acp.md +0 -23 | deleted file mode 100644 | ||
| @@ -1,23 +0,0 @@ | ||
| 1 | -# Handoff — 2026-09-16 — blog articles on ACP (agent "milo") | |
| 2 | - | |
| 3 | -## Where it stopped | |
| 4 | - | |
| 5 | -Two French articles are complete in `blog/`, plus the tutorial's Go module in `blog/fake-agent/` (its own `go.mod`, so it is invisible to mini-me's build). Nothing committed. | |
| 6 | - | |
| 7 | -## Facts established (from the web, 2026-09-16) | |
| 8 | - | |
| 9 | -- ACP was created by Zed Industries, announced 2025-08-27 with Google (Gemini CLI as reference implementation); Claude Code beta in Zed on 2025-09-03; JetBrains announced co-development and support across its IDEs on 2025-10-06. Protocol version 1. Apache 2.0. Official SDKs: Rust, TypeScript, Kotlin, Java, Python; Go SDK (`coder/acp-go-sdk`) is community. | |
| 10 | -- The registry at agentclientprotocol.com lists ~40 agents and ~20 clients; both tables in article 1 are snapshots of it and say so. | |
| 11 | - | |
| 12 | -## Traps for the tutorial's readers (already in the article) | |
| 13 | - | |
| 14 | -- `available_commands_update` must be sent after the `session/new` response (Zed drops it otherwise); the tutorial uses `time.AfterFunc(50ms)` and points at mini-me's `responseWriter` for the robust version. | |
| 15 | -- Zed's `agent_servers` entry needs `"type": "custom"`. | |
| 16 | -- Keep stdin open (`sleep`) when piping JSON-RPC by hand. | |
| 17 | -- In acp-go-sdk v0.13.5, `LoadSession` is in a separate `AgentLoader` interface, not in `Agent`. | |
| 18 | - | |
| 19 | -## To double-check by the user | |
| 20 | - | |
| 21 | -- The agent/editor tables against the live registry before publishing. | |
| 22 | -- Rendering of the mermaid diagram on the target blog platform. | |
| 23 | -- Whether to publish `blog/fake-agent/go.sum` (generated in the sandbox). | |
| deleted file mode 100644 | |||
| @@ -1,23 +0,0 @@ | |||
| 1 | -# Handoff — 2026-09-16 — blog articles on ACP (agent "milo") | ||
| 2 | - | ||
| 3 | -## Where it stopped | ||
| 4 | - | ||
| 5 | -Two French articles are complete in `blog/`, plus the tutorial's Go module in `blog/fake-agent/` (its own `go.mod`, so it is invisible to mini-me's build). Nothing committed. | ||
| 6 | - | ||
| 7 | -## Facts established (from the web, 2026-09-16) | ||
| 8 | - | ||
| 9 | -- ACP was created by Zed Industries, announced 2025-08-27 with Google (Gemini CLI as reference implementation); Claude Code beta in Zed on 2025-09-03; JetBrains announced co-development and support across its IDEs on 2025-10-06. Protocol version 1. Apache 2.0. Official SDKs: Rust, TypeScript, Kotlin, Java, Python; Go SDK (`coder/acp-go-sdk`) is community. | ||
| 10 | -- The registry at agentclientprotocol.com lists ~40 agents and ~20 clients; both tables in article 1 are snapshots of it and say so. | ||
| 11 | - | ||
| 12 | -## Traps for the tutorial's readers (already in the article) | ||
| 13 | - | ||
| 14 | -- `available_commands_update` must be sent after the `session/new` response (Zed drops it otherwise); the tutorial uses `time.AfterFunc(50ms)` and points at mini-me's `responseWriter` for the robust version. | ||
| 15 | -- Zed's `agent_servers` entry needs `"type": "custom"`. | ||
| 16 | -- Keep stdin open (`sleep`) when piping JSON-RPC by hand. | ||
| 17 | -- In acp-go-sdk v0.13.5, `LoadSession` is in a separate `AgentLoader` interface, not in `Agent`. | ||
| 18 | - | ||
| 19 | -## To double-check by the user | ||
| 20 | - | ||
| 21 | -- The agent/editor tables against the live registry before publishing. | ||
| 22 | -- Rendering of the mermaid diagram on the target blog platform. | ||
| 23 | -- Whether to publish `blog/fake-agent/go.sum` (generated in the sandbox). | ||
deleted
.memory/handoffs/2026-09-16-context-compression-review.md +0 -17 | deleted file mode 100644 | ||
| @@ -1,17 +0,0 @@ | ||
| 1 | -# Handoff — 2026-09-16 — context compression review (agent "riker") | |
| 2 | - | |
| 3 | -## Where it stopped | |
| 4 | - | |
| 5 | -Read-only review; the result is the body of `.tickets/issues/0010-check-how-the-context-compression-is-working.yaml` (mechanism, triggers, defaults, before/after, estimate limits, failure paths, config table, gaps, doc check, cagent comparison). Nothing else was written. | |
| 6 | - | |
| 7 | -## Facts a future session should not re-derive | |
| 8 | - | |
| 9 | -- Automatic compaction runs only in `internal/agent/agent.go` (single `compact.Decide` call site). ACP has `/compact` only. | |
| 10 | -- `engine.Summarize` uses a watchdog of `2 × watchdogTimeout` (40 s default), `max_tokens = context.summaryMaxTokens`, and drops `parallel_tool_calls`. | |
| 11 | -- The summary pair is tagged `Metadata["compact"] = "summary"`; `compact.IsSummary` recognises it and a later compaction merges rather than re-summarises. | |
| 12 | - | |
| 13 | -## Open items (for the user to decide) | |
| 14 | - | |
| 15 | -1. Add automatic compaction to `acp.Prompt` (same rule as the REPL; helper `compactHistory` already exists in `internal/acp/acp.go`). | |
| 16 | -2. Fix the "before the first question" wording in `docs/{en,fr}/how-to/manage-the-context-window.md` and say in `explanation/context-compression.md` that the automatic trigger is terminal-only (until 1 is done). | |
| 17 | -3. Persistent sessions (bob, in flight): store the post-compaction history (rewrite, not append); decide how the summary pair is replayed on `session/load`. | |
| deleted file mode 100644 | |||
| @@ -1,17 +0,0 @@ | |||
| 1 | -# Handoff — 2026-09-16 — context compression review (agent "riker") | ||
| 2 | - | ||
| 3 | -## Where it stopped | ||
| 4 | - | ||
| 5 | -Read-only review; the result is the body of `.tickets/issues/0010-check-how-the-context-compression-is-working.yaml` (mechanism, triggers, defaults, before/after, estimate limits, failure paths, config table, gaps, doc check, cagent comparison). Nothing else was written. | ||
| 6 | - | ||
| 7 | -## Facts a future session should not re-derive | ||
| 8 | - | ||
| 9 | -- Automatic compaction runs only in `internal/agent/agent.go` (single `compact.Decide` call site). ACP has `/compact` only. | ||
| 10 | -- `engine.Summarize` uses a watchdog of `2 × watchdogTimeout` (40 s default), `max_tokens = context.summaryMaxTokens`, and drops `parallel_tool_calls`. | ||
| 11 | -- The summary pair is tagged `Metadata["compact"] = "summary"`; `compact.IsSummary` recognises it and a later compaction merges rather than re-summarises. | ||
| 12 | - | ||
| 13 | -## Open items (for the user to decide) | ||
| 14 | - | ||
| 15 | -1. Add automatic compaction to `acp.Prompt` (same rule as the REPL; helper `compactHistory` already exists in `internal/acp/acp.go`). | ||
| 16 | -2. Fix the "before the first question" wording in `docs/{en,fr}/how-to/manage-the-context-window.md` and say in `explanation/context-compression.md` that the automatic trigger is terminal-only (until 1 is done). | ||
| 17 | -3. Persistent sessions (bob, in flight): store the post-compaction history (rewrite, not append); decide how the summary pair is replayed on `session/load`. | ||
deleted
.memory/handoffs/2026-09-16-persistent-sessions.md +0 -28 | deleted file mode 100644 | ||
| @@ -1,28 +0,0 @@ | ||
| 1 | -# Handoff — 2026-09-16 — persistent per-project sessions | |
| 2 | - | |
| 3 | -## State | |
| 4 | - | |
| 5 | -Done and green (13 packages, `go test -race ./...`): `sessions.enabled`/`sessions.dir` in the YAML; `internal/store` files under `<project>/.mm/sessions/<id>.json`; terminal `/sessions`, `/resume [id]`, `/new` (new file); ACP `loadSession: true` + `session/load` replaying the whole conversation (tool calls as completed records, never re-run) before the response; `/new` over ACP archives the old conversation under a new id. Docs EN+FR, diagram, ticket 0008 updated. Nothing committed. | |
| 6 | - | |
| 7 | -## In flight | |
| 8 | - | |
| 9 | -Nothing. Feature complete pending the user's manual check. | |
| 10 | - | |
| 11 | -## Next steps | |
| 12 | - | |
| 13 | -1. User: rebuild natively on the Mac (`sudo rm /usr/local/bin/mm && ./install.sh`), set `sessions.enabled: true` in the YAML `AGENT_CONFIG` points at, open a thread in Zed, ask something, then **Reload Agent** — the thread must be rebuilt (question, tool calls, answers). Report what Zed shows if not. | |
| 14 | -2. User: decide whether the `.mm/` line added to this repo's `.gitignore` is wanted (it is, unless sessions should be versioned). | |
| 15 | -3. Optional: `blog/fake-agent/main.go` (user's new untracked dir) adds one smell to the gate; either exclude `blog/**` with the user's agreement or refactor `Prompt` there. | |
| 16 | - | |
| 17 | -## Open questions / blockers | |
| 18 | - | |
| 19 | -- Zed rendering of the replay is unverified (no Zed in the sandbox). If Zed shows an empty thread after reload, check the ACP logs for `[acp] session <id> loaded from …: N message(s) replayed`; if the line is there, the issue is on the rendering side (e.g. Zed needing `tool_call` before `tool_call_update` shapes — we send one `tool_call` with status completed, which the spec allows). | |
| 20 | -- Whether `/sessions` and `/resume` should also be offered over ACP (currently not: the editor lists its own threads). The store supports it if asked. | |
| 21 | - | |
| 22 | -## Watch out for | |
| 23 | - | |
| 24 | -- `sdk.AgentLoader` is a separate interface: `LoadSession` only gets routed because `*front` implements it (`var _ sdk.AgentLoader = (*front)(nil)` in `internal/acp/persist.go`). | |
| 25 | -- A `session/load` response carries no `sessionId`, so the `responseWriter` hook cannot order the commands notification after it; it is sent with the replay instead (accepted: the editor knows the id it asked for). | |
| 26 | -- The terminal `keeper` creates the file lazily (first save); ACP creates it at `session/new`. `hint()` counts stored files, `latestOther()` skips 0-turn sessions. | |
| 27 | -- Never `go build -o mm .` in the sandbox (`./mm` is the user's Mach-O); `/tmp/mm-linux` for checks. `/tmp/drive_sessions.py` is a reusable ACP driver (initialize, session/new, prompt, seeded session/load). | |
| 28 | -- `config.Cfg` is a package global: tests that toggle `Sessions` must restore it (see `withSessions` helpers in `internal/acp/persist_test.go` and `internal/agent/persist_test.go`). | |
| deleted file mode 100644 | |||
| @@ -1,28 +0,0 @@ | |||
| 1 | -# Handoff — 2026-09-16 — persistent per-project sessions | ||
| 2 | - | ||
| 3 | -## State | ||
| 4 | - | ||
| 5 | -Done and green (13 packages, `go test -race ./...`): `sessions.enabled`/`sessions.dir` in the YAML; `internal/store` files under `<project>/.mm/sessions/<id>.json`; terminal `/sessions`, `/resume [id]`, `/new` (new file); ACP `loadSession: true` + `session/load` replaying the whole conversation (tool calls as completed records, never re-run) before the response; `/new` over ACP archives the old conversation under a new id. Docs EN+FR, diagram, ticket 0008 updated. Nothing committed. | ||
| 6 | - | ||
| 7 | -## In flight | ||
| 8 | - | ||
| 9 | -Nothing. Feature complete pending the user's manual check. | ||
| 10 | - | ||
| 11 | -## Next steps | ||
| 12 | - | ||
| 13 | -1. User: rebuild natively on the Mac (`sudo rm /usr/local/bin/mm && ./install.sh`), set `sessions.enabled: true` in the YAML `AGENT_CONFIG` points at, open a thread in Zed, ask something, then **Reload Agent** — the thread must be rebuilt (question, tool calls, answers). Report what Zed shows if not. | ||
| 14 | -2. User: decide whether the `.mm/` line added to this repo's `.gitignore` is wanted (it is, unless sessions should be versioned). | ||
| 15 | -3. Optional: `blog/fake-agent/main.go` (user's new untracked dir) adds one smell to the gate; either exclude `blog/**` with the user's agreement or refactor `Prompt` there. | ||
| 16 | - | ||
| 17 | -## Open questions / blockers | ||
| 18 | - | ||
| 19 | -- Zed rendering of the replay is unverified (no Zed in the sandbox). If Zed shows an empty thread after reload, check the ACP logs for `[acp] session <id> loaded from …: N message(s) replayed`; if the line is there, the issue is on the rendering side (e.g. Zed needing `tool_call` before `tool_call_update` shapes — we send one `tool_call` with status completed, which the spec allows). | ||
| 20 | -- Whether `/sessions` and `/resume` should also be offered over ACP (currently not: the editor lists its own threads). The store supports it if asked. | ||
| 21 | - | ||
| 22 | -## Watch out for | ||
| 23 | - | ||
| 24 | -- `sdk.AgentLoader` is a separate interface: `LoadSession` only gets routed because `*front` implements it (`var _ sdk.AgentLoader = (*front)(nil)` in `internal/acp/persist.go`). | ||
| 25 | -- A `session/load` response carries no `sessionId`, so the `responseWriter` hook cannot order the commands notification after it; it is sent with the replay instead (accepted: the editor knows the id it asked for). | ||
| 26 | -- The terminal `keeper` creates the file lazily (first save); ACP creates it at `session/new`. `hint()` counts stored files, `latestOther()` skips 0-turn sessions. | ||
| 27 | -- Never `go build -o mm .` in the sandbox (`./mm` is the user's Mach-O); `/tmp/mm-linux` for checks. `/tmp/drive_sessions.py` is a reusable ACP driver (initialize, session/new, prompt, seeded session/load). | ||
| 28 | -- `config.Cfg` is a package global: tests that toggle `Sessions` must restore it (see `withSessions` helpers in `internal/acp/persist_test.go` and `internal/agent/persist_test.go`). | ||
deleted
.memory/handoffs/2026-09-16-session-close-out.md +0 -19 | deleted file mode 100644 | ||
| @@ -1,19 +0,0 @@ | ||
| 1 | -# Handoff — 2026-09-16 — session close-out (orchestrator) | |
| 2 | - | |
| 3 | -## Where it stopped | |
| 4 | - | |
| 5 | -Nothing in flight. Five named agents (bob, riker, milo, homer, orchestrator) delivered over two days; every deliverable is in the working tree, **uncommitted**. Read `summary.md` for the current architecture (three front ends: REPL, ACP, `-tui` window; shared command table; persistent sessions; `@path`; skills layouts) and the per-topic handoffs in this directory for details. | |
| 6 | - | |
| 7 | -## Start here next time | |
| 8 | - | |
| 9 | -1. `git status` — if still uncommitted, propose one commit per topic or one big one; the user commits. | |
| 10 | -2. Ask the user for the results of the manual Mac checks (Zed Reload Agent with `sessions.enabled: true`; window mode keys F2 / Ctrl-J / Esc in Terminal.app, iTerm2, Ghostty, tmux; `/copy` → `(pbcopy)`). | |
| 11 | -3. Open work, by ticket: 0012 phase 3 (in-window drag selection, session browser, Markdown rendering); 0003 remaining tier-1/2 items; 0005/0006 token consumption (partly covered by the window header); 0009 release process; 0011 auto-start llama.cpp; 0004 MCP question; 0007 skills read-not-executed. | |
| 12 | -4. Quality debt (out of scope so far): osv findings on `go.mod` (`go 1.25.0` directive + indirect deps), errcheck in engine/fileedit, `agent.Run` complexity (~110). `hello-world/main.go` is the user's stray file — ask before deleting. | |
| 13 | - | |
| 14 | -## Traps (all recorded in summary.md too) | |
| 15 | - | |
| 16 | -- Never `go build -o mm .` in the sandbox (`./mm` is the Mac binary); build to `/tmp/mm-linux`. | |
| 17 | -- IssueSpec tickets: tasks only in the extension's item format; `comments: []`. | |
| 18 | -- `~/.qlty` volume can fill up and make qlty report 0 warnings — check plugin outputs are non-empty. | |
| 19 | -- `available_commands_update` must go out after the `session/new` response (Zed drops it otherwise). | |
| deleted file mode 100644 | |||
| @@ -1,19 +0,0 @@ | |||
| 1 | -# Handoff — 2026-09-16 — session close-out (orchestrator) | ||
| 2 | - | ||
| 3 | -## Where it stopped | ||
| 4 | - | ||
| 5 | -Nothing in flight. Five named agents (bob, riker, milo, homer, orchestrator) delivered over two days; every deliverable is in the working tree, **uncommitted**. Read `summary.md` for the current architecture (three front ends: REPL, ACP, `-tui` window; shared command table; persistent sessions; `@path`; skills layouts) and the per-topic handoffs in this directory for details. | ||
| 6 | - | ||
| 7 | -## Start here next time | ||
| 8 | - | ||
| 9 | -1. `git status` — if still uncommitted, propose one commit per topic or one big one; the user commits. | ||
| 10 | -2. Ask the user for the results of the manual Mac checks (Zed Reload Agent with `sessions.enabled: true`; window mode keys F2 / Ctrl-J / Esc in Terminal.app, iTerm2, Ghostty, tmux; `/copy` → `(pbcopy)`). | ||
| 11 | -3. Open work, by ticket: 0012 phase 3 (in-window drag selection, session browser, Markdown rendering); 0003 remaining tier-1/2 items; 0005/0006 token consumption (partly covered by the window header); 0009 release process; 0011 auto-start llama.cpp; 0004 MCP question; 0007 skills read-not-executed. | ||
| 12 | -4. Quality debt (out of scope so far): osv findings on `go.mod` (`go 1.25.0` directive + indirect deps), errcheck in engine/fileedit, `agent.Run` complexity (~110). `hello-world/main.go` is the user's stray file — ask before deleting. | ||
| 13 | - | ||
| 14 | -## Traps (all recorded in summary.md too) | ||
| 15 | - | ||
| 16 | -- Never `go build -o mm .` in the sandbox (`./mm` is the Mac binary); build to `/tmp/mm-linux`. | ||
| 17 | -- IssueSpec tickets: tasks only in the extension's item format; `comments: []`. | ||
| 18 | -- `~/.qlty` volume can fill up and make qlty report 0 warnings — check plugin outputs are non-empty. | ||
| 19 | -- `available_commands_update` must go out after the `session/new` response (Zed drops it otherwise). | ||
deleted
.memory/handoffs/2026-09-16-single-window-tui.md +0 -23 | deleted file mode 100644 | ||
| @@ -1,23 +0,0 @@ | ||
| 1 | -# Handoff — 2026-09-16 — single-window TUI proposal (agent "homer") | |
| 2 | - | |
| 3 | -## Where it stopped | |
| 4 | - | |
| 5 | -Ticket `.tickets/issues/0012-new-tui-for-mini-me.yaml` holds the full study of turbo-core / turbo-go's ACP agent window and a phased proposal for an optional `mm -tui` mode. Nothing implemented, nothing committed. | |
| 6 | - | |
| 7 | -## If someone picks this up | |
| 8 | - | |
| 9 | -- Read ticket 0012 §3–4 first: recommended **Option B** (tcell v2 directly, hand-rolled window copying `turbo-core/acp/view.go`, `view_draw.go`, `view_events.go`, `transcript.go`, `render.go`, `ui/painter.go` as blueprints). Option A (import `codeberg.org/turbo-editors/turbo-core`, MIT, v0.8.0 pre-1.0) is the fallback if the hand-rolled widgets cost more than expected. | |
| 10 | -- Do the **prerequisite** before any window code: extract the slash-command table out of `agent.Run` so REPL, ACP `availableCommands()` and the TUI picker share it. `agent.Run` is the gate's biggest complexity smell; it must shrink. | |
| 11 | -- The window is a `ui.Sink` implementation: tools already route through `ui.ActiveSink()` when one is installed (`internal/tools/tools.go:142,248`), so tool framing and the inline permission prompt need no tool changes. | |
| 12 | -- Draw only on the loop goroutine; engine/tool callbacks record a fact and `PostEvent(EventInterrupt)`; redraw is state-driven (Turbo's rule, `app/app.go:257-330`). | |
| 13 | -- Newline in the box = **Ctrl-J** (Shift-Enter is indistinguishable from Enter without the kitty protocol; Alt-Enter is not reported by every terminal). | |
| 14 | -- Keep line mode the default and fall back to it when stdout is not a TTY (`mm -tui | tee`). | |
| 15 | -- Tests: `tcell.SimulationScreen`, as Turbo's `ui/uitest_test.go` does. | |
| 16 | - | |
| 17 | -## Sources kept | |
| 18 | - | |
| 19 | -`/tmp/turbo/turbo-core` and `/tmp/turbo/turbo-go` — shallow clones, sandbox-local, will vanish with the sandbox; re-clone from Codeberg if needed. turbo-go's docs pages `agent-windows.md` / `talk-to-an-agent.md` were listed but not read (the code was the primary source). | |
| 20 | - | |
| 21 | -## Related | |
| 22 | - | |
| 23 | -Tickets 0003 (line-mode tiers; §3.1 is Option C here), 0001/0002 (`/help`, `/about` close in phase 2), 0005/0006 (token counters), 0008 (persistent sessions → phase 3 session browser). | |
| deleted file mode 100644 | |||
| @@ -1,23 +0,0 @@ | |||
| 1 | -# Handoff — 2026-09-16 — single-window TUI proposal (agent "homer") | ||
| 2 | - | ||
| 3 | -## Where it stopped | ||
| 4 | - | ||
| 5 | -Ticket `.tickets/issues/0012-new-tui-for-mini-me.yaml` holds the full study of turbo-core / turbo-go's ACP agent window and a phased proposal for an optional `mm -tui` mode. Nothing implemented, nothing committed. | ||
| 6 | - | ||
| 7 | -## If someone picks this up | ||
| 8 | - | ||
| 9 | -- Read ticket 0012 §3–4 first: recommended **Option B** (tcell v2 directly, hand-rolled window copying `turbo-core/acp/view.go`, `view_draw.go`, `view_events.go`, `transcript.go`, `render.go`, `ui/painter.go` as blueprints). Option A (import `codeberg.org/turbo-editors/turbo-core`, MIT, v0.8.0 pre-1.0) is the fallback if the hand-rolled widgets cost more than expected. | ||
| 10 | -- Do the **prerequisite** before any window code: extract the slash-command table out of `agent.Run` so REPL, ACP `availableCommands()` and the TUI picker share it. `agent.Run` is the gate's biggest complexity smell; it must shrink. | ||
| 11 | -- The window is a `ui.Sink` implementation: tools already route through `ui.ActiveSink()` when one is installed (`internal/tools/tools.go:142,248`), so tool framing and the inline permission prompt need no tool changes. | ||
| 12 | -- Draw only on the loop goroutine; engine/tool callbacks record a fact and `PostEvent(EventInterrupt)`; redraw is state-driven (Turbo's rule, `app/app.go:257-330`). | ||
| 13 | -- Newline in the box = **Ctrl-J** (Shift-Enter is indistinguishable from Enter without the kitty protocol; Alt-Enter is not reported by every terminal). | ||
| 14 | -- Keep line mode the default and fall back to it when stdout is not a TTY (`mm -tui | tee`). | ||
| 15 | -- Tests: `tcell.SimulationScreen`, as Turbo's `ui/uitest_test.go` does. | ||
| 16 | - | ||
| 17 | -## Sources kept | ||
| 18 | - | ||
| 19 | -`/tmp/turbo/turbo-core` and `/tmp/turbo/turbo-go` — shallow clones, sandbox-local, will vanish with the sandbox; re-clone from Codeberg if needed. turbo-go's docs pages `agent-windows.md` / `talk-to-an-agent.md` were listed but not read (the code was the primary source). | ||
| 20 | - | ||
| 21 | -## Related | ||
| 22 | - | ||
| 23 | -Tickets 0003 (line-mode tiers; §3.1 is Option C here), 0001/0002 (`/help`, `/about` close in phase 2), 0005/0006 (token counters), 0008 (persistent sessions → phase 3 session browser). | ||
deleted
.memory/handoffs/2026-09-16-tui-copy.md +0 -27 | deleted file mode 100644 | ||
| @@ -1,27 +0,0 @@ | ||
| 1 | -# Handoff — 2026-09-16 — copy text out of the window mode | |
| 2 | - | |
| 3 | -## State | |
| 4 | - | |
| 5 | -Done and green (16 packages, `-race`): in `mm -tui` the mouse is not captured at start-up, so the terminal's own click-and-drag selection and copy shortcut work again; **F2** captures/releases the mouse (wheel scrolling; Shift+drag still selects) with the state in the status bar; `/copy`, `/copy N`, `/copy all` and **Ctrl-Y** copy raw text through `internal/clipboard` (pbcopy / wl-copy / xclip / xsel, then OSC 52) and say which road was used; the REPL has `/copy [N]`. Side fix: `skills.List` ignores a `README.md` at the skills root. Docs EN+FR, diagram, ticket 0012 updated. Nothing committed. | |
| 6 | - | |
| 7 | -## In flight | |
| 8 | - | |
| 9 | -Nothing. | |
| 10 | - | |
| 11 | -## Next steps | |
| 12 | - | |
| 13 | -1. **User, on the Mac** after a native rebuild (`sudo rm /usr/local/bin/mm && ./install.sh`): in `mm -tui`, drag-select an answer and paste it elsewhere (Terminal.app, iTerm2, Ghostty); press F2 and check the wheel scrolls and Shift+drag selects; `/copy` then paste — the notice must say `(pbcopy)`; check F2 is reported by the terminal at all (tmux may eat function keys). | |
| 14 | -2. If a terminal does not report F2, add a second binding (e.g. Ctrl-B) in `handleWindowKey` — one line plus the docs. | |
| 15 | -3. Optional `tuiMouse: true` config key for people who want wheel scrolling always on: needs a top-level bool in `internal/config` (do not turn `tui` into a struct) and one line in `newApp`. | |
| 16 | -4. Phase 3 leftovers in ticket 0012: session browser, code fences, light Markdown; in-window drag selection (task 10) only if the user asks — it requires mouse capture. | |
| 17 | - | |
| 18 | -## Open questions / blockers | |
| 19 | - | |
| 20 | -- `hello-world/main.go` (user's, unformatted, inside the module) is still there; gofmt and the gate flag it. Not touched. | |
| 21 | - | |
| 22 | -## Watch out for | |
| 23 | - | |
| 24 | -- **`~/.qlty` is a 488 MB volume and fills up** (Go toolchain 251 MB + linters + caches). When full, every qlty plugin "FATAL"s, the invoke yamls are 0 bytes, and the report shows **0 warnings** — read that as a tooling failure. Free `~/.qlty/cache/repos/*/plugin_cachedir/*` and `…/out/invoke-*.yaml`, then re-run. `df -h ~/.qlty` tells. | |
| 25 | -- `tcell.SimulationScreen` records `EnableMouse`/`DisableMouse` in a private flag; tests assert the view's `mouse` field and the status label instead. The wire-level proof is the pty check in the history entry. | |
| 26 | -- `Transcript.Plain()` is the paste format of `/copy all`; `render.go`'s layout is the screen format — keep them apart on purpose. | |
| 27 | -- `/tmp/fakebin/pbcopy` + `PATH=/tmp/fakebin:$PATH` is the way to test the native road without a Mac. | |
| deleted file mode 100644 | |||
| @@ -1,27 +0,0 @@ | |||
| 1 | -# Handoff — 2026-09-16 — copy text out of the window mode | ||
| 2 | - | ||
| 3 | -## State | ||
| 4 | - | ||
| 5 | -Done and green (16 packages, `-race`): in `mm -tui` the mouse is not captured at start-up, so the terminal's own click-and-drag selection and copy shortcut work again; **F2** captures/releases the mouse (wheel scrolling; Shift+drag still selects) with the state in the status bar; `/copy`, `/copy N`, `/copy all` and **Ctrl-Y** copy raw text through `internal/clipboard` (pbcopy / wl-copy / xclip / xsel, then OSC 52) and say which road was used; the REPL has `/copy [N]`. Side fix: `skills.List` ignores a `README.md` at the skills root. Docs EN+FR, diagram, ticket 0012 updated. Nothing committed. | ||
| 6 | - | ||
| 7 | -## In flight | ||
| 8 | - | ||
| 9 | -Nothing. | ||
| 10 | - | ||
| 11 | -## Next steps | ||
| 12 | - | ||
| 13 | -1. **User, on the Mac** after a native rebuild (`sudo rm /usr/local/bin/mm && ./install.sh`): in `mm -tui`, drag-select an answer and paste it elsewhere (Terminal.app, iTerm2, Ghostty); press F2 and check the wheel scrolls and Shift+drag selects; `/copy` then paste — the notice must say `(pbcopy)`; check F2 is reported by the terminal at all (tmux may eat function keys). | ||
| 14 | -2. If a terminal does not report F2, add a second binding (e.g. Ctrl-B) in `handleWindowKey` — one line plus the docs. | ||
| 15 | -3. Optional `tuiMouse: true` config key for people who want wheel scrolling always on: needs a top-level bool in `internal/config` (do not turn `tui` into a struct) and one line in `newApp`. | ||
| 16 | -4. Phase 3 leftovers in ticket 0012: session browser, code fences, light Markdown; in-window drag selection (task 10) only if the user asks — it requires mouse capture. | ||
| 17 | - | ||
| 18 | -## Open questions / blockers | ||
| 19 | - | ||
| 20 | -- `hello-world/main.go` (user's, unformatted, inside the module) is still there; gofmt and the gate flag it. Not touched. | ||
| 21 | - | ||
| 22 | -## Watch out for | ||
| 23 | - | ||
| 24 | -- **`~/.qlty` is a 488 MB volume and fills up** (Go toolchain 251 MB + linters + caches). When full, every qlty plugin "FATAL"s, the invoke yamls are 0 bytes, and the report shows **0 warnings** — read that as a tooling failure. Free `~/.qlty/cache/repos/*/plugin_cachedir/*` and `…/out/invoke-*.yaml`, then re-run. `df -h ~/.qlty` tells. | ||
| 25 | -- `tcell.SimulationScreen` records `EnableMouse`/`DisableMouse` in a private flag; tests assert the view's `mouse` field and the status label instead. The wire-level proof is the pty check in the history entry. | ||
| 26 | -- `Transcript.Plain()` is the paste format of `/copy all`; `render.go`'s layout is the screen format — keep them apart on purpose. | ||
| 27 | -- `/tmp/fakebin/pbcopy` + `PATH=/tmp/fakebin:$PATH` is the way to test the native road without a Mac. | ||
deleted
.memory/handoffs/2026-09-16-tui-paste.md +0 -25 | deleted file mode 100644 | ||
| @@ -1,25 +0,0 @@ | ||
| 1 | -# Handoff — 2026-09-16 — long pastes in the window mode | |
| 2 | - | |
| 3 | -## State | |
| 4 | - | |
| 5 | -Done and green (16 packages, `-race`): in `mm -tui`, a bracketed paste longer than 3 lines or 200 characters becomes one `[Pasted #n · L lines · C chars]` token in the box; the model receives the full text on Enter; the conversation keeps the token; `/copy all` and the persisted session carry the full question; `@path` inside a paste is not looked up. Nothing committed. | |
| 6 | - | |
| 7 | -## In flight | |
| 8 | - | |
| 9 | -Nothing. | |
| 10 | - | |
| 11 | -## Next steps | |
| 12 | - | |
| 13 | -1. **User, on the Mac** after `sudo rm /usr/local/bin/mm && ./install.sh`: paste 50+ lines into `mm -tui` in Terminal.app, iTerm2 and Ghostty — the box must show one token, Enter must send the whole text (check the model's answer refers to the end of the block); try Backspace on the token; try two pastes in one message. In **tmux**, paste with the outer terminal's paste (Cmd-V): it must arrive bracketed; `tmux paste-buffer` without `-p` arrives as plain keys and is inserted character by character (documented). | |
| 14 | -2. Optional follow-up if asked: `/paste n` to show a collapsed block folded to `previewLines` — needs a hook from the runner to the View's `pastes` (or the View printing it into the transcript directly). | |
| 15 | -3. Phase 3 items unchanged (ticket 0012 tasks 6, 7, 10). | |
| 16 | - | |
| 17 | -## Open questions / blockers | |
| 18 | - | |
| 19 | -- Threshold values (3 lines / 200 chars) are constants in `paste.go`; a config key was not added (the user did not ask). Easy to add as `tuiPasteLines`/`tuiPasteChars` top-level bools/ints if wanted — do not turn `tui` into a struct. | |
| 20 | - | |
| 21 | -## Watch out for | |
| 22 | - | |
| 23 | -- tcell delivers a paste as `EventPaste(true)`, then ordinary `EventKey`s (Enter for newline, Tab for tab), then `EventPaste(false)`. The View buffers those keys in `pastes.buf` and only inserts at the end mark — any new key handling must keep the `if v.pasting` check first in `handleKey`. | |
| 24 | -- Placeholders are runes in `0xF0000+id`; `Prompt.replace` walks runes, so any code that hands the typed text to another package must go through `Prompt.Text()`/`Expand()` or the model would see private-use runes. | |
| 25 | -- `internal/tui/events.go` sits at file-complexity 44 (threshold 50): put new key handlers in their own file, as `paste.go` and `copy.go` do. | |
| deleted file mode 100644 | |||
| @@ -1,25 +0,0 @@ | |||
| 1 | -# Handoff — 2026-09-16 — long pastes in the window mode | ||
| 2 | - | ||
| 3 | -## State | ||
| 4 | - | ||
| 5 | -Done and green (16 packages, `-race`): in `mm -tui`, a bracketed paste longer than 3 lines or 200 characters becomes one `[Pasted #n · L lines · C chars]` token in the box; the model receives the full text on Enter; the conversation keeps the token; `/copy all` and the persisted session carry the full question; `@path` inside a paste is not looked up. Nothing committed. | ||
| 6 | - | ||
| 7 | -## In flight | ||
| 8 | - | ||
| 9 | -Nothing. | ||
| 10 | - | ||
| 11 | -## Next steps | ||
| 12 | - | ||
| 13 | -1. **User, on the Mac** after `sudo rm /usr/local/bin/mm && ./install.sh`: paste 50+ lines into `mm -tui` in Terminal.app, iTerm2 and Ghostty — the box must show one token, Enter must send the whole text (check the model's answer refers to the end of the block); try Backspace on the token; try two pastes in one message. In **tmux**, paste with the outer terminal's paste (Cmd-V): it must arrive bracketed; `tmux paste-buffer` without `-p` arrives as plain keys and is inserted character by character (documented). | ||
| 14 | -2. Optional follow-up if asked: `/paste n` to show a collapsed block folded to `previewLines` — needs a hook from the runner to the View's `pastes` (or the View printing it into the transcript directly). | ||
| 15 | -3. Phase 3 items unchanged (ticket 0012 tasks 6, 7, 10). | ||
| 16 | - | ||
| 17 | -## Open questions / blockers | ||
| 18 | - | ||
| 19 | -- Threshold values (3 lines / 200 chars) are constants in `paste.go`; a config key was not added (the user did not ask). Easy to add as `tuiPasteLines`/`tuiPasteChars` top-level bools/ints if wanted — do not turn `tui` into a struct. | ||
| 20 | - | ||
| 21 | -## Watch out for | ||
| 22 | - | ||
| 23 | -- tcell delivers a paste as `EventPaste(true)`, then ordinary `EventKey`s (Enter for newline, Tab for tab), then `EventPaste(false)`. The View buffers those keys in `pastes.buf` and only inserts at the end mark — any new key handling must keep the `if v.pasting` check first in `handleKey`. | ||
| 24 | -- Placeholders are runes in `0xF0000+id`; `Prompt.replace` walks runes, so any code that hands the typed text to another package must go through `Prompt.Text()`/`Expand()` or the model would see private-use runes. | ||
| 25 | -- `internal/tui/events.go` sits at file-complexity 44 (threshold 50): put new key handlers in their own file, as `paste.go` and `copy.go` do. | ||
deleted
.memory/handoffs/2026-09-16-tui-proposals.md +0 -18 | deleted file mode 100644 | ||
| @@ -1,18 +0,0 @@ | ||
| 1 | -# Handoff — 2026-09-16 — TUI proposals (agent "homer") | |
| 2 | - | |
| 3 | -## Where it stopped | |
| 4 | - | |
| 5 | -Ticket `.tickets/issues/0003-improve-tui.yaml` holds the full analysis and 18 tiered proposals with a recommended order. Nothing implemented. Nothing committed. | |
| 6 | - | |
| 7 | -## If someone picks this up | |
| 8 | - | |
| 9 | -- Start with tier 1 items 1.1 (multi-line input), 1.2 (`/help`, `/about` — closes tickets 0001/0002), 1.4/1.5 (tokens in the `⚙` recap, `/status` — covers 0005; 0006 is the ACP twin). All land in `internal/agent/agent.go` and `main.go`, no dependency. `agent.Run` is already the biggest complexity smell in the quality gate: put new logic in helpers or a new package (`internal/render`, `internal/tui`), not in the loop. | |
| 10 | -- Any escape sequence must be gated by `spinner.Styled()` (pipe rule); the ACP front end must stay untouched (editor renders). | |
| 11 | -- Tier 2 decision to take with the user: readline via `golang.org/x/term` + own editor (minimal footprint) vs a readline library. | |
| 12 | -- The terminal permission prompt (2.2) should be a terminal implementation of `ui.Sink.Allow`, so tools keep one code path; today `ui.ActiveSink()` is nil in the terminal and tools print directly. | |
| 13 | -- cagent references: `tmp/docker-agent/pkg/leantui/doc.go` (lean mode idea), `pkg/tui/components/toolconfirm/toolconfirm.go` (permission options), `pkg/tui/components/markdown/incremental.go` (streaming Markdown), `pkg/tui/dialog/session_browser.go`. | |
| 14 | - | |
| 15 | -## Traps | |
| 16 | - | |
| 17 | -- `.tickets/labels.yaml` vocabulary: `kind::bug|feature|chore` — `kind::enhancement` does not exist. | |
| 18 | -- Ticket bodies are YAML block scalars; validate with `/tmp/yamlcheck` after hand edits. | |
| deleted file mode 100644 | |||
| @@ -1,18 +0,0 @@ | |||
| 1 | -# Handoff — 2026-09-16 — TUI proposals (agent "homer") | ||
| 2 | - | ||
| 3 | -## Where it stopped | ||
| 4 | - | ||
| 5 | -Ticket `.tickets/issues/0003-improve-tui.yaml` holds the full analysis and 18 tiered proposals with a recommended order. Nothing implemented. Nothing committed. | ||
| 6 | - | ||
| 7 | -## If someone picks this up | ||
| 8 | - | ||
| 9 | -- Start with tier 1 items 1.1 (multi-line input), 1.2 (`/help`, `/about` — closes tickets 0001/0002), 1.4/1.5 (tokens in the `⚙` recap, `/status` — covers 0005; 0006 is the ACP twin). All land in `internal/agent/agent.go` and `main.go`, no dependency. `agent.Run` is already the biggest complexity smell in the quality gate: put new logic in helpers or a new package (`internal/render`, `internal/tui`), not in the loop. | ||
| 10 | -- Any escape sequence must be gated by `spinner.Styled()` (pipe rule); the ACP front end must stay untouched (editor renders). | ||
| 11 | -- Tier 2 decision to take with the user: readline via `golang.org/x/term` + own editor (minimal footprint) vs a readline library. | ||
| 12 | -- The terminal permission prompt (2.2) should be a terminal implementation of `ui.Sink.Allow`, so tools keep one code path; today `ui.ActiveSink()` is nil in the terminal and tools print directly. | ||
| 13 | -- cagent references: `tmp/docker-agent/pkg/leantui/doc.go` (lean mode idea), `pkg/tui/components/toolconfirm/toolconfirm.go` (permission options), `pkg/tui/components/markdown/incremental.go` (streaming Markdown), `pkg/tui/dialog/session_browser.go`. | ||
| 14 | - | ||
| 15 | -## Traps | ||
| 16 | - | ||
| 17 | -- `.tickets/labels.yaml` vocabulary: `kind::bug|feature|chore` — `kind::enhancement` does not exist. | ||
| 18 | -- Ticket bodies are YAML block scalars; validate with `/tmp/yamlcheck` after hand edits. | ||
deleted
.memory/handoffs/2026-09-16-tui-window.md +0 -30 | deleted file mode 100644 | ||
| @@ -1,30 +0,0 @@ | ||
| 1 | -# Handoff — 2026-09-16 — window mode `mm -tui` (ticket 0012, option B) | |
| 2 | - | |
| 3 | -## State | |
| 4 | - | |
| 5 | -Phases 1 and 2 of ticket 0012 are done and green: `mm -tui` (or `tui: true`) opens a single tcell window — header, conversation with scroll bar, rule with spinner, 3-row input box, status bar, `/` picker — fed by a `ui.Sink` like the ACP façade; `permissions: ask` gates `bash`/file tools inline; `/help` exists in both terminal modes; the slash commands live in one table (`internal/command`). `go test -race ./...` 14 packages ok; quality gate fails only on pre-existing debt (63 warnings, 19 smells, none in the new code). Docs EN+FR, diagram and tickets 0012/0001 updated. Nothing committed. | |
| 6 | - | |
| 7 | -## In flight | |
| 8 | - | |
| 9 | -Nothing. Phase 3 (session browser, copy, Markdown) not started — open task 6 of ticket 0012. | |
| 10 | - | |
| 11 | -## Next steps | |
| 12 | - | |
| 13 | -1. **User, on the Mac**: rebuild natively (`sudo rm /usr/local/bin/mm && ./install.sh` — the in-place `cp` trap), then `mm -tui agent.dmr.yaml` from the repo root. Check: Ctrl-J inserts a newline (and whether Alt-Enter does), Esc stops a turn promptly, Ctrl-C quits when idle, resize redraws, colours read on a light theme, `mm -tui | tee x.log` falls back to the line mode. Try `permissions: ask` and a `bash` call: the box must turn into the `? bash: …` question, `a`/`s`/`r` answer it. | |
| 14 | -2. If Alt-Enter is not reported by the user's terminal, the docs already say Ctrl-J is the one to rely on; no code change needed. | |
| 15 | -3. Decide whether ticket 0001 can be closed (`/help` is done; the ticket was left `state: open`). | |
| 16 | -4. Phase 3 when wanted: F2 session browser over `store.Keeper` (list/resume/new), transcript selection + copy (OSC 52), code fences drawn distinctly. The seams are ready: `View` has `onInput` focus and `laidOut` lines; `Transcript` entries carry `Kind`. | |
| 17 | - | |
| 18 | -## Open questions / blockers | |
| 19 | - | |
| 20 | -- `hello-world/main.go` appeared in the repo mid-session (user's file, untracked, unformatted): it is inside the module, so `go build ./...` compiles it and the gate flags it. Not touched — the user should decide (delete, gitignore, or move under `tmp/`). | |
| 21 | -- The tcell dependency pulled `golang.org/x/sys` 0.34→0.38 and `x/text` 0.27→0.31; osv-scanner swapped one CVE for another on those (55→56 go.mod findings). Same debt class as before (the `go 1.25.0` directive is 46 of them). | |
| 22 | - | |
| 23 | -## Watch out for | |
| 24 | - | |
| 25 | -- Never `go build -o mm .` in the sandbox — `./mm` is the user's Mach-O. `/tmp/mm-linux` for checks. A pseudo-terminal check works with `python3 pty` (`fcntl TIOCSWINSZ` to size it); the window needs `TERM` set. | |
| 26 | -- `tcell.SimulationScreen.GetContents` is not safe while another goroutine draws: in tests, read the screen after the loop returned (see `TestRunLoopEndToEnd`) or drive `View.draw()` synchronously (see `view_test.go`'s harness). | |
| 27 | -- The runner's `messages` is owned by the loop goroutine; a turn works on a copy and hands the result back through `results` (`settle()`), so slash commands and turns never race. Keep it that way when adding phase 3. | |
| 28 | -- `config.Cfg` is a package global: tests that toggle `Permissions`/`Sessions` restore it (`newTestRunner` saves/restores the whole struct). | |
| 29 | -- `spinner.Disable()` must stay before `tui.Run`: `engine.Generate` starts the spinner unconditionally and it would draw over the window. | |
| 30 | -- Ticket YAML: tasks in IssueSpec format (`id/title/state/priority/author/createdAt`, plus `updatedAt`/`closedAt` when `closed`), `comments: []` untouched; validate with `/tmp/yamlcheck` (yaml.v3). | |
| deleted file mode 100644 | |||
| @@ -1,30 +0,0 @@ | |||
| 1 | -# Handoff — 2026-09-16 — window mode `mm -tui` (ticket 0012, option B) | ||
| 2 | - | ||
| 3 | -## State | ||
| 4 | - | ||
| 5 | -Phases 1 and 2 of ticket 0012 are done and green: `mm -tui` (or `tui: true`) opens a single tcell window — header, conversation with scroll bar, rule with spinner, 3-row input box, status bar, `/` picker — fed by a `ui.Sink` like the ACP façade; `permissions: ask` gates `bash`/file tools inline; `/help` exists in both terminal modes; the slash commands live in one table (`internal/command`). `go test -race ./...` 14 packages ok; quality gate fails only on pre-existing debt (63 warnings, 19 smells, none in the new code). Docs EN+FR, diagram and tickets 0012/0001 updated. Nothing committed. | ||
| 6 | - | ||
| 7 | -## In flight | ||
| 8 | - | ||
| 9 | -Nothing. Phase 3 (session browser, copy, Markdown) not started — open task 6 of ticket 0012. | ||
| 10 | - | ||
| 11 | -## Next steps | ||
| 12 | - | ||
| 13 | -1. **User, on the Mac**: rebuild natively (`sudo rm /usr/local/bin/mm && ./install.sh` — the in-place `cp` trap), then `mm -tui agent.dmr.yaml` from the repo root. Check: Ctrl-J inserts a newline (and whether Alt-Enter does), Esc stops a turn promptly, Ctrl-C quits when idle, resize redraws, colours read on a light theme, `mm -tui | tee x.log` falls back to the line mode. Try `permissions: ask` and a `bash` call: the box must turn into the `? bash: …` question, `a`/`s`/`r` answer it. | ||
| 14 | -2. If Alt-Enter is not reported by the user's terminal, the docs already say Ctrl-J is the one to rely on; no code change needed. | ||
| 15 | -3. Decide whether ticket 0001 can be closed (`/help` is done; the ticket was left `state: open`). | ||
| 16 | -4. Phase 3 when wanted: F2 session browser over `store.Keeper` (list/resume/new), transcript selection + copy (OSC 52), code fences drawn distinctly. The seams are ready: `View` has `onInput` focus and `laidOut` lines; `Transcript` entries carry `Kind`. | ||
| 17 | - | ||
| 18 | -## Open questions / blockers | ||
| 19 | - | ||
| 20 | -- `hello-world/main.go` appeared in the repo mid-session (user's file, untracked, unformatted): it is inside the module, so `go build ./...` compiles it and the gate flags it. Not touched — the user should decide (delete, gitignore, or move under `tmp/`). | ||
| 21 | -- The tcell dependency pulled `golang.org/x/sys` 0.34→0.38 and `x/text` 0.27→0.31; osv-scanner swapped one CVE for another on those (55→56 go.mod findings). Same debt class as before (the `go 1.25.0` directive is 46 of them). | ||
| 22 | - | ||
| 23 | -## Watch out for | ||
| 24 | - | ||
| 25 | -- Never `go build -o mm .` in the sandbox — `./mm` is the user's Mach-O. `/tmp/mm-linux` for checks. A pseudo-terminal check works with `python3 pty` (`fcntl TIOCSWINSZ` to size it); the window needs `TERM` set. | ||
| 26 | -- `tcell.SimulationScreen.GetContents` is not safe while another goroutine draws: in tests, read the screen after the loop returned (see `TestRunLoopEndToEnd`) or drive `View.draw()` synchronously (see `view_test.go`'s harness). | ||
| 27 | -- The runner's `messages` is owned by the loop goroutine; a turn works on a copy and hands the result back through `results` (`settle()`), so slash commands and turns never race. Keep it that way when adding phase 3. | ||
| 28 | -- `config.Cfg` is a package global: tests that toggle `Permissions`/`Sessions` restore it (`newTestRunner` saves/restores the whole struct). | ||
| 29 | -- `spinner.Disable()` must stay before `tui.Run`: `engine.Generate` starts the spinner unconditionally and it would draw over the window. | ||
| 30 | -- Ticket YAML: tasks in IssueSpec format (`id/title/state/priority/author/createdAt`, plus `updatedAt`/`closedAt` when `closed`), `comments: []` untouched; validate with `/tmp/yamlcheck` (yaml.v3). | ||
deleted
.memory/history.md +0 -173 | deleted file mode 100644 | ||
| @@ -1,173 +0,0 @@ | ||
| 1 | -# History | |
| 2 | - | |
| 3 | -One entry per session, appended, never rewritten. | |
| 4 | - | |
| 5 | -## 2026-09-15 — Diátaxis documentation bootstrap (agent "riker") | |
| 6 | - | |
| 7 | -- **Asked:** `/diataxis-doc` — start documenting the project, excluding `./kits` and `./tmp`. Ran in parallel with another agent adding `/new`. | |
| 8 | -- **Changed:** created `docs/` (language selector) with full four-quadrant trees in `docs/en/` and `docs/fr/`, identical file names: 1 tutorial, 4 how-to guides, 6 reference pages, 3 explanations per language, plus both indexes. Linked the `/new` how-to page and `docs/diagrams/packages.drawio` written by the other agent. No Go code touched. | |
| 9 | -- **Decisions:** language "Both" taken from the methodical-dev convention (user unavailable, skill's mandatory question skipped and recorded here). Shipped skill layout defect documented in how-to/reference rather than fixed. | |
| 10 | -- **Verified:** `go build` OK; banner output for both YAML files captured verbatim; `go test ./...` fails on `mm/internal/skills` (test points at `../../../demo/skills`). All relative links in `docs/` resolve. | |
| 11 | -- **Docs:** everything under `docs/`. Created `.memory/` skeleton. | |
| 12 | - | |
| 13 | -## 2026-09-15 — `/new` slash command (terminal + ACP), quality gate set-up, first `.memory/` | |
| 14 | - | |
| 15 | -- **Goal**: add `/new` to the `mm` agent to clear the history and start a fresh session, in the terminal REPL and over ACP; exclude `./kits` and `./tmp` from the quality measurement. Run by agent "bob" via `methodical-dev`, autonomously (the user was not available for the skill's approval gates), while agent "riker" wrote the rest of `docs/` in parallel. | |
| 16 | -- **Changes**: new package `internal/session` (`NewCommand`, `NewCommandName`, `IsNewCommand`, `Fresh`, `Forgotten`) + tests; `detector.Reset()` + first tests for `internal/detector`; `internal/agent/agent.go` (`/new` handling, `startNewSession`, banner, `if/else` → `switch` for staticcheck QF1003, both front ends now start from `session.Fresh`); `internal/acp/acp.go` (`availableCommands`, `available_commands_update` in `NewSession`, `/new` interception in `Prompt`, `startNewSession`, `resetSession`) + tests; `main.go` package list comment; `.qlty/qlty.toml` (created); `.quality/` (2 runs); docs (below); `.memory/` created. | |
| 17 | -- **Decisions**: `/new` resets history + engine token count + loop detector (REPL); ACP keeps session id / cwd / allow-always; only `/new` advertised over ACP; notification sent inside `NewSession` before the response; the `session` import is aliased `history` inside `internal/acp` because that package already has a `session` type. Rejected: reusing `compactHistory`'s "keep the detector" rule for `/new` (different situation: the task changes); creating a git worktree (all files untracked); fixing the pre-existing `demo/skills` test path (layout decision for the user). | |
| 18 | -- **Tests**: `go test ./...` — all packages pass except the pre-existing `internal/skills` failure (`TestShippedSkillsHaveDescriptions`, path `../../../demo/skills`). `/new` smoke-tested end to end: piped REPL prints `🆕 new session: 0 message(s) forgotten`; scripted JSON-RPC client sees `available_commands_update` then the `session/new` response, and `/new` answered by an `agent_message_chunk` + `end_turn`. | |
| 19 | -- **Quality**: gate FAIL, 2 iterations: warnings 69 → 67, smells 18 → 18, complexity 620 → 618. Fixed: `ineffassign` in the new test, staticcheck QF1003 in `agent.go`. Remaining findings are all pre-existing (osv on `go.mod`, errcheck, complexity of `agent.Run` etc.) and out of this change's scope. Nothing was excluded beyond `kits/**` and `tmp/**`; no threshold changed. | |
| 20 | -- **Docs**: `docs/{en,fr}/how-to/start-a-new-session.md` (new); `/new` rows and ACP paragraphs in `docs/{en,fr}/reference/slash-commands.md` and `acp.md` (riker's pages, edited in place); links in both `README.md` indexes; `docs/diagrams/packages.drawio` (new, from `go list`) referenced from both `explanation/architecture.md`. | |
| 21 | - | |
| 22 | -## 2026-09-15 — Zed config fix in the editor how-to (orchestrator) | |
| 23 | - | |
| 24 | -- **Asked**: the user reported that the Zed `agent_servers` snippet in the docs is insufficient — Zed requires `"type": "custom"` in the entry. | |
| 25 | -- **Changes**: added `"type": "custom"` to the JSON block in `docs/en/how-to/use-from-an-editor.md` and `docs/fr/how-to/use-from-an-editor.md`; recorded the requirement under "Decisions in force" in `summary.md`. | |
| 26 | -- **Tests / quality**: docs-only change, none run. | |
| 27 | - | |
| 28 | -## 2026-09-15 — ACP: `/new` was invisible in Zed's slash menu (orchestrator) | |
| 29 | - | |
| 30 | -- **Asked**: the user reported that Zed lists commands for other ACP agents (docker agent) but shows "Available commands for mini-me: none" and rejects `/new` as unknown. | |
| 31 | -- **Cause**: `available_commands_update` was sent inside `NewSession`, i.e. before the SDK wrote the `session/new` response. Zed keys sessions on the id in that response and drops updates for an unknown session id. | |
| 32 | -- **Changes**: `internal/acp/acp.go` — `Run` now builds the front via `newFront(e, system, tools, w, r)`; the SDK writes to a `responseWriter` that runs a per-session hook once the response line carrying that session id has been written; `NewSession` registers the hook (`context.WithoutCancel(ctx)`, the request context dies with the method) instead of calling `SessionUpdate` directly. `acp_test.go` — `TestResponseSessionIDMatchesOnlySessionResponses`, `TestAvailableCommandsAreSentAfterTheSessionNewResponse` (drives the real SDK over pipes, reads the raw lines back). Docs: `available_commands_update` row in `docs/{en,fr}/reference/acp.md`; `summary.md` decision updated, the "Zed slash menu" unknown removed. | |
| 33 | -- **Rejected**: a goroutine with a `time.Sleep` after `NewSession` returns (a race, just an unlikely one); sending the list on the first `session/prompt` (too late for the menu before the first message). | |
| 34 | -- **Tests**: `go test -race ./internal/acp -count=5` ok; `go build` ok; real binary over stdin shows the response line before the notification line. | |
| 35 | -- **Not verified**: the menu in a real Zed (no Zed in the sandbox) — the user should retry. | |
| 36 | - | |
| 37 | -## 2026-09-15 — ACP: `/compact` and `/abort` alongside `/new` (orchestrator) | |
| 38 | - | |
| 39 | -- **Asked**: the user confirmed `/new` now shows in Zed and asked for the same for `/compact` and `/abort`. | |
| 40 | -- **Changes**: `internal/acp/acp.go` — `compactCommand`/`abortCommand` constants, `isCommand`, three advertised commands, `/abort` intercepted in `Prompt` before `turnMu` (`abortTurn` → shared `cancelTurn`, also used by `Cancel`), `/compact` after `turnMu` (`compactSession` → `compactHistory(ctx, s, cfg, summarize, explain) (line, compressed)`, engine-free and testable). `internal/compact/compact.go` — `Result.Report()` plus `kilo`/`seconds` moved here from `internal/agent/agent.go`, which now prints `res.Report()`. Tests: `TestAvailableCommandsMatchWhatPromptIntercepts`, `TestIsCommandTrimsAndRequiresExactMatch`, `TestCompactHistoryOutcomes` (3 sub-tests), `TestCancelTurnFiresOnlyWhenATurnIsInFlight`; the wire-order test now compares against `availableCommands()`. Docs EN+FR: `reference/slash-commands.md` (ACP section became a table), `reference/acp.md` (`session/new` row, three `session/prompt` rows, commands table), `how-to/use-from-an-editor.md` (cancel + compress/restart bullets), `how-to/manage-the-context-window.md`. | |
| 41 | -- **Decisions**: `/quit` stays terminal-only; `/compact` over ACP is always forced (no automatic compaction exists in the ACP front end, unchanged); `/abort` answers `⚠️ No generation in progress.` when idle rather than erroring. Rejected: handling `/abort` under `turnMu` (it could never reach a running turn). | |
| 42 | -- **Tests**: `go test -race` on acp/compact ok; full `go test ./...` still fails only on the pre-existing `internal/skills` path test. Real binary driven by a small JSON-RPC client: commands list `new, compact, abort`; `/abort` idle → `⚠️ No generation in progress.`; ` /compact\n` on an empty history → `🗜️ nothing to compact: 1 message(s), no turn older than the last 3`; both `end_turn`. | |
| 43 | -- **Not verified**: `/abort` against a real running generation (no model server in the sandbox) and the two new entries in Zed's menu. | |
| 44 | - | |
| 45 | -## 2026-09-15 — `mm` killed on the user's Mac (orchestrator, diagnosis only) | |
| 46 | - | |
| 47 | -- **Asked**: running `mm` on the Mac prints `[1] 55918 killed mm`. | |
| 48 | -- **Findings**: the repo's `./mm` is a Mach-O (magic `CF FA ED FE`), so the user rebuilt natively after the sandbox builds (the sandbox produced linux/arm64 ELF binaries at the same path in between — `mm` is gitignored, fine). SIGKILL of a freshly built Go binary on macOS is the invalid-signature kill; most likely cause is `install.sh` overwriting `/usr/local/bin/mm` IN PLACE with `cp` (the kernel keeps the old inode's signature cached → `Killed: 9`), possibly compounded by the repo living in a kDrive-synced folder. Not verifiable from the sandbox. | |
| 49 | -- **Proposed, not applied**: `sudo rm /usr/local/bin/mm && ./install.sh`; make `install.sh` remove the target (or use `install`) before copying; `codesign -vv /usr/local/bin/mm` to confirm. | |
| 50 | - | |
| 51 | -## 2026-09-15 — "the agent does not see the skills" (orchestrator, diagnosis only) | |
| 52 | - | |
| 53 | -- **Cause confirmed in code**: `skills.List` globs `<skillsDir>/*.md` and `skills.Read` opens `<skillsDir>/<name>.md`, while the shipped skills live in `skills/<name>/SKILL.md` — so `skills: 0` and `read_skill` is never declared. Two aggravating factors: in terminal mode a relative `skillsDir` resolves against the current directory, and `agent.yaml` has been renamed `agent.dmr.yaml` by the user (no `./agent.yaml` → built-in defaults; a Zed `AGENT_CONFIG` still pointing to `agent.yaml` names a missing file, which `config.Load` treats as an error). | |
| 54 | -- **Proposed, not applied**: make `List`/`Read` accept both layouts (`*.md` and `*/SKILL.md`, name = directory), fix the test path `../../../demo/skills` → `../../skills`. | |
| 55 | - | |
| 56 | -## 2026-09-15 — Skills layout fix, skillsDir resolution, `/abort` removed from ACP (orchestrator) | |
| 57 | - | |
| 58 | -- **Asked**: fix the skills loader; make an installed `mm` (`/usr/local/bin`) load the skills of the directory it is started from; drop `/abort` from ACP because Escape already cancels in Zed. | |
| 59 | -- **Changes**: `internal/skills/skills.go` — `List` globs both `<dir>/*.md` and `<dir>/*/SKILL.md`, `defaultName` uses the directory name for a `SKILL.md`, `Read` tries `<name>.md` then `<name>/SKILL.md` (flat wins); tests `TestListAcceptsFlatAndNestedLayouts`, `TestReadAcceptsFlatAndNestedLayouts`, shipped-skills test path → `../../skills`. `main.go` — `resolveSkillsDir(dir, configPath, acpMode)` makes a relative `skillsDir` absolute from the current directory (terminal, or ACP without config) or next to the config file (ACP with one); a `[warning: no skills found in <abs path> (expected <name>.md or <name>/SKILL.md there)]` line when the count is 0. `internal/acp/acp.go` — `/abort` handling, `abortTurn`, `cancelTurn` removed; `Cancel` back to its inline form; `availableCommands()` = `new`, `compact`; tests adjusted. Docs EN+FR: `how-to/add-a-skill.md`, `reference/skill-format.md`, `reference/tools.md`, `reference/configuration.md`, `reference/cli.md`, `how-to/use-from-an-editor.md`, `reference/slash-commands.md`, `reference/acp.md`. `summary.md`: known defects closed, skills decision added, ACP commands decision updated. | |
| 60 | -- **Decisions**: both layouts accepted rather than moving the shipped files (the `<name>/SKILL.md` form is the Agent Skills convention); flat file wins when both exist; the warning is printed whenever 0 skills are found, with the resolved absolute path, because "skills: 0" alone was the user's whole problem. | |
| 61 | -- **Tests**: `go test -race ./...` all green (first time `internal/skills` passes). Linux build to `/tmp/mm-linux` (NOT `./mm`, which is the user's Mach-O): from the repo root the banner lists `read_skill`; from `/tmp` it warns `no skills found in /tmp/skills`. | |
| 62 | -- **Not verified**: the Mac binary — the user must rebuild natively (`sudo rm /usr/local/bin/mm && ./install.sh`). | |
| 63 | - | |
| 64 | -## 2026-09-15 — `@path` notation in questions (orchestrator) | |
| 65 | - | |
| 66 | -- **Asked**: mini-me must understand `@path/file` in a question, without a picker. | |
| 67 | -- **Changes**: new `internal/mention` (`Expand(input, cwd) (string, []Attachment)`, `Attachment.Line()`): mentions start the input or follow a space/bracket/quote, end at a space, lose trailing punctuation; resolved against cwd, absolute, or `~/`; only existing paths attach, once each, as `[attached file: …]` / `[attached directory: …]` lines appended to the text (same shape as ACP `resource_link`). Wired in `internal/agent/agent.go` (cwd captured once in `Run`; `📎 <abs>` dim line per attachment) and `internal/acp/acp.go` (after `flatten`, against `s.cwd`; `[acp] session <id>: attached <path>` on stderr). Tests: 4 in `mention_test.go`. Docs EN+FR: new `how-to/attach-a-file.md`, README indexes, `reference/slash-commands.md` (new `@path` section), `reference/acp.md` (prompt content row), `how-to/use-from-an-editor.md`, `explanation/architecture.md` package table, `docs/diagrams/packages.drawio` (node + edges from agent and acp). | |
| 68 | -- **Decisions**: keep the sentence as typed and append the marker lines rather than rewriting the `@` token (mirrors what Zed sends: text + resource_link); no inlining of content (bash-first agent reads it); paths with spaces unsupported (documented); non-existing paths silently left alone rather than warned (a `@handle` in a sentence is normal text). | |
| 69 | -- **Tests**: `go test -race ./...` all green. Linux build in `/tmp`: typing `explain @main.go and @internal, not @nothing.go` prints two `📎` lines and none for the missing path. | |
| 70 | - | |
| 71 | -## 2026-09-16 — Zed "Reload Agent" fails: "Loading or resuming sessions is not supported by this agent" (orchestrator, diagnosis only) | |
| 72 | - | |
| 73 | -- **Cause**: `Initialize` returns `AgentCapabilities{}` (no `loadSession`), and `LoadSession` / `ResumeSession` answer `method not found`. Zed's Reload Agent restarts the process and asks it to reload the current thread via `session/load` (or the unstable `session/resume`); mm keeps sessions in memory only, so it has nothing to give back. | |
| 74 | -- **Proposed, not applied**: persist each ACP session's history to disk and implement `session/load` (replay user/agent messages and tool calls as `session/update`, restore the in-memory history, set `loadSession: true`). Open choice for the user: storage location (`~/.mm/sessions/` vs `<cwd>/.mm/`) and whether to also replay tool calls. | |
| 75 | - | |
| 76 | -## 2026-09-16 — Ticket 0008 body written (orchestrator, as "bob") | |
| 77 | - | |
| 78 | -- **Asked**: put the Reload Agent explanation, in English, into `.tickets/issues/0008-why-in-zed-i-cannot-relaoad-the-agent.yaml`. | |
| 79 | -- **Changes**: `body` filled (symptom, cause, why not a flag, what it would take, open decisions) as a YAML block scalar; `updatedAt` bumped. Validated with yaml.v3. Clarified in the ticket and to the user that "replaying tool calls" re-sends recorded tool-call records for display and never re-executes tools. | |
| 80 | - | |
| 81 | -## 2026-09-16 — Context compression reviewed, ticket 0010 written (agent "riker", read-only on code) | |
| 82 | - | |
| 83 | -- **Asked**: understand how context compression works and write it into `.tickets/issues/0010-check-how-the-context-compression-is-working.yaml` (English). | |
| 84 | -- **Findings** (from `internal/compact`, `internal/agent`, `internal/acp`, `internal/engine`, `internal/config`): hybrid summary + `keepLastTurns` raw turns; two triggers in `compact.Decide` (`tokens×100 ≥ window×threshold` with `tokens = max(Estimate, server usage.input_tokens)`, or `len ≥ maxMessages`); **`Decide` has one call site, the terminal loop — no automatic compaction over ACP**, only `/compact`. Estimate = chars/3.5 + 4/message, ignores tool definitions and template. Failure or nothing-to-compact leaves the history untouched; measured count forgotten only after success; loop detector kept. Defaults: enabled false, threshold 75, maxMessages 80, keepLastTurns 3, summaryMaxTokens 1200, showStats true; `agent.llamacpp.yaml` enables it, `agent.dmr.yaml` does not. | |
| 85 | -- **Doc inaccuracy (not edited)**: `how-to/manage-the-context-window.md` (EN+FR) says the window is re-probed "before the first question"; the code re-probes before every question while unknown. Docs never say the automatic trigger is terminal-only. | |
| 86 | -- **cagent comparison** (`tmp/docker-agent/pkg/compaction`): threshold 0.9, calibrated estimator, token-budgeted keep suffix, reactive overflow compaction (retry once), optional dedicated compaction model. | |
| 87 | -- **Follow-ups suggested in the ticket**: auto-compaction in `acp.Prompt`; persistent sessions must rewrite the file after compaction (for bob's feature); silent nothing-to-compact on the automatic path. | |
| 88 | -- **Validation**: ticket YAML checked with yaml.v3 (`/tmp/yamlcheck`). No Go, YAML config or docs changed. | |
| 89 | - | |
| 90 | -## 2026-09-16 — Blog: two French articles on ACP (agent "milo") | |
| 91 | - | |
| 92 | -- **Asked**: in `blog/`, an explainer on the Agent Client Protocol (step by step, with the lists of ACP agents and editors) and a tutorial on writing a Go "fake agent" that talks to Zed over ACP. | |
| 93 | -- **Changes**: `blog/01-acp-agent-client-protocol.md` (lifecycle with real JSON, mermaid sequence diagram, agents/editors tables from the official registry as of 2026-09-16), `blog/02-fake-agent-acp-en-go.md` (tutorial + full source + real wire transcript), `blog/fake-agent/{main.go,go.mod,go.sum}` (separate Go module, builds standalone with acp-go-sdk v0.13.5; the root module ignores it — `go build ./... && go vet ./...` at the root still pass). | |
| 94 | -- **Verified**: fake agent driven by a scripted JSON-RPC client: initialize → session/new → available_commands_update AFTER the response → prompt with tool_call/tool_call_update + word-by-word chunks → `/hello` → prompt cancelled by session/cancel answered `cancelled`. Network was available: agentclientprotocol.com registry pages, Zed and JetBrains blogs fetched. | |
| 95 | -- **Not touched**: code, docs, config, tickets, summary.md. | |
| 96 | - | |
| 97 | -## 2026-09-16 — TUI improvement proposals written into ticket 0003 (agent "homer", read-only review) | |
| 98 | - | |
| 99 | -- **Asked**: think about improving mm's terminal UI, write proposals into `.tickets/issues/0003-improve-tui.yaml`, implement nothing. | |
| 100 | -- **Findings** (code): stdin read line by line with `bufio` (no editing, no history, multi-line paste = one question per line, each cancelling the previous turn); output is `fmt.Print` + two ANSI codes gated by `spinner.Styled()`; no permission step in the terminal while ACP has one (`sink.Allow`); recap counts commands but not tokens; only help is the banner. cagent: full Bubble Tea v2 TUI (`tmp/docker-agent/pkg/tui`) plus a `--lean` scrollback-friendly mode (`pkg/leantui`, lipgloss + x/ansi only, pinned status footer with tokens/cost). | |
| 101 | -- **Written**: ticket 0003 body — current state, 8 pain points, cagent comparison, 18 proposals in three tiers with size/dependency/landing package (tier 1 no-dependency: multi-line input, `/help` `/about`, tokens in recap, `/status`, tool framing, diff colours, light Markdown, `/clear`; tier 2: readline+history, terminal permission prompt via a terminal `ui.Sink`, session browser after 0008, glamour, lean status footer, `$EDITOR`, bell; tier 3: Bubble Tea — recommended "not now"), recommended order. Labels `kind::feature`, `priority::medium`. YAML validated with yaml.v3. | |
| 102 | -- **Not changed**: no Go code, config, docs. | |
| 103 | - | |
| 104 | -## 2026-09-16 — Persistent per-project sessions, ACP `session/load` with full replay (agent "bob", methodical-dev) | |
| 105 | - | |
| 106 | -- **Goal**: sessions saved per project, switchable in the YAML, usable over ACP (Zed Reload Agent), `/new` starts a new session, replay everything; decide the restart behaviour from docker agent's source. | |
| 107 | -- **docker agent facts** (`tmp/docker-agent`): SQLite store at `<data-dir>/session.db` = `~/.cagent/session.db` (`cmd/root/flags.go`, `pkg/paths/paths.go`); ACP `LoadSession: false` + `method not found`, advertises unstable `SessionCapabilities{List, Resume, Close}`; `ResumeSession` re-registers the stored session with a new runtime, replays nothing (`pkg/acp/agent.go`); `cagent run` never auto-resumes — `--session <id|-1>` flag, TUI `/sessions` browser (`cmd/root/run.go`, `pkg/tui/tui.go`). | |
| 108 | -- **Changes**: new `internal/store` (`Session`, `Summary`, `Open/New/Save/Load/List/Latest`, `NewID`, atomic write) + tests; `internal/config` `SessionsConfig{Enabled, Dir}` + validation + `config_test.go` (first tests for config); YAML `sessions:` block in `agent.dmr.yaml` and `agent.llamacpp.yaml`; `internal/session.WithSystem`; `internal/acp/persist.go` (`AgentLoader`, `LoadSession`, `storeFor`, `persistNew`, `persist`, `archive`), `internal/acp/replay.go` (`replayUpdates`, `toolPresentation`), `acp.go` (store ids, `loadSession` capability, save points, `slashCommand` extraction, `nextID` removed, `lastFront` test hook); `internal/agent/persist.go` (`keeper`: lazy file, `save`, `renew`, `resume`, `listing`, `hint`), `agent.go` (`loop.historyCommand` extraction, `/sessions`, `/resume`, banner text); `.gitignore` `.mm/`. | |
| 109 | -- **Decisions**: restart = new session + hint (docker agent parity, stale-context safety); terminal file created on first save; bare `/resume` skips the current and empty sessions; ACP `/new` archives under a new id (editor keeps its id); stored prompt replaced by the current one; summaries replayed as agent text; tool calls without recorded response replayed `failed`; write failures logged, never fatal; ids `YYYYMMDD-HHMMSS-<8 hex>` shared by both front ends. Rejected: auto-resume, append-only log, SQLite, unstable `session/resume`, text-only replay. | |
| 110 | -- **Tests**: `go test -race ./...` — 13 packages ok. New: store (5), config (1), session (1), acp replay (3) + persist (4 pipe-driven, incl. replay order and refusals), agent keeper (3). Real Linux build (`/tmp/mm-linux`, never `./mm`) driven by `/tmp/drive_sessions.py`: `loadSession: true`, file at `session/new`, `/new` on empty archives nothing, seeded `session/load` replays `user_message_chunk, tool_call[completed], agent_message_chunk, available_commands_update` then `{}`, `/new` after load keeps the old conversation under a new id; terminal `/sessions`, `/resume` exercised in `/tmp/mmproj`. | |
| 111 | -- **Quality**: gate FAIL, unchanged debt: warnings 67 (= before the feature), smells 19 = the 18 pre-existing + 1 in the user's new untracked `blog/fake-agent/main.go` (out of scope). This feature adds 0 warnings / 0 smells after three iterations (errcheck in a test, `store.Save` returns → `writeAtomic`, `historyCommand` params → `loop` struct, `acp.Prompt` returns → `slashCommand`); `agent.Run` complexity 121 → 120. | |
| 112 | -- **Docs (EN+FR)**: new `how-to/keep-sessions.md`, new `explanation/persistent-sessions.md`; updated `reference/configuration.md` (`sessions` keys + validation), `reference/acp.md` (capabilities, `session/new`, `session/load`, replay table, `/new`, notifications), `reference/slash-commands.md` (`/sessions`, `/resume`, `/new` file note), `reference/cli.md` (start-up line), `how-to/start-a-new-session.md`, `how-to/use-from-an-editor.md`, `explanation/architecture.md` (`store` row), both README indexes, `docs/diagrams/packages.drawio` (`store` node, edges from agent and acp). Ticket 0008: task list + comment. | |
| 113 | - | |
| 114 | -## 2026-09-16 — How to enable sessions, written into `agent.llamacpp.yaml` (orchestrator, as "bob") | |
| 115 | - | |
| 116 | -- **Asked**: explain in `agent.llamacpp.yaml` how to enable persistent sessions. | |
| 117 | -- **Changes**: the comment block above `sessions:` rewritten as a 4-step "how to turn them on" (set `enabled: true`, restart from the project dir / point Zed's `AGENT_CONFIG` at the file and reload, check the `sessions:` banner line, gitignore `.mm/`) followed by what the feature does. Values unchanged (`enabled: false`, `dir: .mm/sessions`). File still parses (banner shows `config: agent.llamacpp.yaml`). `agent.dmr.yaml` keeps bob's shorter comment. | |
| 118 | - | |
| 119 | -## 2026-09-16 — Single-window TUI proposal from the Turbo editors' agent window, ticket 0012 (agent "homer", read-only) | |
| 120 | - | |
| 121 | -- **Asked**: study turbo-core / turbo-go's UI and ACP agent window, propose a one-window mode with an input zone for mini-me in ticket 0012; implement nothing. | |
| 122 | -- **Findings**: both repos MIT; stack = `tcell/v2` + `BurntSushi/toml` + `x/sys` only, hand-written Turbo Vision widgets (`turbo-core/ui`, absolute bounds, clipping painters, `Widget` contract, state-driven event loop with `PostEvent` wake). The agent window is `turbo-core/acp/view*.go`: transcript above, rule with state/key hints, 3-row multi-line input box; Enter sends, Alt-Enter newline, Tab focus, Esc cancels the turn, Ctrl-C copies; `Transcript` coalesces chunks and folds tool updates; permissions are queued and answered by a modal dialog on the loop goroutine; `/` and `@` open an 8-row picker. turbo-go is only the profile + Go scanner; its `acp-agent/` is a cagent config used to test the window. | |
| 123 | -- **Proposal written**: optional `mm -tui` mode, third front end `internal/tui` implementing `ui.Sink`; ASCII mockup; keybindings (Ctrl-J for newline — Shift-Enter undetectable); three options (A import turbo-core, B tcell direct, C Bubble Tea) with a comparison table; **recommended B** with A as fallback; prerequisite = extract `agent.Run`'s command table; three phases; risks. Labels `kind::feature`, `priority::medium`. YAML validated with yaml.v3. | |
| 124 | -- Clones kept under `/tmp/turbo/` (not in the repo). No code, docs, config or other tickets touched. | |
| 125 | - | |
| 126 | -## 2026-09-16 — Ticket 0008 format repaired for IssueSpec (orchestrator, as "milo") | |
| 127 | - | |
| 128 | -- **Asked**: the IssueSpec VS Code extension no longer opened ticket 0008. | |
| 129 | -- **Cause (inferred, schema unavailable)**: the only structural change was bob's hand-written `tasks:` items (`text`/`done`) and a `comments:` item (`author.name`/`createdAt`/`body`) — a format no extension-generated ticket uses; the extension's schema for those arrays is unknown (not documented online, extension not installed in the sandbox). | |
| 130 | -- **Changes**: both arrays reset to `[]`; the six tasks became a `## Progress` checklist and the comment an `## Implementation note` section inside `body`. Top-level keys now match a pristine ticket (`id title state author createdAt updatedAt labels body tasks comments`); yaml.v3 validates. Bob (running on ticket 0012) was told to keep `tasks`/`comments` empty in every ticket. | |
| 131 | -- **Rule for future sessions**: never hand-write `tasks`/`comments` items; use the body. If the user adds a task through the extension, copy that format. | |
| 132 | - | |
| 133 | -## 2026-09-16 — IssueSpec task format learned, applied to ticket 0008 (orchestrator) | |
| 134 | - | |
| 135 | -- The user added a sample task through the extension: `id`, `title`, `state: open`, `priority: none`, `author {name, email}`, `createdAt`. Replaced the sample with the one real open task ("Verify in a real Zed…", `priority: medium`); done items stay as the body checklist because the completed-task `state` value is still unknown. `updatedAt` bumped; yaml.v3 ok. Rule updated in `summary.md`. | |
| 136 | - | |
| 137 | -## 2026-09-16 — Closed-task format learned; ticket 0008 tasks completed (orchestrator) | |
| 138 | - | |
| 139 | -- The user added a closed sample task: `state: closed` + `updatedAt` + `closedAt`. Ticket 0008 now has 5 closed tasks (the former body checklist, removed from the body) and 1 open task; sample removed; yaml.v3 ok. Rule in `summary.md` updated; bob informed. | |
| 140 | - | |
| 141 | -## 2026-09-16 — Window mode `mm -tui` (ticket 0012 option B), shared command table, `/help` (agent "bob", methodical-dev) | |
| 142 | - | |
| 143 | -- **Goal**: the user approved option B of ticket 0012: a single-window TUI on tcell, hand-rolled after turbo-core's agent window, plus the prerequisite refactor (one slash-command table) and phase 2 (tool framing, inline permissions, tokens, `/help`). | |
| 144 | -- **Changes**: new `internal/command` (table, `Parse/Is/For/Usage`); new `internal/tui` (11 files: `doc painter wrap transcript render style view draw events picker sink turn tui`); `internal/compact/apply.go` (`Apply` + `Outcome`, `Kilo` exported); `session.AfterTurn`; `store.Keeper` (moved from `internal/agent/persist.go`, tests moved to `store/keeper_test.go`); `internal/agent/agent.go` dispatches on the table and uses `AfterTurn`/`compact.Apply`/`store.Keeper` (`Run` 121 → 110 complexity); `internal/acp/acp.go` `availableCommands()` from the table, `AfterTurn`, `compactHistory` via `Apply`; `internal/config` `TUI`, `Permissions` (+validation, tests); `main.go` `-tui` flag, `windowMode`, `runWindow`, `assembleTools`, `printBanner`, `say`; `go.mod` + tcell v2.13.10 (x/sys 0.34→0.38, x/text 0.27→0.31 as a side effect). Tests: `command_test.go`, `compact/apply_test.go`, `session_test.go` (`TestAfterTurn`), `store/keeper_test.go`, `tui/{transcript,view,turn,tui}_test.go` (simulation screen, canned model, end-to-end loop), `config_test.go`. | |
| 145 | -- **Decisions**: tcell direct (option B) rather than importing turbo-core; `permissions` default `auto` so the line mode is untouched; Ctrl-C keeps the REPL's meaning; Ctrl-J is the documented newline; Enter during a turn cancels and queues; an unstreamed answer is shown from the response (`streamed` flag); banner captured and shown as the first notice; the `hello-world/` dir the user created mid-session is left alone (gofmt/gate flag it). Rejected: modal dialog for permissions (inline prompt replaces the box instead); `/compact` while busy (queued like any input). | |
| 146 | -- **Tests**: `go test -race ./...` — 14 packages ok. Real binary `/tmp/mm-linux`: `printf '/quit\n' | mm -tui` prints the fallback line and runs the REPL; under `python3 pty` the window draws (header, rule, `/help` output, status bar), `/quit` exits 0, alternate screen entered and released. | |
| 147 | -- **Quality**: FAIL on pre-existing debt only — runs 7→9: warnings 69→63 (below the 67 before the feature), smells 22→19 (= before). New-code smells fixed on the way: `styleOf` (table), `Keeper.Resume` (split `locate`), `main` (extracted `assembleTools`, `printBanner`, `windowMode`), De Morgan in a test. | |
| 148 | -- **Docs**: EN+FR `how-to/use-the-window-mode.md` (new); `reference/cli.md` (`-tui` row, "Window mode specifics" table), `reference/slash-commands.md` (`/help` row, "Window mode keys" table), `reference/configuration.md` (`tui`, `permissions`, validation row), `reference/tools.md` (window row for `bash`), `explanation/architecture.md` (three front ends, `command`/`tui` rows, three new paragraphs), `tutorials/getting-started.md` (banner line), both indexes, `docs/diagrams/packages.drawio` (`tui`, `command`, `tcell` nodes + edges). Tickets 0012 (progress body + 5 closed / 2 open tasks) and 0001 (done body + 2 closed tasks; ticket left `open` for the user to close) — IssueSpec task format as the coordinator specified. | |
| 149 | - | |
| 150 | -## 2026-09-16 — Window mode: select and copy text (agent "bob", methodical-dev) | |
| 151 | - | |
| 152 | -- **Goal**: in `mm -tui`, be able to select the generated text in the terminal and copy/paste it elsewhere. | |
| 153 | -- **Cause**: `loop()` called `screen.EnableMouse` at start-up, so the terminal handed every click to mm and its native click-and-drag selection stopped working. | |
| 154 | -- **Changes**: `internal/tui/tui.go` no longer captures the mouse; `view.go`/`events.go`/`draw.go`: **F2** toggles capture (`toggleMouse`), status bar shows `F2 mouse: off` / `mouse: on (Shift+drag selects)`, **Ctrl-Y** = copy hook; new `internal/tui/copy.go` (`copy`, `copyText`), `transcript.go` (`Answers`, `Plain`, `Entry.plain`); new package **`internal/clipboard`** (`Copier`, `New(osc52)`, `Copy` → native tool `pbcopy`/`wl-copy`/`xclip`/`xsel` first, then OSC 52; `OSC52()` helper; `ErrNoClipboard`); `internal/command`: `Copy` (`/copy`, Terminal|Window, TakesArg); new `internal/agent/copy.go` (`copyAnswer`, `modelAnswers`, `terminalOSC52`) wired in `historyCommand`; `internal/skills/skills.go`: `List` skips `README.md` (`isReadme`). Tests: `clipboard_test.go` (6), `transcript_test.go` (+1), `turn_test.go` (+2, `fakeCopier`), `view_test.go` (+2), `agent/copy_test.go` (2), `skills_test.go` (+1), expectations for 8 commands. Docs EN+FR: `how-to/use-the-window-mode.md` ("Copy text" section), `reference/slash-commands.md` (`/copy` row, F2, Ctrl-Y, wheel row), `reference/cli.md` (Mouse row), `reference/skill-format.md` (README skipped), `explanation/architecture.md` (`clipboard` row), `docs/diagrams/packages.drawio` (`clipboard` node, edges from `agent` and `tui`). Ticket 0012: tasks 8–9 closed, 10 open (in-window selection deferred), progress note. | |
| 155 | -- **Decisions**: native tool BEFORE OSC 52 (the brief said the reverse) because Terminal.app ignores OSC 52 silently and the confirmation must not lie; no `tuiMouse` config key (`tui` is a plain bool; F2 is enough) — recorded as an option; `/copy all` window-only (the REPL's scrollback is selectable); in-window drag selection deferred (needs mouse capture, which is the state that kills native selection, and ~300 lines of line↔entry mapping). | |
| 156 | -- **Tests**: `go test -race ./...` — 16 packages ok. Linux build `/tmp/mm-linux` under a Python pty: no mouse-enable sequence at start-up, F2 emits `?1000h/?1006h`, F2 again `?1000l…`, `/copy` on empty → error notice, `/copy all` → `📋 copied … (pbcopy)` with a fake `pbcopy` receiving the text; REPL `/copy`, `/copy all`, `/copy x` print their lines. | |
| 157 | -- **Quality**: gate FAIL on pre-existing debt only — 63 warnings (unchanged), 18 smells (19 → 18), none in the new code. A run in between showed 0 warnings: the `~/.qlty` volume (488 MB) was full and every plugin failed; freed the regenerable caches and re-measured (see summary trap). | |
| 158 | -- **Not verified**: real macOS terminals (Terminal.app / iTerm2 / Ghostty): native selection with the mouse off, Shift+drag with it on, `pbcopy` road, F2 key reporting (tcell reads `\e OQ` / `\e[12~`). | |
| 159 | - | |
| 160 | -## 2026-09-16 — Session close-out (orchestrator) | |
| 161 | - | |
| 162 | -- **Asked**: "sauve ta mémoire". Both memories brought up to date: this `.memory/` (all agents' entries and ten handoffs already present; `summary.md` last edited by bob for the window mode and clipboard) and the orchestrator's private notes. | |
| 163 | -- **State at close**: everything since the first commit is uncommitted in the working tree (`git status` shows the docs, code, tickets, `.memory/`, `blog/` as modified/untracked). `go vet` clean, `go test -race ./...` 16 packages ok, `/tmp/mm-linux` builds. Quality gate FAIL on pre-existing debt only (63 warnings, 18 smells) plus the user's untracked `hello-world/main.go`. | |
| 164 | -- **Pending for the user**: commit; native rebuild on the Mac (`sudo rm /usr/local/bin/mm && ./install.sh`); manual checks listed in `handoffs/2026-09-16-tui-copy.md`, `2026-09-16-tui-window.md` and `2026-09-16-persistent-sessions.md`; decide `hello-world/`; close ticket 0001 if `/help` satisfies it. | |
| 165 | - | |
| 166 | -## 2026-09-16 — Window mode: long pastes collapse into a token, full text to the model (agent "bob", methodical-dev) | |
| 167 | - | |
| 168 | -- **Goal**: in `-tui`, a paste too long for the box shows a `[Pasted]`-style placeholder while the whole text still reaches the agent. | |
| 169 | -- **Changes**: `internal/tui/paste.go` (new: thresholds, `paste`/`pastes`, private-use placeholder runes, `Prompt{Typed, Pastes}` with `Text`/`Display`/`Expand`, `bufferPasteKey`/`finishPaste`), `events.go` (paste keys buffered until the end mark; Backspace/Delete drop the paste behind a token), `view.go` (`hooks.send(Prompt)`, `pastes` field, `Display()`, `setInput` prunes), `draw.go` (`drawInputLine` rune-by-rune with the token style, `cursorX`), `style.go` (`stPaste`), `transcript.go` (`Entry.Full`, `AddUserFull`, `Plain` uses Full), `turn.go` (`submit`/`dispatch`/`startTurn` take a `Prompt`; mentions from `Typed` only). Tests: `view_test.go` (+3, paste helper, short-paste test now covers Tab), `turn_test.go` (+1, callers use `promptOf`). Docs EN+FR: `how-to/use-the-window-mode.md` ("Paste long text" section), `reference/slash-commands.md` (bracketed-paste row). Ticket 0012: Progress 3 + closed task 11. | |
| 170 | -- **Decisions**: threshold = more than `inputHeight` (3) lines or more than 200 chars; token kept in the transcript (readability), full text in history/session/`/copy all` (`Entry.Full`); `@path` inside a paste NOT expanded; pasted Tab inserted as a tab (previously moved the focus); no `/paste` peek command (View/runner split makes it non-trivial — offered as a follow-up); no renumbering after a token is deleted. Rejected: inlining a truncated preview in the box (hides the typed text), storing pastes in the runner (the box owns them until Enter). | |
| 171 | -- **Tests**: `go test -race ./...` 16 packages ok. Pty check with `/tmp/mm-linux -tui`: 50-line bracketed paste → box shows `[Pasted #1 · 50 lines · 1.0k chars]`, no pasted line drawn; Enter → conversation shows `explain [Pasted #1 …`. | |
| 172 | -- **Quality**: gate FAIL on pre-existing debt only — 63 warnings (unchanged), 18 smells (unchanged after moving the paste handlers out of `events.go`, which had hit file-complexity 50 for one run). Nothing excluded, no threshold changed. | |
| 173 | -- **Docs**: EN and FR pages above; no package README exists (rule inert); no new package, diagram unchanged. | |
| deleted file mode 100644 | |||
| @@ -1,173 +0,0 @@ | |||
| 1 | -# History | ||
| 2 | - | ||
| 3 | -One entry per session, appended, never rewritten. | ||
| 4 | - | ||
| 5 | -## 2026-09-15 — Diátaxis documentation bootstrap (agent "riker") | ||
| 6 | - | ||
| 7 | -- **Asked:** `/diataxis-doc` — start documenting the project, excluding `./kits` and `./tmp`. Ran in parallel with another agent adding `/new`. | ||
| 8 | -- **Changed:** created `docs/` (language selector) with full four-quadrant trees in `docs/en/` and `docs/fr/`, identical file names: 1 tutorial, 4 how-to guides, 6 reference pages, 3 explanations per language, plus both indexes. Linked the `/new` how-to page and `docs/diagrams/packages.drawio` written by the other agent. No Go code touched. | ||
| 9 | -- **Decisions:** language "Both" taken from the methodical-dev convention (user unavailable, skill's mandatory question skipped and recorded here). Shipped skill layout defect documented in how-to/reference rather than fixed. | ||
| 10 | -- **Verified:** `go build` OK; banner output for both YAML files captured verbatim; `go test ./...` fails on `mm/internal/skills` (test points at `../../../demo/skills`). All relative links in `docs/` resolve. | ||
| 11 | -- **Docs:** everything under `docs/`. Created `.memory/` skeleton. | ||
| 12 | - | ||
| 13 | -## 2026-09-15 — `/new` slash command (terminal + ACP), quality gate set-up, first `.memory/` | ||
| 14 | - | ||
| 15 | -- **Goal**: add `/new` to the `mm` agent to clear the history and start a fresh session, in the terminal REPL and over ACP; exclude `./kits` and `./tmp` from the quality measurement. Run by agent "bob" via `methodical-dev`, autonomously (the user was not available for the skill's approval gates), while agent "riker" wrote the rest of `docs/` in parallel. | ||
| 16 | -- **Changes**: new package `internal/session` (`NewCommand`, `NewCommandName`, `IsNewCommand`, `Fresh`, `Forgotten`) + tests; `detector.Reset()` + first tests for `internal/detector`; `internal/agent/agent.go` (`/new` handling, `startNewSession`, banner, `if/else` → `switch` for staticcheck QF1003, both front ends now start from `session.Fresh`); `internal/acp/acp.go` (`availableCommands`, `available_commands_update` in `NewSession`, `/new` interception in `Prompt`, `startNewSession`, `resetSession`) + tests; `main.go` package list comment; `.qlty/qlty.toml` (created); `.quality/` (2 runs); docs (below); `.memory/` created. | ||
| 17 | -- **Decisions**: `/new` resets history + engine token count + loop detector (REPL); ACP keeps session id / cwd / allow-always; only `/new` advertised over ACP; notification sent inside `NewSession` before the response; the `session` import is aliased `history` inside `internal/acp` because that package already has a `session` type. Rejected: reusing `compactHistory`'s "keep the detector" rule for `/new` (different situation: the task changes); creating a git worktree (all files untracked); fixing the pre-existing `demo/skills` test path (layout decision for the user). | ||
| 18 | -- **Tests**: `go test ./...` — all packages pass except the pre-existing `internal/skills` failure (`TestShippedSkillsHaveDescriptions`, path `../../../demo/skills`). `/new` smoke-tested end to end: piped REPL prints `🆕 new session: 0 message(s) forgotten`; scripted JSON-RPC client sees `available_commands_update` then the `session/new` response, and `/new` answered by an `agent_message_chunk` + `end_turn`. | ||
| 19 | -- **Quality**: gate FAIL, 2 iterations: warnings 69 → 67, smells 18 → 18, complexity 620 → 618. Fixed: `ineffassign` in the new test, staticcheck QF1003 in `agent.go`. Remaining findings are all pre-existing (osv on `go.mod`, errcheck, complexity of `agent.Run` etc.) and out of this change's scope. Nothing was excluded beyond `kits/**` and `tmp/**`; no threshold changed. | ||
| 20 | -- **Docs**: `docs/{en,fr}/how-to/start-a-new-session.md` (new); `/new` rows and ACP paragraphs in `docs/{en,fr}/reference/slash-commands.md` and `acp.md` (riker's pages, edited in place); links in both `README.md` indexes; `docs/diagrams/packages.drawio` (new, from `go list`) referenced from both `explanation/architecture.md`. | ||
| 21 | - | ||
| 22 | -## 2026-09-15 — Zed config fix in the editor how-to (orchestrator) | ||
| 23 | - | ||
| 24 | -- **Asked**: the user reported that the Zed `agent_servers` snippet in the docs is insufficient — Zed requires `"type": "custom"` in the entry. | ||
| 25 | -- **Changes**: added `"type": "custom"` to the JSON block in `docs/en/how-to/use-from-an-editor.md` and `docs/fr/how-to/use-from-an-editor.md`; recorded the requirement under "Decisions in force" in `summary.md`. | ||
| 26 | -- **Tests / quality**: docs-only change, none run. | ||
| 27 | - | ||
| 28 | -## 2026-09-15 — ACP: `/new` was invisible in Zed's slash menu (orchestrator) | ||
| 29 | - | ||
| 30 | -- **Asked**: the user reported that Zed lists commands for other ACP agents (docker agent) but shows "Available commands for mini-me: none" and rejects `/new` as unknown. | ||
| 31 | -- **Cause**: `available_commands_update` was sent inside `NewSession`, i.e. before the SDK wrote the `session/new` response. Zed keys sessions on the id in that response and drops updates for an unknown session id. | ||
| 32 | -- **Changes**: `internal/acp/acp.go` — `Run` now builds the front via `newFront(e, system, tools, w, r)`; the SDK writes to a `responseWriter` that runs a per-session hook once the response line carrying that session id has been written; `NewSession` registers the hook (`context.WithoutCancel(ctx)`, the request context dies with the method) instead of calling `SessionUpdate` directly. `acp_test.go` — `TestResponseSessionIDMatchesOnlySessionResponses`, `TestAvailableCommandsAreSentAfterTheSessionNewResponse` (drives the real SDK over pipes, reads the raw lines back). Docs: `available_commands_update` row in `docs/{en,fr}/reference/acp.md`; `summary.md` decision updated, the "Zed slash menu" unknown removed. | ||
| 33 | -- **Rejected**: a goroutine with a `time.Sleep` after `NewSession` returns (a race, just an unlikely one); sending the list on the first `session/prompt` (too late for the menu before the first message). | ||
| 34 | -- **Tests**: `go test -race ./internal/acp -count=5` ok; `go build` ok; real binary over stdin shows the response line before the notification line. | ||
| 35 | -- **Not verified**: the menu in a real Zed (no Zed in the sandbox) — the user should retry. | ||
| 36 | - | ||
| 37 | -## 2026-09-15 — ACP: `/compact` and `/abort` alongside `/new` (orchestrator) | ||
| 38 | - | ||
| 39 | -- **Asked**: the user confirmed `/new` now shows in Zed and asked for the same for `/compact` and `/abort`. | ||
| 40 | -- **Changes**: `internal/acp/acp.go` — `compactCommand`/`abortCommand` constants, `isCommand`, three advertised commands, `/abort` intercepted in `Prompt` before `turnMu` (`abortTurn` → shared `cancelTurn`, also used by `Cancel`), `/compact` after `turnMu` (`compactSession` → `compactHistory(ctx, s, cfg, summarize, explain) (line, compressed)`, engine-free and testable). `internal/compact/compact.go` — `Result.Report()` plus `kilo`/`seconds` moved here from `internal/agent/agent.go`, which now prints `res.Report()`. Tests: `TestAvailableCommandsMatchWhatPromptIntercepts`, `TestIsCommandTrimsAndRequiresExactMatch`, `TestCompactHistoryOutcomes` (3 sub-tests), `TestCancelTurnFiresOnlyWhenATurnIsInFlight`; the wire-order test now compares against `availableCommands()`. Docs EN+FR: `reference/slash-commands.md` (ACP section became a table), `reference/acp.md` (`session/new` row, three `session/prompt` rows, commands table), `how-to/use-from-an-editor.md` (cancel + compress/restart bullets), `how-to/manage-the-context-window.md`. | ||
| 41 | -- **Decisions**: `/quit` stays terminal-only; `/compact` over ACP is always forced (no automatic compaction exists in the ACP front end, unchanged); `/abort` answers `⚠️ No generation in progress.` when idle rather than erroring. Rejected: handling `/abort` under `turnMu` (it could never reach a running turn). | ||
| 42 | -- **Tests**: `go test -race` on acp/compact ok; full `go test ./...` still fails only on the pre-existing `internal/skills` path test. Real binary driven by a small JSON-RPC client: commands list `new, compact, abort`; `/abort` idle → `⚠️ No generation in progress.`; ` /compact\n` on an empty history → `🗜️ nothing to compact: 1 message(s), no turn older than the last 3`; both `end_turn`. | ||
| 43 | -- **Not verified**: `/abort` against a real running generation (no model server in the sandbox) and the two new entries in Zed's menu. | ||
| 44 | - | ||
| 45 | -## 2026-09-15 — `mm` killed on the user's Mac (orchestrator, diagnosis only) | ||
| 46 | - | ||
| 47 | -- **Asked**: running `mm` on the Mac prints `[1] 55918 killed mm`. | ||
| 48 | -- **Findings**: the repo's `./mm` is a Mach-O (magic `CF FA ED FE`), so the user rebuilt natively after the sandbox builds (the sandbox produced linux/arm64 ELF binaries at the same path in between — `mm` is gitignored, fine). SIGKILL of a freshly built Go binary on macOS is the invalid-signature kill; most likely cause is `install.sh` overwriting `/usr/local/bin/mm` IN PLACE with `cp` (the kernel keeps the old inode's signature cached → `Killed: 9`), possibly compounded by the repo living in a kDrive-synced folder. Not verifiable from the sandbox. | ||
| 49 | -- **Proposed, not applied**: `sudo rm /usr/local/bin/mm && ./install.sh`; make `install.sh` remove the target (or use `install`) before copying; `codesign -vv /usr/local/bin/mm` to confirm. | ||
| 50 | - | ||
| 51 | -## 2026-09-15 — "the agent does not see the skills" (orchestrator, diagnosis only) | ||
| 52 | - | ||
| 53 | -- **Cause confirmed in code**: `skills.List` globs `<skillsDir>/*.md` and `skills.Read` opens `<skillsDir>/<name>.md`, while the shipped skills live in `skills/<name>/SKILL.md` — so `skills: 0` and `read_skill` is never declared. Two aggravating factors: in terminal mode a relative `skillsDir` resolves against the current directory, and `agent.yaml` has been renamed `agent.dmr.yaml` by the user (no `./agent.yaml` → built-in defaults; a Zed `AGENT_CONFIG` still pointing to `agent.yaml` names a missing file, which `config.Load` treats as an error). | ||
| 54 | -- **Proposed, not applied**: make `List`/`Read` accept both layouts (`*.md` and `*/SKILL.md`, name = directory), fix the test path `../../../demo/skills` → `../../skills`. | ||
| 55 | - | ||
| 56 | -## 2026-09-15 — Skills layout fix, skillsDir resolution, `/abort` removed from ACP (orchestrator) | ||
| 57 | - | ||
| 58 | -- **Asked**: fix the skills loader; make an installed `mm` (`/usr/local/bin`) load the skills of the directory it is started from; drop `/abort` from ACP because Escape already cancels in Zed. | ||
| 59 | -- **Changes**: `internal/skills/skills.go` — `List` globs both `<dir>/*.md` and `<dir>/*/SKILL.md`, `defaultName` uses the directory name for a `SKILL.md`, `Read` tries `<name>.md` then `<name>/SKILL.md` (flat wins); tests `TestListAcceptsFlatAndNestedLayouts`, `TestReadAcceptsFlatAndNestedLayouts`, shipped-skills test path → `../../skills`. `main.go` — `resolveSkillsDir(dir, configPath, acpMode)` makes a relative `skillsDir` absolute from the current directory (terminal, or ACP without config) or next to the config file (ACP with one); a `[warning: no skills found in <abs path> (expected <name>.md or <name>/SKILL.md there)]` line when the count is 0. `internal/acp/acp.go` — `/abort` handling, `abortTurn`, `cancelTurn` removed; `Cancel` back to its inline form; `availableCommands()` = `new`, `compact`; tests adjusted. Docs EN+FR: `how-to/add-a-skill.md`, `reference/skill-format.md`, `reference/tools.md`, `reference/configuration.md`, `reference/cli.md`, `how-to/use-from-an-editor.md`, `reference/slash-commands.md`, `reference/acp.md`. `summary.md`: known defects closed, skills decision added, ACP commands decision updated. | ||
| 60 | -- **Decisions**: both layouts accepted rather than moving the shipped files (the `<name>/SKILL.md` form is the Agent Skills convention); flat file wins when both exist; the warning is printed whenever 0 skills are found, with the resolved absolute path, because "skills: 0" alone was the user's whole problem. | ||
| 61 | -- **Tests**: `go test -race ./...` all green (first time `internal/skills` passes). Linux build to `/tmp/mm-linux` (NOT `./mm`, which is the user's Mach-O): from the repo root the banner lists `read_skill`; from `/tmp` it warns `no skills found in /tmp/skills`. | ||
| 62 | -- **Not verified**: the Mac binary — the user must rebuild natively (`sudo rm /usr/local/bin/mm && ./install.sh`). | ||
| 63 | - | ||
| 64 | -## 2026-09-15 — `@path` notation in questions (orchestrator) | ||
| 65 | - | ||
| 66 | -- **Asked**: mini-me must understand `@path/file` in a question, without a picker. | ||
| 67 | -- **Changes**: new `internal/mention` (`Expand(input, cwd) (string, []Attachment)`, `Attachment.Line()`): mentions start the input or follow a space/bracket/quote, end at a space, lose trailing punctuation; resolved against cwd, absolute, or `~/`; only existing paths attach, once each, as `[attached file: …]` / `[attached directory: …]` lines appended to the text (same shape as ACP `resource_link`). Wired in `internal/agent/agent.go` (cwd captured once in `Run`; `📎 <abs>` dim line per attachment) and `internal/acp/acp.go` (after `flatten`, against `s.cwd`; `[acp] session <id>: attached <path>` on stderr). Tests: 4 in `mention_test.go`. Docs EN+FR: new `how-to/attach-a-file.md`, README indexes, `reference/slash-commands.md` (new `@path` section), `reference/acp.md` (prompt content row), `how-to/use-from-an-editor.md`, `explanation/architecture.md` package table, `docs/diagrams/packages.drawio` (node + edges from agent and acp). | ||
| 68 | -- **Decisions**: keep the sentence as typed and append the marker lines rather than rewriting the `@` token (mirrors what Zed sends: text + resource_link); no inlining of content (bash-first agent reads it); paths with spaces unsupported (documented); non-existing paths silently left alone rather than warned (a `@handle` in a sentence is normal text). | ||
| 69 | -- **Tests**: `go test -race ./...` all green. Linux build in `/tmp`: typing `explain @main.go and @internal, not @nothing.go` prints two `📎` lines and none for the missing path. | ||
| 70 | - | ||
| 71 | -## 2026-09-16 — Zed "Reload Agent" fails: "Loading or resuming sessions is not supported by this agent" (orchestrator, diagnosis only) | ||
| 72 | - | ||
| 73 | -- **Cause**: `Initialize` returns `AgentCapabilities{}` (no `loadSession`), and `LoadSession` / `ResumeSession` answer `method not found`. Zed's Reload Agent restarts the process and asks it to reload the current thread via `session/load` (or the unstable `session/resume`); mm keeps sessions in memory only, so it has nothing to give back. | ||
| 74 | -- **Proposed, not applied**: persist each ACP session's history to disk and implement `session/load` (replay user/agent messages and tool calls as `session/update`, restore the in-memory history, set `loadSession: true`). Open choice for the user: storage location (`~/.mm/sessions/` vs `<cwd>/.mm/`) and whether to also replay tool calls. | ||
| 75 | - | ||
| 76 | -## 2026-09-16 — Ticket 0008 body written (orchestrator, as "bob") | ||
| 77 | - | ||
| 78 | -- **Asked**: put the Reload Agent explanation, in English, into `.tickets/issues/0008-why-in-zed-i-cannot-relaoad-the-agent.yaml`. | ||
| 79 | -- **Changes**: `body` filled (symptom, cause, why not a flag, what it would take, open decisions) as a YAML block scalar; `updatedAt` bumped. Validated with yaml.v3. Clarified in the ticket and to the user that "replaying tool calls" re-sends recorded tool-call records for display and never re-executes tools. | ||
| 80 | - | ||
| 81 | -## 2026-09-16 — Context compression reviewed, ticket 0010 written (agent "riker", read-only on code) | ||
| 82 | - | ||
| 83 | -- **Asked**: understand how context compression works and write it into `.tickets/issues/0010-check-how-the-context-compression-is-working.yaml` (English). | ||
| 84 | -- **Findings** (from `internal/compact`, `internal/agent`, `internal/acp`, `internal/engine`, `internal/config`): hybrid summary + `keepLastTurns` raw turns; two triggers in `compact.Decide` (`tokens×100 ≥ window×threshold` with `tokens = max(Estimate, server usage.input_tokens)`, or `len ≥ maxMessages`); **`Decide` has one call site, the terminal loop — no automatic compaction over ACP**, only `/compact`. Estimate = chars/3.5 + 4/message, ignores tool definitions and template. Failure or nothing-to-compact leaves the history untouched; measured count forgotten only after success; loop detector kept. Defaults: enabled false, threshold 75, maxMessages 80, keepLastTurns 3, summaryMaxTokens 1200, showStats true; `agent.llamacpp.yaml` enables it, `agent.dmr.yaml` does not. | ||
| 85 | -- **Doc inaccuracy (not edited)**: `how-to/manage-the-context-window.md` (EN+FR) says the window is re-probed "before the first question"; the code re-probes before every question while unknown. Docs never say the automatic trigger is terminal-only. | ||
| 86 | -- **cagent comparison** (`tmp/docker-agent/pkg/compaction`): threshold 0.9, calibrated estimator, token-budgeted keep suffix, reactive overflow compaction (retry once), optional dedicated compaction model. | ||
| 87 | -- **Follow-ups suggested in the ticket**: auto-compaction in `acp.Prompt`; persistent sessions must rewrite the file after compaction (for bob's feature); silent nothing-to-compact on the automatic path. | ||
| 88 | -- **Validation**: ticket YAML checked with yaml.v3 (`/tmp/yamlcheck`). No Go, YAML config or docs changed. | ||
| 89 | - | ||
| 90 | -## 2026-09-16 — Blog: two French articles on ACP (agent "milo") | ||
| 91 | - | ||
| 92 | -- **Asked**: in `blog/`, an explainer on the Agent Client Protocol (step by step, with the lists of ACP agents and editors) and a tutorial on writing a Go "fake agent" that talks to Zed over ACP. | ||
| 93 | -- **Changes**: `blog/01-acp-agent-client-protocol.md` (lifecycle with real JSON, mermaid sequence diagram, agents/editors tables from the official registry as of 2026-09-16), `blog/02-fake-agent-acp-en-go.md` (tutorial + full source + real wire transcript), `blog/fake-agent/{main.go,go.mod,go.sum}` (separate Go module, builds standalone with acp-go-sdk v0.13.5; the root module ignores it — `go build ./... && go vet ./...` at the root still pass). | ||
| 94 | -- **Verified**: fake agent driven by a scripted JSON-RPC client: initialize → session/new → available_commands_update AFTER the response → prompt with tool_call/tool_call_update + word-by-word chunks → `/hello` → prompt cancelled by session/cancel answered `cancelled`. Network was available: agentclientprotocol.com registry pages, Zed and JetBrains blogs fetched. | ||
| 95 | -- **Not touched**: code, docs, config, tickets, summary.md. | ||
| 96 | - | ||
| 97 | -## 2026-09-16 — TUI improvement proposals written into ticket 0003 (agent "homer", read-only review) | ||
| 98 | - | ||
| 99 | -- **Asked**: think about improving mm's terminal UI, write proposals into `.tickets/issues/0003-improve-tui.yaml`, implement nothing. | ||
| 100 | -- **Findings** (code): stdin read line by line with `bufio` (no editing, no history, multi-line paste = one question per line, each cancelling the previous turn); output is `fmt.Print` + two ANSI codes gated by `spinner.Styled()`; no permission step in the terminal while ACP has one (`sink.Allow`); recap counts commands but not tokens; only help is the banner. cagent: full Bubble Tea v2 TUI (`tmp/docker-agent/pkg/tui`) plus a `--lean` scrollback-friendly mode (`pkg/leantui`, lipgloss + x/ansi only, pinned status footer with tokens/cost). | ||
| 101 | -- **Written**: ticket 0003 body — current state, 8 pain points, cagent comparison, 18 proposals in three tiers with size/dependency/landing package (tier 1 no-dependency: multi-line input, `/help` `/about`, tokens in recap, `/status`, tool framing, diff colours, light Markdown, `/clear`; tier 2: readline+history, terminal permission prompt via a terminal `ui.Sink`, session browser after 0008, glamour, lean status footer, `$EDITOR`, bell; tier 3: Bubble Tea — recommended "not now"), recommended order. Labels `kind::feature`, `priority::medium`. YAML validated with yaml.v3. | ||
| 102 | -- **Not changed**: no Go code, config, docs. | ||
| 103 | - | ||
| 104 | -## 2026-09-16 — Persistent per-project sessions, ACP `session/load` with full replay (agent "bob", methodical-dev) | ||
| 105 | - | ||
| 106 | -- **Goal**: sessions saved per project, switchable in the YAML, usable over ACP (Zed Reload Agent), `/new` starts a new session, replay everything; decide the restart behaviour from docker agent's source. | ||
| 107 | -- **docker agent facts** (`tmp/docker-agent`): SQLite store at `<data-dir>/session.db` = `~/.cagent/session.db` (`cmd/root/flags.go`, `pkg/paths/paths.go`); ACP `LoadSession: false` + `method not found`, advertises unstable `SessionCapabilities{List, Resume, Close}`; `ResumeSession` re-registers the stored session with a new runtime, replays nothing (`pkg/acp/agent.go`); `cagent run` never auto-resumes — `--session <id|-1>` flag, TUI `/sessions` browser (`cmd/root/run.go`, `pkg/tui/tui.go`). | ||
| 108 | -- **Changes**: new `internal/store` (`Session`, `Summary`, `Open/New/Save/Load/List/Latest`, `NewID`, atomic write) + tests; `internal/config` `SessionsConfig{Enabled, Dir}` + validation + `config_test.go` (first tests for config); YAML `sessions:` block in `agent.dmr.yaml` and `agent.llamacpp.yaml`; `internal/session.WithSystem`; `internal/acp/persist.go` (`AgentLoader`, `LoadSession`, `storeFor`, `persistNew`, `persist`, `archive`), `internal/acp/replay.go` (`replayUpdates`, `toolPresentation`), `acp.go` (store ids, `loadSession` capability, save points, `slashCommand` extraction, `nextID` removed, `lastFront` test hook); `internal/agent/persist.go` (`keeper`: lazy file, `save`, `renew`, `resume`, `listing`, `hint`), `agent.go` (`loop.historyCommand` extraction, `/sessions`, `/resume`, banner text); `.gitignore` `.mm/`. | ||
| 109 | -- **Decisions**: restart = new session + hint (docker agent parity, stale-context safety); terminal file created on first save; bare `/resume` skips the current and empty sessions; ACP `/new` archives under a new id (editor keeps its id); stored prompt replaced by the current one; summaries replayed as agent text; tool calls without recorded response replayed `failed`; write failures logged, never fatal; ids `YYYYMMDD-HHMMSS-<8 hex>` shared by both front ends. Rejected: auto-resume, append-only log, SQLite, unstable `session/resume`, text-only replay. | ||
| 110 | -- **Tests**: `go test -race ./...` — 13 packages ok. New: store (5), config (1), session (1), acp replay (3) + persist (4 pipe-driven, incl. replay order and refusals), agent keeper (3). Real Linux build (`/tmp/mm-linux`, never `./mm`) driven by `/tmp/drive_sessions.py`: `loadSession: true`, file at `session/new`, `/new` on empty archives nothing, seeded `session/load` replays `user_message_chunk, tool_call[completed], agent_message_chunk, available_commands_update` then `{}`, `/new` after load keeps the old conversation under a new id; terminal `/sessions`, `/resume` exercised in `/tmp/mmproj`. | ||
| 111 | -- **Quality**: gate FAIL, unchanged debt: warnings 67 (= before the feature), smells 19 = the 18 pre-existing + 1 in the user's new untracked `blog/fake-agent/main.go` (out of scope). This feature adds 0 warnings / 0 smells after three iterations (errcheck in a test, `store.Save` returns → `writeAtomic`, `historyCommand` params → `loop` struct, `acp.Prompt` returns → `slashCommand`); `agent.Run` complexity 121 → 120. | ||
| 112 | -- **Docs (EN+FR)**: new `how-to/keep-sessions.md`, new `explanation/persistent-sessions.md`; updated `reference/configuration.md` (`sessions` keys + validation), `reference/acp.md` (capabilities, `session/new`, `session/load`, replay table, `/new`, notifications), `reference/slash-commands.md` (`/sessions`, `/resume`, `/new` file note), `reference/cli.md` (start-up line), `how-to/start-a-new-session.md`, `how-to/use-from-an-editor.md`, `explanation/architecture.md` (`store` row), both README indexes, `docs/diagrams/packages.drawio` (`store` node, edges from agent and acp). Ticket 0008: task list + comment. | ||
| 113 | - | ||
| 114 | -## 2026-09-16 — How to enable sessions, written into `agent.llamacpp.yaml` (orchestrator, as "bob") | ||
| 115 | - | ||
| 116 | -- **Asked**: explain in `agent.llamacpp.yaml` how to enable persistent sessions. | ||
| 117 | -- **Changes**: the comment block above `sessions:` rewritten as a 4-step "how to turn them on" (set `enabled: true`, restart from the project dir / point Zed's `AGENT_CONFIG` at the file and reload, check the `sessions:` banner line, gitignore `.mm/`) followed by what the feature does. Values unchanged (`enabled: false`, `dir: .mm/sessions`). File still parses (banner shows `config: agent.llamacpp.yaml`). `agent.dmr.yaml` keeps bob's shorter comment. | ||
| 118 | - | ||
| 119 | -## 2026-09-16 — Single-window TUI proposal from the Turbo editors' agent window, ticket 0012 (agent "homer", read-only) | ||
| 120 | - | ||
| 121 | -- **Asked**: study turbo-core / turbo-go's UI and ACP agent window, propose a one-window mode with an input zone for mini-me in ticket 0012; implement nothing. | ||
| 122 | -- **Findings**: both repos MIT; stack = `tcell/v2` + `BurntSushi/toml` + `x/sys` only, hand-written Turbo Vision widgets (`turbo-core/ui`, absolute bounds, clipping painters, `Widget` contract, state-driven event loop with `PostEvent` wake). The agent window is `turbo-core/acp/view*.go`: transcript above, rule with state/key hints, 3-row multi-line input box; Enter sends, Alt-Enter newline, Tab focus, Esc cancels the turn, Ctrl-C copies; `Transcript` coalesces chunks and folds tool updates; permissions are queued and answered by a modal dialog on the loop goroutine; `/` and `@` open an 8-row picker. turbo-go is only the profile + Go scanner; its `acp-agent/` is a cagent config used to test the window. | ||
| 123 | -- **Proposal written**: optional `mm -tui` mode, third front end `internal/tui` implementing `ui.Sink`; ASCII mockup; keybindings (Ctrl-J for newline — Shift-Enter undetectable); three options (A import turbo-core, B tcell direct, C Bubble Tea) with a comparison table; **recommended B** with A as fallback; prerequisite = extract `agent.Run`'s command table; three phases; risks. Labels `kind::feature`, `priority::medium`. YAML validated with yaml.v3. | ||
| 124 | -- Clones kept under `/tmp/turbo/` (not in the repo). No code, docs, config or other tickets touched. | ||
| 125 | - | ||
| 126 | -## 2026-09-16 — Ticket 0008 format repaired for IssueSpec (orchestrator, as "milo") | ||
| 127 | - | ||
| 128 | -- **Asked**: the IssueSpec VS Code extension no longer opened ticket 0008. | ||
| 129 | -- **Cause (inferred, schema unavailable)**: the only structural change was bob's hand-written `tasks:` items (`text`/`done`) and a `comments:` item (`author.name`/`createdAt`/`body`) — a format no extension-generated ticket uses; the extension's schema for those arrays is unknown (not documented online, extension not installed in the sandbox). | ||
| 130 | -- **Changes**: both arrays reset to `[]`; the six tasks became a `## Progress` checklist and the comment an `## Implementation note` section inside `body`. Top-level keys now match a pristine ticket (`id title state author createdAt updatedAt labels body tasks comments`); yaml.v3 validates. Bob (running on ticket 0012) was told to keep `tasks`/`comments` empty in every ticket. | ||
| 131 | -- **Rule for future sessions**: never hand-write `tasks`/`comments` items; use the body. If the user adds a task through the extension, copy that format. | ||
| 132 | - | ||
| 133 | -## 2026-09-16 — IssueSpec task format learned, applied to ticket 0008 (orchestrator) | ||
| 134 | - | ||
| 135 | -- The user added a sample task through the extension: `id`, `title`, `state: open`, `priority: none`, `author {name, email}`, `createdAt`. Replaced the sample with the one real open task ("Verify in a real Zed…", `priority: medium`); done items stay as the body checklist because the completed-task `state` value is still unknown. `updatedAt` bumped; yaml.v3 ok. Rule updated in `summary.md`. | ||
| 136 | - | ||
| 137 | -## 2026-09-16 — Closed-task format learned; ticket 0008 tasks completed (orchestrator) | ||
| 138 | - | ||
| 139 | -- The user added a closed sample task: `state: closed` + `updatedAt` + `closedAt`. Ticket 0008 now has 5 closed tasks (the former body checklist, removed from the body) and 1 open task; sample removed; yaml.v3 ok. Rule in `summary.md` updated; bob informed. | ||
| 140 | - | ||
| 141 | -## 2026-09-16 — Window mode `mm -tui` (ticket 0012 option B), shared command table, `/help` (agent "bob", methodical-dev) | ||
| 142 | - | ||
| 143 | -- **Goal**: the user approved option B of ticket 0012: a single-window TUI on tcell, hand-rolled after turbo-core's agent window, plus the prerequisite refactor (one slash-command table) and phase 2 (tool framing, inline permissions, tokens, `/help`). | ||
| 144 | -- **Changes**: new `internal/command` (table, `Parse/Is/For/Usage`); new `internal/tui` (11 files: `doc painter wrap transcript render style view draw events picker sink turn tui`); `internal/compact/apply.go` (`Apply` + `Outcome`, `Kilo` exported); `session.AfterTurn`; `store.Keeper` (moved from `internal/agent/persist.go`, tests moved to `store/keeper_test.go`); `internal/agent/agent.go` dispatches on the table and uses `AfterTurn`/`compact.Apply`/`store.Keeper` (`Run` 121 → 110 complexity); `internal/acp/acp.go` `availableCommands()` from the table, `AfterTurn`, `compactHistory` via `Apply`; `internal/config` `TUI`, `Permissions` (+validation, tests); `main.go` `-tui` flag, `windowMode`, `runWindow`, `assembleTools`, `printBanner`, `say`; `go.mod` + tcell v2.13.10 (x/sys 0.34→0.38, x/text 0.27→0.31 as a side effect). Tests: `command_test.go`, `compact/apply_test.go`, `session_test.go` (`TestAfterTurn`), `store/keeper_test.go`, `tui/{transcript,view,turn,tui}_test.go` (simulation screen, canned model, end-to-end loop), `config_test.go`. | ||
| 145 | -- **Decisions**: tcell direct (option B) rather than importing turbo-core; `permissions` default `auto` so the line mode is untouched; Ctrl-C keeps the REPL's meaning; Ctrl-J is the documented newline; Enter during a turn cancels and queues; an unstreamed answer is shown from the response (`streamed` flag); banner captured and shown as the first notice; the `hello-world/` dir the user created mid-session is left alone (gofmt/gate flag it). Rejected: modal dialog for permissions (inline prompt replaces the box instead); `/compact` while busy (queued like any input). | ||
| 146 | -- **Tests**: `go test -race ./...` — 14 packages ok. Real binary `/tmp/mm-linux`: `printf '/quit\n' | mm -tui` prints the fallback line and runs the REPL; under `python3 pty` the window draws (header, rule, `/help` output, status bar), `/quit` exits 0, alternate screen entered and released. | ||
| 147 | -- **Quality**: FAIL on pre-existing debt only — runs 7→9: warnings 69→63 (below the 67 before the feature), smells 22→19 (= before). New-code smells fixed on the way: `styleOf` (table), `Keeper.Resume` (split `locate`), `main` (extracted `assembleTools`, `printBanner`, `windowMode`), De Morgan in a test. | ||
| 148 | -- **Docs**: EN+FR `how-to/use-the-window-mode.md` (new); `reference/cli.md` (`-tui` row, "Window mode specifics" table), `reference/slash-commands.md` (`/help` row, "Window mode keys" table), `reference/configuration.md` (`tui`, `permissions`, validation row), `reference/tools.md` (window row for `bash`), `explanation/architecture.md` (three front ends, `command`/`tui` rows, three new paragraphs), `tutorials/getting-started.md` (banner line), both indexes, `docs/diagrams/packages.drawio` (`tui`, `command`, `tcell` nodes + edges). Tickets 0012 (progress body + 5 closed / 2 open tasks) and 0001 (done body + 2 closed tasks; ticket left `open` for the user to close) — IssueSpec task format as the coordinator specified. | ||
| 149 | - | ||
| 150 | -## 2026-09-16 — Window mode: select and copy text (agent "bob", methodical-dev) | ||
| 151 | - | ||
| 152 | -- **Goal**: in `mm -tui`, be able to select the generated text in the terminal and copy/paste it elsewhere. | ||
| 153 | -- **Cause**: `loop()` called `screen.EnableMouse` at start-up, so the terminal handed every click to mm and its native click-and-drag selection stopped working. | ||
| 154 | -- **Changes**: `internal/tui/tui.go` no longer captures the mouse; `view.go`/`events.go`/`draw.go`: **F2** toggles capture (`toggleMouse`), status bar shows `F2 mouse: off` / `mouse: on (Shift+drag selects)`, **Ctrl-Y** = copy hook; new `internal/tui/copy.go` (`copy`, `copyText`), `transcript.go` (`Answers`, `Plain`, `Entry.plain`); new package **`internal/clipboard`** (`Copier`, `New(osc52)`, `Copy` → native tool `pbcopy`/`wl-copy`/`xclip`/`xsel` first, then OSC 52; `OSC52()` helper; `ErrNoClipboard`); `internal/command`: `Copy` (`/copy`, Terminal|Window, TakesArg); new `internal/agent/copy.go` (`copyAnswer`, `modelAnswers`, `terminalOSC52`) wired in `historyCommand`; `internal/skills/skills.go`: `List` skips `README.md` (`isReadme`). Tests: `clipboard_test.go` (6), `transcript_test.go` (+1), `turn_test.go` (+2, `fakeCopier`), `view_test.go` (+2), `agent/copy_test.go` (2), `skills_test.go` (+1), expectations for 8 commands. Docs EN+FR: `how-to/use-the-window-mode.md` ("Copy text" section), `reference/slash-commands.md` (`/copy` row, F2, Ctrl-Y, wheel row), `reference/cli.md` (Mouse row), `reference/skill-format.md` (README skipped), `explanation/architecture.md` (`clipboard` row), `docs/diagrams/packages.drawio` (`clipboard` node, edges from `agent` and `tui`). Ticket 0012: tasks 8–9 closed, 10 open (in-window selection deferred), progress note. | ||
| 155 | -- **Decisions**: native tool BEFORE OSC 52 (the brief said the reverse) because Terminal.app ignores OSC 52 silently and the confirmation must not lie; no `tuiMouse` config key (`tui` is a plain bool; F2 is enough) — recorded as an option; `/copy all` window-only (the REPL's scrollback is selectable); in-window drag selection deferred (needs mouse capture, which is the state that kills native selection, and ~300 lines of line↔entry mapping). | ||
| 156 | -- **Tests**: `go test -race ./...` — 16 packages ok. Linux build `/tmp/mm-linux` under a Python pty: no mouse-enable sequence at start-up, F2 emits `?1000h/?1006h`, F2 again `?1000l…`, `/copy` on empty → error notice, `/copy all` → `📋 copied … (pbcopy)` with a fake `pbcopy` receiving the text; REPL `/copy`, `/copy all`, `/copy x` print their lines. | ||
| 157 | -- **Quality**: gate FAIL on pre-existing debt only — 63 warnings (unchanged), 18 smells (19 → 18), none in the new code. A run in between showed 0 warnings: the `~/.qlty` volume (488 MB) was full and every plugin failed; freed the regenerable caches and re-measured (see summary trap). | ||
| 158 | -- **Not verified**: real macOS terminals (Terminal.app / iTerm2 / Ghostty): native selection with the mouse off, Shift+drag with it on, `pbcopy` road, F2 key reporting (tcell reads `\e OQ` / `\e[12~`). | ||
| 159 | - | ||
| 160 | -## 2026-09-16 — Session close-out (orchestrator) | ||
| 161 | - | ||
| 162 | -- **Asked**: "sauve ta mémoire". Both memories brought up to date: this `.memory/` (all agents' entries and ten handoffs already present; `summary.md` last edited by bob for the window mode and clipboard) and the orchestrator's private notes. | ||
| 163 | -- **State at close**: everything since the first commit is uncommitted in the working tree (`git status` shows the docs, code, tickets, `.memory/`, `blog/` as modified/untracked). `go vet` clean, `go test -race ./...` 16 packages ok, `/tmp/mm-linux` builds. Quality gate FAIL on pre-existing debt only (63 warnings, 18 smells) plus the user's untracked `hello-world/main.go`. | ||
| 164 | -- **Pending for the user**: commit; native rebuild on the Mac (`sudo rm /usr/local/bin/mm && ./install.sh`); manual checks listed in `handoffs/2026-09-16-tui-copy.md`, `2026-09-16-tui-window.md` and `2026-09-16-persistent-sessions.md`; decide `hello-world/`; close ticket 0001 if `/help` satisfies it. | ||
| 165 | - | ||
| 166 | -## 2026-09-16 — Window mode: long pastes collapse into a token, full text to the model (agent "bob", methodical-dev) | ||
| 167 | - | ||
| 168 | -- **Goal**: in `-tui`, a paste too long for the box shows a `[Pasted]`-style placeholder while the whole text still reaches the agent. | ||
| 169 | -- **Changes**: `internal/tui/paste.go` (new: thresholds, `paste`/`pastes`, private-use placeholder runes, `Prompt{Typed, Pastes}` with `Text`/`Display`/`Expand`, `bufferPasteKey`/`finishPaste`), `events.go` (paste keys buffered until the end mark; Backspace/Delete drop the paste behind a token), `view.go` (`hooks.send(Prompt)`, `pastes` field, `Display()`, `setInput` prunes), `draw.go` (`drawInputLine` rune-by-rune with the token style, `cursorX`), `style.go` (`stPaste`), `transcript.go` (`Entry.Full`, `AddUserFull`, `Plain` uses Full), `turn.go` (`submit`/`dispatch`/`startTurn` take a `Prompt`; mentions from `Typed` only). Tests: `view_test.go` (+3, paste helper, short-paste test now covers Tab), `turn_test.go` (+1, callers use `promptOf`). Docs EN+FR: `how-to/use-the-window-mode.md` ("Paste long text" section), `reference/slash-commands.md` (bracketed-paste row). Ticket 0012: Progress 3 + closed task 11. | ||
| 170 | -- **Decisions**: threshold = more than `inputHeight` (3) lines or more than 200 chars; token kept in the transcript (readability), full text in history/session/`/copy all` (`Entry.Full`); `@path` inside a paste NOT expanded; pasted Tab inserted as a tab (previously moved the focus); no `/paste` peek command (View/runner split makes it non-trivial — offered as a follow-up); no renumbering after a token is deleted. Rejected: inlining a truncated preview in the box (hides the typed text), storing pastes in the runner (the box owns them until Enter). | ||
| 171 | -- **Tests**: `go test -race ./...` 16 packages ok. Pty check with `/tmp/mm-linux -tui`: 50-line bracketed paste → box shows `[Pasted #1 · 50 lines · 1.0k chars]`, no pasted line drawn; Enter → conversation shows `explain [Pasted #1 …`. | ||
| 172 | -- **Quality**: gate FAIL on pre-existing debt only — 63 warnings (unchanged), 18 smells (unchanged after moving the paste handlers out of `events.go`, which had hit file-complexity 50 for one run). Nothing excluded, no threshold changed. | ||
| 173 | -- **Docs**: EN and FR pages above; no package README exists (rule inert); no new package, diagram unchanged. | ||
deleted
.memory/summary.md +0 -68 | deleted file mode 100644 | ||
| @@ -1,68 +0,0 @@ | ||
| 1 | -# mini-me (mm) — project summary | |
| 2 | - | |
| 3 | -## What it is | |
| 4 | - | |
| 5 | -A minimal Go coding agent (`module mm`, Go 1.25 in `go.mod`, builds with Go 1.26.5) that drives a local LLM through the OpenAI-compatible chat-completions API with Genkit (`github.com/firebase/genkit/go` v1.10.0). Three front ends share one loop: a terminal REPL (`internal/agent`), a single-window terminal mode (`internal/tui`, `github.com/gdamore/tcell/v2` v2.13.10, selected with `mm -tui` or `tui: true`, added 2026-09-16) and an Agent Client Protocol façade (`internal/acp`, `github.com/coder/acp-go-sdk` v0.13.5) selected with `mm -acp`. | |
| 6 | - | |
| 7 | -## Architecture (verified 2026-09-15) | |
| 8 | - | |
| 9 | -`main.go` does the wiring only. Packages under `internal/`: `config` (defaults + YAML + `AGENT_*` env overrides), `clipboard` (system clipboard: native tool on PATH, then OSC 52; reports which), `engine` (provider registry `dmr`/`llamacpp`, streaming, watchdog, non-streaming retry, `Summarize`), `tools` (`bash`, `read_skill`, `read_file`, `write_file`, `edit_file`), `fileedit` (exact-replacement editing), `skills` (catalogue from `<skillsDir>/*.md` front matter), `detector` (repeated-action detection), `compact` (history compression), `spinner`, `ui` (`Out` writer + `Sink` event interface the ACP façade implements), `agent`, `acp`, `session` (added 2026-09-15 by the `/new` work — see history; also `AfterTurn`, the history-merge rule all front ends use), `mention` (`@path`, 2026-09-15), `store` (per-project session files, 2026-09-16; `store.Keeper` is the REPL's and the window's side of persistence — moved out of `internal/agent` on 2026-09-16 — the ACP façade has `acp/persist.go` + `acp/replay.go`), `command` (the one slash-command table with per-front-end bits, 2026-09-16), `tui` (the window: `painter/wrap/transcript/render/view/draw/events/picker/sink/turn/tui.go`, Turbo's file layout, 2026-09-16). `compact.Apply` is the one compaction-with-report entry point the three front ends call. | |
| 10 | - | |
| 11 | -## Commands | |
| 12 | - | |
| 13 | -| Purpose | Command | | |
| 14 | -|---------|---------| | |
| 15 | -| Build | `go build -o mm .` | | |
| 16 | -| Install | `./install.sh` (builds, copies to `/usr/local/bin`) | | |
| 17 | -| Test | `go test ./...` | | |
| 18 | -| Run (DMR) | `./mm` (reads `./agent.yaml`; the repo's file is `agent.dmr.yaml`, pass it explicitly) | | |
| 19 | -| Sessions (terminal) | `sessions.enabled: true` in the YAML, then `/sessions`, `/resume [id]`, `/new` | | |
| 20 | -| Run (llama.cpp) | `./mm agent.llamacpp.yaml` | | |
| 21 | -| Window mode | `mm -tui agent.dmr.yaml` (or `tui: true`); `mm -tui | tee` falls back to the REPL | | |
| 22 | -| Editor | `mm -acp` with `AGENT_CONFIG=<absolute path>` | | |
| 23 | -| Quality gate | `python3 ~/.claude/skills/quality/scripts/quality_report.py --workspace .` (report under `.quality/`, exit 0 = pass) | | |
| 24 | - | |
| 25 | -Use `bash -l -c "…"` in this sandbox so `go` is on the PATH. | |
| 26 | - | |
| 27 | -## Decisions in force | |
| 28 | - | |
| 29 | -- Tools return failures as text, never as Go errors (the model must read them). | |
| 30 | -- Full history is kept after a failed/cancelled turn; only an unanswered question is dropped. | |
| 31 | -- One provider type per wire protocol (`openaiCompat`); `dmr` and `llamacpp` are registry entries. | |
| 32 | -- API keys are named by environment variable in YAML, never stored in it. | |
| 33 | -- `contextWindow` is one top-level key shared by the banner and the compression trigger. | |
| 34 | -- Documentation follows Diátaxis, bilingual: `docs/en/` and `docs/fr/` with identical file names; `kits/` and `tmp/` are out of scope. | |
| 35 | -- Slash commands: terminal `/quit`, `/abort`, `/compact`, `/new`; ACP `/new`, `/compact` only (no `/quit`: the editor owns the process; no `/abort`: Escape in Zed cancels through `session/cancel` — user's decision 2026-09-15, an earlier `/abort` was removed), advertised through `available_commands_update` sent right AFTER the `session/new` response is written (a hook on the writer handed to the SDK, `responseWriter` in `internal/acp/acp.go`, fires when the response line carrying the session id goes out). Sending it before the response does not work: Zed drops updates for a session id it has not received yet (user report 2026-09-15; fix confirmed working in Zed by the user). Only what `session/prompt` intercepts is advertised. `/new` and `/compact` are intercepted under `turnMu`, so the history never moves under Genkit. The compaction report line is `compact.Result.Report()`, shared by both front ends. | |
| 36 | -- `/new` resets the history (system prompt alone), the engine's last input-token count, and — terminal only — the loop detector (`detector.Reset`): a new session is a new task, unlike `/compact` which keeps the detector. Over ACP it keeps the session id, `cwd` and "allow always" grants. Shared logic lives in `internal/session`, imported as `history` inside `internal/acp` (name clash with its `session` struct). | |
| 37 | -- Quality gate scope: `.qlty/qlty.toml` excludes `kits/**` and `tmp/**` (user's request, 2026-09-15), drops qlty's default `**/config/**` exclusion so `internal/config` is measured, and enables `gofmt`, `golangci-lint`, `osv-scanner` by hand (`qlty init` only saw tracked files, hence no Go). Do not re-run `qlty init`. | |
| 38 | -- Zed `agent_servers` entry for mm must carry `"type": "custom"` alongside `command`/`args`/`env`; without it Zed rejects the entry (user report, 2026-09-15). Both `how-to/use-from-an-editor.md` pages show the full block. | |
| 39 | -- Skills: two layouts, flat `<name>.md` and `<name>/SKILL.md` (Agent Skills convention, the shipped one); `Read` prefers the flat file; a `README.md` at the skills root is skipped (2026-09-16: the user's `skills/README.md` had been counted as a skill). A relative `skillsDir` is made absolute in `main.go` (`resolveSkillsDir`): from the current directory (terminal, or ACP without a config file) or next to the config file (ACP with one); the banner warns `no skills found in <abs path>` when the count is 0. | |
| 40 | -- `@path` mentions (`internal/mention`, `Expand(input, cwd)`): a typed `@path` that exists (relative to the start directory / session cwd, absolute, or `~/`) appends `[attached file: <abs>]` / `[attached directory: <abs>]` to the message — the exact shape of an ACP `resource_link` — and is echoed (`📎` line in the terminal, `[acp] … attached` on stderr). No picker, no completion, content never inlined; a non-existing path or a `@` glued to a word is left alone. Used by both front ends. | |
| 41 | -- Persistent sessions (2026-09-16, user's spec): per project, `sessions.enabled` (default false) + `sessions.dir` (default `.mm/sessions`, relative to the start directory / ACP session cwd), one JSON file per session (`internal/store`, id = UTC time + 4 random bytes, whole atomic rewrite after every turn, `/compact`, `/new`). Restart = NEW session (mirrors docker agent: no auto-resume); terminal `/resume [id]` (bare = latest other non-empty) and `/sessions`; the terminal creates the file on the first save, not at start. ACP: `loadSession: true` when enabled, `session/load` replays everything (user/agent text, tool calls as completed `tool_call` with recorded input/output; summaries as `🗜️` agent text; tools never re-run) BEFORE the response, then `available_commands_update`; `/new` over ACP archives the old conversation under a new id and reuses the ACP id's file. A resumed/loaded history runs under the CURRENT system prompt (`session.WithSystem`). `session/load` implemented via `sdk.AgentLoader` (separate interface from `sdk.Agent`). docker agent's approach (SQLite in `~/.cagent/session.db`, unstable `session/resume` without replay, `loadSession: false`) was read and deliberately not copied. | |
| 42 | -- Tickets (`.tickets/issues/*.yaml`, IssueSpec extension): edit `title`, `state`, `labels` (from `labels.yaml`), `updatedAt`, the Markdown `body`, and `tasks` in the extension's own item format (examples from the user, 2026-09-16): open task = `- id: <int>` / `title:` / `state: open` / `priority: none|low|medium|high` / `author: {name: k33g, email: ph.charriere@gmail.com}` / `createdAt: <ISO ms Z>`; closed task = same plus `state: closed`, `updatedAt:` and `closedAt:`. Quote titles containing `:` or `#`. `comments` item format still unknown: keep `comments: []`. | |
| 43 | -- Window mode (`internal/tui`, ticket 0012 option B, user's choice 2026-09-16): hand-rolled on tcell, no widget library, Turbo-core's agent window as blueprint. Rules: only the event loop goroutine draws; engine/tool goroutines write the mutex-guarded `Transcript` and `PostEvent(EventInterrupt)`; redraw is state-driven from the transcript every frame. The window is a `ui.Sink` (tools unchanged). Keys: Enter sends, **Ctrl-J**/Alt-Enter newline (Shift-Enter is not detectable), Esc cancels, Ctrl-C = REPL meaning (quit idle / cancel busy — not Turbo's copy), Tab focus, PgUp/PgDn, Ctrl-L clears the VIEW only, F1 = /help, **F2 toggles mouse capture (OFF at start-up so the terminal's own click-and-drag selection works; on = wheel scrolling, Shift+drag selects; state in the status bar)**, **Ctrl-Y = /copy**, `a`/`s`/`r` answer a permission. Enter during a turn cancels it and queues the text (REPL's re-inject rule). Fallback to the REPL when stdin/stdout is not a TTY, decided in `main.go:windowMode` (banner captured into a buffer and shown as the first notice; spinner disabled). `/copy [n|all]` (window: last answer / n-th / whole transcript as plain text; REPL: `/copy [n]` only) goes through `internal/clipboard` — native tool first, OSC 52 fallback (Terminal.app ignores OSC 52; iTerm2/Ghostty honour it) — and the notice names the road. Long pastes (2026-09-16): a bracketed paste is buffered until its end mark (`paste.go`); over 3 lines or 200 chars it becomes one private-use-rune token `[Pasted #n · L lines · C chars]` (atomic for the cursor/Backspace/Delete, numbered per message); Enter hands the runner a `Prompt{Typed, Pastes}` — `Text()` to the model (verbatim), `Display()` to the transcript, `Entry.Full` for `/copy all`/`Plain()`; `@path` is looked up in the typed text only. Not in scope yet: session browser, in-window drag selection, Markdown beyond fences, `/paste n` peek. | |
| 44 | -- `permissions: ask | auto` (default `auto`): read by the window mode only; `ask` gates `bash`/`write_file`/`edit_file` with an inline prompt replacing the box, "allow for this session" remembered per tool; a cancelled turn rejects. Line mode still has no gatekeeper; ACP keeps its dialog. | |
| 45 | -- Slash commands come from ONE table, `internal/command` (`Terminal | Editor | Window` bits): REPL and window get all seven (`quit abort compact new sessions resume help`), ACP advertises only `compact`, `new`. `/help` exists in the two terminal modes (ticket 0001 done). Add a command there, nowhere else. | |
| 46 | -- The package import graph is kept in `docs/diagrams/packages.drawio` (generated from `go list`); update it when a package is added, removed or re-wired. | |
| 47 | - | |
| 48 | -## Known defects (verified 2026-09-15, not fixed) | |
| 49 | - | |
| 50 | -- None open. (The skills-layout bug and the `demo/skills` test path were fixed on 2026-09-15; `go test ./...` passes.) | |
| 51 | - | |
| 52 | -## Quality gate state (2026-09-16, 9 runs in `.quality/history.jsonl`) | |
| 53 | - | |
| 54 | -FAIL on pre-existing debt only: 63 warnings (was 67 before the window mode; `main.go`'s errcheck cleared by `say()`), 19 smells — none in `internal/tui`, `internal/command`, `internal/store`, `main.go`; `blog/fake-agent/main.go` (milo's) and `hello-world/main.go` (user's untracked file) are the only findings outside `internal/`. Earlier state, kept for the record: 67 warnings (55 `osv-scanner` on `go.mod` — 47 against `stdlib@1.25.0`, i.e. the `go` directive, 8 against indirect deps `jsonparser`, `otel`, `x/sys`; 12 `golangci-lint:errcheck` in `main.go`, `internal/engine`, `internal/fileedit`) and 18 smells (complexity: `agent.Run` = 121, `fileedit/diff.go`, `compact.Valid`, `engine.Generate`, `config.validate`, `engine.Explain`). No finding in the `/new` code. 2026-09-16 (copy work): 63 warnings, 18 smells, none in `internal/clipboard`, `internal/tui/copy.go`, `internal/agent/copy.go`. **Trap**: the `~/.qlty` volume is 488 MB and was 100 % full (Go toolchain 251 MB + linters); every plugin then "FATAL"s and the report shows 0 warnings — a tooling failure that looks like an improvement. Fix: `rm -rf ~/.qlty/cache/repos/*/plugin_cachedir/* ~/.qlty/cache/repos/*/out/invoke-*.yaml` (regenerable caches), then re-run. | |
| 55 | - | |
| 56 | -## Repository oddities | |
| 57 | - | |
| 58 | -- Almost everything is untracked in git (only two commits, "Updated."). `.gitignore` exists. | |
| 59 | -- `.tickets/` (IssueSpec) holds three open issues: add a help command, add an about command, improve TUI. | |
| 60 | -- `agent.yaml` names the agent "Bob" in its system prompt; ACP `agentInfo.name` is also `bob`, version `0.11.0`. The binary is `mm`. | |
| 61 | - | |
| 62 | -## Not yet established | |
| 63 | - | |
| 64 | -- The window mode on a real macOS terminal (Terminal.app, iTerm2, Ghostty, Zed's terminal, tmux): Ctrl-J / Alt-Enter detection, Esc latency, resize, colours on light themes. Verified here only on a Linux pseudo-terminal (`python3 pty`) and `tcell.SimulationScreen`. | |
| 65 | - | |
| 66 | -- Whether a real DMR or llama-server run works end to end from this sandbox (no model server here; only the banner and `-h` were exercised). | |
| 67 | -- Whether Zed's Reload Agent renders the `session/load` replay as expected (verified only with a scripted JSON-RPC client, `/tmp/drive_sessions.py` pattern in history 2026-09-16). | |
| 68 | -- Whether the project wants `go.mod`'s `go 1.25.0` bumped to 1.26 and the flagged indirect deps upgraded to clear the osv-scanner findings. | |
| deleted file mode 100644 | |||
| @@ -1,68 +0,0 @@ | |||
| 1 | -# mini-me (mm) — project summary | ||
| 2 | - | ||
| 3 | -## What it is | ||
| 4 | - | ||
| 5 | -A minimal Go coding agent (`module mm`, Go 1.25 in `go.mod`, builds with Go 1.26.5) that drives a local LLM through the OpenAI-compatible chat-completions API with Genkit (`github.com/firebase/genkit/go` v1.10.0). Three front ends share one loop: a terminal REPL (`internal/agent`), a single-window terminal mode (`internal/tui`, `github.com/gdamore/tcell/v2` v2.13.10, selected with `mm -tui` or `tui: true`, added 2026-09-16) and an Agent Client Protocol façade (`internal/acp`, `github.com/coder/acp-go-sdk` v0.13.5) selected with `mm -acp`. | ||
| 6 | - | ||
| 7 | -## Architecture (verified 2026-09-15) | ||
| 8 | - | ||
| 9 | -`main.go` does the wiring only. Packages under `internal/`: `config` (defaults + YAML + `AGENT_*` env overrides), `clipboard` (system clipboard: native tool on PATH, then OSC 52; reports which), `engine` (provider registry `dmr`/`llamacpp`, streaming, watchdog, non-streaming retry, `Summarize`), `tools` (`bash`, `read_skill`, `read_file`, `write_file`, `edit_file`), `fileedit` (exact-replacement editing), `skills` (catalogue from `<skillsDir>/*.md` front matter), `detector` (repeated-action detection), `compact` (history compression), `spinner`, `ui` (`Out` writer + `Sink` event interface the ACP façade implements), `agent`, `acp`, `session` (added 2026-09-15 by the `/new` work — see history; also `AfterTurn`, the history-merge rule all front ends use), `mention` (`@path`, 2026-09-15), `store` (per-project session files, 2026-09-16; `store.Keeper` is the REPL's and the window's side of persistence — moved out of `internal/agent` on 2026-09-16 — the ACP façade has `acp/persist.go` + `acp/replay.go`), `command` (the one slash-command table with per-front-end bits, 2026-09-16), `tui` (the window: `painter/wrap/transcript/render/view/draw/events/picker/sink/turn/tui.go`, Turbo's file layout, 2026-09-16). `compact.Apply` is the one compaction-with-report entry point the three front ends call. | ||
| 10 | - | ||
| 11 | -## Commands | ||
| 12 | - | ||
| 13 | -| Purpose | Command | | ||
| 14 | -|---------|---------| | ||
| 15 | -| Build | `go build -o mm .` | | ||
| 16 | -| Install | `./install.sh` (builds, copies to `/usr/local/bin`) | | ||
| 17 | -| Test | `go test ./...` | | ||
| 18 | -| Run (DMR) | `./mm` (reads `./agent.yaml`; the repo's file is `agent.dmr.yaml`, pass it explicitly) | | ||
| 19 | -| Sessions (terminal) | `sessions.enabled: true` in the YAML, then `/sessions`, `/resume [id]`, `/new` | | ||
| 20 | -| Run (llama.cpp) | `./mm agent.llamacpp.yaml` | | ||
| 21 | -| Window mode | `mm -tui agent.dmr.yaml` (or `tui: true`); `mm -tui | tee` falls back to the REPL | | ||
| 22 | -| Editor | `mm -acp` with `AGENT_CONFIG=<absolute path>` | | ||
| 23 | -| Quality gate | `python3 ~/.claude/skills/quality/scripts/quality_report.py --workspace .` (report under `.quality/`, exit 0 = pass) | | ||
| 24 | - | ||
| 25 | -Use `bash -l -c "…"` in this sandbox so `go` is on the PATH. | ||
| 26 | - | ||
| 27 | -## Decisions in force | ||
| 28 | - | ||
| 29 | -- Tools return failures as text, never as Go errors (the model must read them). | ||
| 30 | -- Full history is kept after a failed/cancelled turn; only an unanswered question is dropped. | ||
| 31 | -- One provider type per wire protocol (`openaiCompat`); `dmr` and `llamacpp` are registry entries. | ||
| 32 | -- API keys are named by environment variable in YAML, never stored in it. | ||
| 33 | -- `contextWindow` is one top-level key shared by the banner and the compression trigger. | ||
| 34 | -- Documentation follows Diátaxis, bilingual: `docs/en/` and `docs/fr/` with identical file names; `kits/` and `tmp/` are out of scope. | ||
| 35 | -- Slash commands: terminal `/quit`, `/abort`, `/compact`, `/new`; ACP `/new`, `/compact` only (no `/quit`: the editor owns the process; no `/abort`: Escape in Zed cancels through `session/cancel` — user's decision 2026-09-15, an earlier `/abort` was removed), advertised through `available_commands_update` sent right AFTER the `session/new` response is written (a hook on the writer handed to the SDK, `responseWriter` in `internal/acp/acp.go`, fires when the response line carrying the session id goes out). Sending it before the response does not work: Zed drops updates for a session id it has not received yet (user report 2026-09-15; fix confirmed working in Zed by the user). Only what `session/prompt` intercepts is advertised. `/new` and `/compact` are intercepted under `turnMu`, so the history never moves under Genkit. The compaction report line is `compact.Result.Report()`, shared by both front ends. | ||
| 36 | -- `/new` resets the history (system prompt alone), the engine's last input-token count, and — terminal only — the loop detector (`detector.Reset`): a new session is a new task, unlike `/compact` which keeps the detector. Over ACP it keeps the session id, `cwd` and "allow always" grants. Shared logic lives in `internal/session`, imported as `history` inside `internal/acp` (name clash with its `session` struct). | ||
| 37 | -- Quality gate scope: `.qlty/qlty.toml` excludes `kits/**` and `tmp/**` (user's request, 2026-09-15), drops qlty's default `**/config/**` exclusion so `internal/config` is measured, and enables `gofmt`, `golangci-lint`, `osv-scanner` by hand (`qlty init` only saw tracked files, hence no Go). Do not re-run `qlty init`. | ||
| 38 | -- Zed `agent_servers` entry for mm must carry `"type": "custom"` alongside `command`/`args`/`env`; without it Zed rejects the entry (user report, 2026-09-15). Both `how-to/use-from-an-editor.md` pages show the full block. | ||
| 39 | -- Skills: two layouts, flat `<name>.md` and `<name>/SKILL.md` (Agent Skills convention, the shipped one); `Read` prefers the flat file; a `README.md` at the skills root is skipped (2026-09-16: the user's `skills/README.md` had been counted as a skill). A relative `skillsDir` is made absolute in `main.go` (`resolveSkillsDir`): from the current directory (terminal, or ACP without a config file) or next to the config file (ACP with one); the banner warns `no skills found in <abs path>` when the count is 0. | ||
| 40 | -- `@path` mentions (`internal/mention`, `Expand(input, cwd)`): a typed `@path` that exists (relative to the start directory / session cwd, absolute, or `~/`) appends `[attached file: <abs>]` / `[attached directory: <abs>]` to the message — the exact shape of an ACP `resource_link` — and is echoed (`📎` line in the terminal, `[acp] … attached` on stderr). No picker, no completion, content never inlined; a non-existing path or a `@` glued to a word is left alone. Used by both front ends. | ||
| 41 | -- Persistent sessions (2026-09-16, user's spec): per project, `sessions.enabled` (default false) + `sessions.dir` (default `.mm/sessions`, relative to the start directory / ACP session cwd), one JSON file per session (`internal/store`, id = UTC time + 4 random bytes, whole atomic rewrite after every turn, `/compact`, `/new`). Restart = NEW session (mirrors docker agent: no auto-resume); terminal `/resume [id]` (bare = latest other non-empty) and `/sessions`; the terminal creates the file on the first save, not at start. ACP: `loadSession: true` when enabled, `session/load` replays everything (user/agent text, tool calls as completed `tool_call` with recorded input/output; summaries as `🗜️` agent text; tools never re-run) BEFORE the response, then `available_commands_update`; `/new` over ACP archives the old conversation under a new id and reuses the ACP id's file. A resumed/loaded history runs under the CURRENT system prompt (`session.WithSystem`). `session/load` implemented via `sdk.AgentLoader` (separate interface from `sdk.Agent`). docker agent's approach (SQLite in `~/.cagent/session.db`, unstable `session/resume` without replay, `loadSession: false`) was read and deliberately not copied. | ||
| 42 | -- Tickets (`.tickets/issues/*.yaml`, IssueSpec extension): edit `title`, `state`, `labels` (from `labels.yaml`), `updatedAt`, the Markdown `body`, and `tasks` in the extension's own item format (examples from the user, 2026-09-16): open task = `- id: <int>` / `title:` / `state: open` / `priority: none|low|medium|high` / `author: {name: k33g, email: ph.charriere@gmail.com}` / `createdAt: <ISO ms Z>`; closed task = same plus `state: closed`, `updatedAt:` and `closedAt:`. Quote titles containing `:` or `#`. `comments` item format still unknown: keep `comments: []`. | ||
| 43 | -- Window mode (`internal/tui`, ticket 0012 option B, user's choice 2026-09-16): hand-rolled on tcell, no widget library, Turbo-core's agent window as blueprint. Rules: only the event loop goroutine draws; engine/tool goroutines write the mutex-guarded `Transcript` and `PostEvent(EventInterrupt)`; redraw is state-driven from the transcript every frame. The window is a `ui.Sink` (tools unchanged). Keys: Enter sends, **Ctrl-J**/Alt-Enter newline (Shift-Enter is not detectable), Esc cancels, Ctrl-C = REPL meaning (quit idle / cancel busy — not Turbo's copy), Tab focus, PgUp/PgDn, Ctrl-L clears the VIEW only, F1 = /help, **F2 toggles mouse capture (OFF at start-up so the terminal's own click-and-drag selection works; on = wheel scrolling, Shift+drag selects; state in the status bar)**, **Ctrl-Y = /copy**, `a`/`s`/`r` answer a permission. Enter during a turn cancels it and queues the text (REPL's re-inject rule). Fallback to the REPL when stdin/stdout is not a TTY, decided in `main.go:windowMode` (banner captured into a buffer and shown as the first notice; spinner disabled). `/copy [n|all]` (window: last answer / n-th / whole transcript as plain text; REPL: `/copy [n]` only) goes through `internal/clipboard` — native tool first, OSC 52 fallback (Terminal.app ignores OSC 52; iTerm2/Ghostty honour it) — and the notice names the road. Long pastes (2026-09-16): a bracketed paste is buffered until its end mark (`paste.go`); over 3 lines or 200 chars it becomes one private-use-rune token `[Pasted #n · L lines · C chars]` (atomic for the cursor/Backspace/Delete, numbered per message); Enter hands the runner a `Prompt{Typed, Pastes}` — `Text()` to the model (verbatim), `Display()` to the transcript, `Entry.Full` for `/copy all`/`Plain()`; `@path` is looked up in the typed text only. Not in scope yet: session browser, in-window drag selection, Markdown beyond fences, `/paste n` peek. | ||
| 44 | -- `permissions: ask | auto` (default `auto`): read by the window mode only; `ask` gates `bash`/`write_file`/`edit_file` with an inline prompt replacing the box, "allow for this session" remembered per tool; a cancelled turn rejects. Line mode still has no gatekeeper; ACP keeps its dialog. | ||
| 45 | -- Slash commands come from ONE table, `internal/command` (`Terminal | Editor | Window` bits): REPL and window get all seven (`quit abort compact new sessions resume help`), ACP advertises only `compact`, `new`. `/help` exists in the two terminal modes (ticket 0001 done). Add a command there, nowhere else. | ||
| 46 | -- The package import graph is kept in `docs/diagrams/packages.drawio` (generated from `go list`); update it when a package is added, removed or re-wired. | ||
| 47 | - | ||
| 48 | -## Known defects (verified 2026-09-15, not fixed) | ||
| 49 | - | ||
| 50 | -- None open. (The skills-layout bug and the `demo/skills` test path were fixed on 2026-09-15; `go test ./...` passes.) | ||
| 51 | - | ||
| 52 | -## Quality gate state (2026-09-16, 9 runs in `.quality/history.jsonl`) | ||
| 53 | - | ||
| 54 | -FAIL on pre-existing debt only: 63 warnings (was 67 before the window mode; `main.go`'s errcheck cleared by `say()`), 19 smells — none in `internal/tui`, `internal/command`, `internal/store`, `main.go`; `blog/fake-agent/main.go` (milo's) and `hello-world/main.go` (user's untracked file) are the only findings outside `internal/`. Earlier state, kept for the record: 67 warnings (55 `osv-scanner` on `go.mod` — 47 against `stdlib@1.25.0`, i.e. the `go` directive, 8 against indirect deps `jsonparser`, `otel`, `x/sys`; 12 `golangci-lint:errcheck` in `main.go`, `internal/engine`, `internal/fileedit`) and 18 smells (complexity: `agent.Run` = 121, `fileedit/diff.go`, `compact.Valid`, `engine.Generate`, `config.validate`, `engine.Explain`). No finding in the `/new` code. 2026-09-16 (copy work): 63 warnings, 18 smells, none in `internal/clipboard`, `internal/tui/copy.go`, `internal/agent/copy.go`. **Trap**: the `~/.qlty` volume is 488 MB and was 100 % full (Go toolchain 251 MB + linters); every plugin then "FATAL"s and the report shows 0 warnings — a tooling failure that looks like an improvement. Fix: `rm -rf ~/.qlty/cache/repos/*/plugin_cachedir/* ~/.qlty/cache/repos/*/out/invoke-*.yaml` (regenerable caches), then re-run. | ||
| 55 | - | ||
| 56 | -## Repository oddities | ||
| 57 | - | ||
| 58 | -- Almost everything is untracked in git (only two commits, "Updated."). `.gitignore` exists. | ||
| 59 | -- `.tickets/` (IssueSpec) holds three open issues: add a help command, add an about command, improve TUI. | ||
| 60 | -- `agent.yaml` names the agent "Bob" in its system prompt; ACP `agentInfo.name` is also `bob`, version `0.11.0`. The binary is `mm`. | ||
| 61 | - | ||
| 62 | -## Not yet established | ||
| 63 | - | ||
| 64 | -- The window mode on a real macOS terminal (Terminal.app, iTerm2, Ghostty, Zed's terminal, tmux): Ctrl-J / Alt-Enter detection, Esc latency, resize, colours on light themes. Verified here only on a Linux pseudo-terminal (`python3 pty`) and `tcell.SimulationScreen`. | ||
| 65 | - | ||
| 66 | -- Whether a real DMR or llama-server run works end to end from this sandbox (no model server here; only the banner and `-h` were exercised). | ||
| 67 | -- Whether Zed's Reload Agent renders the `session/load` replay as expected (verified only with a scripted JSON-RPC client, `/tmp/drive_sessions.py` pattern in history 2026-09-16). | ||
| 68 | -- Whether the project wants `go.mod`'s `go 1.25.0` bumped to 1.26 and the flagged indirect deps upgraded to clear the osv-scanner findings. | ||
deleted
.qlty/.gitignore +0 -7 | deleted file mode 100644 | ||
| @@ -1,7 +0,0 @@ | ||
| 1 | -* | |
| 2 | -!configs | |
| 3 | -!configs/** | |
| 4 | -!hooks | |
| 5 | -!hooks/** | |
| 6 | -!qlty.toml | |
| 7 | -!.gitignore | |
| deleted file mode 100644 | |||
| @@ -1,7 +0,0 @@ | |||
| 1 | -* | ||
| 2 | -!configs | ||
| 3 | -!configs/** | ||
| 4 | -!hooks | ||
| 5 | -!hooks/** | ||
| 6 | -!qlty.toml | ||
| 7 | -!.gitignore | ||
deleted
.qlty/configs/.shellcheckrc +0 -1 | deleted file mode 100644 | ||
| @@ -1 +0,0 @@ | ||
| 1 | -source-path=SCRIPTDIR | |
| \ No newline at end of file | ||
| deleted file mode 100644 | |||
| @@ -1 +0,0 @@ | |||
| 1 | -source-path=SCRIPTDIR | ||
| \ No newline at end of file | \ No newline at end of file | ||
deleted
.qlty/qlty.toml +0 -94 | deleted file mode 100644 | ||
| @@ -1,94 +0,0 @@ | ||
| 1 | -# This file was automatically generated by `qlty init`. | |
| 2 | -# You can modify it to suit your needs. | |
| 3 | -# We recommend you to commit this file to your repository. | |
| 4 | -# | |
| 5 | -# This configuration is used by both Qlty CLI and Qlty Cloud. | |
| 6 | -# | |
| 7 | -# Qlty CLI -- Code quality toolkit for developers | |
| 8 | -# Qlty Cloud -- Fully automated Code Health Platform | |
| 9 | -# | |
| 10 | -# Try Qlty Cloud: https://qlty.sh | |
| 11 | -# | |
| 12 | -# For a guide to configuration, visit https://qlty.sh/d/config | |
| 13 | -# Or for a full reference, visit https://qlty.sh/d/qlty-toml | |
| 14 | -config_version = "0" | |
| 15 | - | |
| 16 | -exclude_patterns = [ | |
| 17 | - "*_min.*", | |
| 18 | - "*-min.*", | |
| 19 | - "*.min.*", | |
| 20 | - "**/.yarn/**", | |
| 21 | - "**/*.d.ts", | |
| 22 | - "**/assets/**", | |
| 23 | - "**/bower_components/**", | |
| 24 | - "**/build/**", | |
| 25 | - "**/cache/**", | |
| 26 | - # "**/config/**" is a qlty default, removed here: internal/config is project | |
| 27 | - # code (the YAML settings loader) and must be measured like the rest. | |
| 28 | - "**/db/**", | |
| 29 | - "**/deps/**", | |
| 30 | - "**/dist/**", | |
| 31 | - "**/extern/**", | |
| 32 | - "**/external/**", | |
| 33 | - "**/generated/**", | |
| 34 | - "**/Godeps/**", | |
| 35 | - "**/gradlew/**", | |
| 36 | - "**/mvnw/**", | |
| 37 | - "**/node_modules/**", | |
| 38 | - "**/protos/**", | |
| 39 | - "**/seed/**", | |
| 40 | - "**/target/**", | |
| 41 | - "**/templates/**", | |
| 42 | - "**/testdata/**", | |
| 43 | - "**/vendor/**", | |
| 44 | - # Excluded at the user's request (2026-09-15): | |
| 45 | - # kits/ is the vendored dev-toolkit kit — the sources installed into | |
| 46 | - # ~/.claude/, including the quality skill's own quality_report.py, so leaving | |
| 47 | - # it in scope would measure the instrument with itself (its subprocess use is | |
| 48 | - # flagged by every Python security linter and cannot be fixed). | |
| 49 | - "kits/**", | |
| 50 | - # tmp/ holds a draft agent (tmp/draft-agent) and a cross-compile script | |
| 51 | - # (tmp/build.sh) that are not part of the mm binary or its tests. | |
| 52 | - "tmp/**", | |
| 53 | -] | |
| 54 | - | |
| 55 | -test_patterns = [ | |
| 56 | - "**/test/**", | |
| 57 | - "**/spec/**", | |
| 58 | - "**/*.test.*", | |
| 59 | - "**/*.spec.*", | |
| 60 | - "**/*_test.*", | |
| 61 | - "**/*_spec.*", | |
| 62 | - "**/test_*.*", | |
| 63 | - "**/spec_*.*", | |
| 64 | -] | |
| 65 | - | |
| 66 | -[smells] | |
| 67 | -mode = "comment" | |
| 68 | - | |
| 69 | -[[source]] | |
| 70 | -name = "default" | |
| 71 | -default = true | |
| 72 | - | |
| 73 | - | |
| 74 | -[[plugin]] | |
| 75 | -name = "ripgrep" | |
| 76 | -mode = "comment" | |
| 77 | - | |
| 78 | -[[plugin]] | |
| 79 | -name = "shellcheck" | |
| 80 | - | |
| 81 | -[[plugin]] | |
| 82 | -name = "trufflehog" | |
| 83 | - | |
| 84 | -# `qlty init` only looks at files git tracks, and at init time every Go file of | |
| 85 | -# this project was still untracked, so it enabled none of the Go plugins. These | |
| 86 | -# are the ones it enables when it does see Go code. | |
| 87 | -[[plugin]] | |
| 88 | -name = "gofmt" | |
| 89 | - | |
| 90 | -[[plugin]] | |
| 91 | -name = "golangci-lint" | |
| 92 | - | |
| 93 | -[[plugin]] | |
| 94 | -name = "osv-scanner" | |
| deleted file mode 100644 | |||
| @@ -1,94 +0,0 @@ | |||
| 1 | -# This file was automatically generated by `qlty init`. | ||
| 2 | -# You can modify it to suit your needs. | ||
| 3 | -# We recommend you to commit this file to your repository. | ||
| 4 | -# | ||
| 5 | -# This configuration is used by both Qlty CLI and Qlty Cloud. | ||
| 6 | -# | ||
| 7 | -# Qlty CLI -- Code quality toolkit for developers | ||
| 8 | -# Qlty Cloud -- Fully automated Code Health Platform | ||
| 9 | -# | ||
| 10 | -# Try Qlty Cloud: https://qlty.sh | ||
| 11 | -# | ||
| 12 | -# For a guide to configuration, visit https://qlty.sh/d/config | ||
| 13 | -# Or for a full reference, visit https://qlty.sh/d/qlty-toml | ||
| 14 | -config_version = "0" | ||
| 15 | - | ||
| 16 | -exclude_patterns = [ | ||
| 17 | - "*_min.*", | ||
| 18 | - "*-min.*", | ||
| 19 | - "*.min.*", | ||
| 20 | - "**/.yarn/**", | ||
| 21 | - "**/*.d.ts", | ||
| 22 | - "**/assets/**", | ||
| 23 | - "**/bower_components/**", | ||
| 24 | - "**/build/**", | ||
| 25 | - "**/cache/**", | ||
| 26 | - # "**/config/**" is a qlty default, removed here: internal/config is project | ||
| 27 | - # code (the YAML settings loader) and must be measured like the rest. | ||
| 28 | - "**/db/**", | ||
| 29 | - "**/deps/**", | ||
| 30 | - "**/dist/**", | ||
| 31 | - "**/extern/**", | ||
| 32 | - "**/external/**", | ||
| 33 | - "**/generated/**", | ||
| 34 | - "**/Godeps/**", | ||
| 35 | - "**/gradlew/**", | ||
| 36 | - "**/mvnw/**", | ||
| 37 | - "**/node_modules/**", | ||
| 38 | - "**/protos/**", | ||
| 39 | - "**/seed/**", | ||
| 40 | - "**/target/**", | ||
| 41 | - "**/templates/**", | ||
| 42 | - "**/testdata/**", | ||
| 43 | - "**/vendor/**", | ||
| 44 | - # Excluded at the user's request (2026-09-15): | ||
| 45 | - # kits/ is the vendored dev-toolkit kit — the sources installed into | ||
| 46 | - # ~/.claude/, including the quality skill's own quality_report.py, so leaving | ||
| 47 | - # it in scope would measure the instrument with itself (its subprocess use is | ||
| 48 | - # flagged by every Python security linter and cannot be fixed). | ||
| 49 | - "kits/**", | ||
| 50 | - # tmp/ holds a draft agent (tmp/draft-agent) and a cross-compile script | ||
| 51 | - # (tmp/build.sh) that are not part of the mm binary or its tests. | ||
| 52 | - "tmp/**", | ||
| 53 | -] | ||
| 54 | - | ||
| 55 | -test_patterns = [ | ||
| 56 | - "**/test/**", | ||
| 57 | - "**/spec/**", | ||
| 58 | - "**/*.test.*", | ||
| 59 | - "**/*.spec.*", | ||
| 60 | - "**/*_test.*", | ||
| 61 | - "**/*_spec.*", | ||
| 62 | - "**/test_*.*", | ||
| 63 | - "**/spec_*.*", | ||
| 64 | -] | ||
| 65 | - | ||
| 66 | -[smells] | ||
| 67 | -mode = "comment" | ||
| 68 | - | ||
| 69 | -[[source]] | ||
| 70 | -name = "default" | ||
| 71 | -default = true | ||
| 72 | - | ||
| 73 | - | ||
| 74 | -[[plugin]] | ||
| 75 | -name = "ripgrep" | ||
| 76 | -mode = "comment" | ||
| 77 | - | ||
| 78 | -[[plugin]] | ||
| 79 | -name = "shellcheck" | ||
| 80 | - | ||
| 81 | -[[plugin]] | ||
| 82 | -name = "trufflehog" | ||
| 83 | - | ||
| 84 | -# `qlty init` only looks at files git tracks, and at init time every Go file of | ||
| 85 | -# this project was still untracked, so it enabled none of the Go plugins. These | ||
| 86 | -# are the ones it enables when it does see Go code. | ||
| 87 | -[[plugin]] | ||
| 88 | -name = "gofmt" | ||
| 89 | - | ||
| 90 | -[[plugin]] | ||
| 91 | -name = "golangci-lint" | ||
| 92 | - | ||
| 93 | -[[plugin]] | ||
| 94 | -name = "osv-scanner" | ||
deleted
.quality/history.jsonl +0 -14 | deleted file mode 100644 | ||
| @@ -1,14 +0,0 @@ | ||
| 1 | -{"branch": "main", "breaches": ["warning-level issues: 69 (max 0)", "code smells: 18 (max 0)"], "commit": "79fc998", "counts": {"warning": 69}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 38, "complex": 620, "cyclo": 994, "fields": 149, "funcs": 156, "lcom": 0, "lines": 4718, "loc": 2954}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 1, "smells": 18, "timestamp": "2026-09-15T22:32:19Z"} | |
| 2 | -{"branch": "main", "breaches": ["warning-level issues: 67 (max 0)", "code smells: 18 (max 0)"], "commit": "79fc998", "counts": {"warning": 67}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 38, "complex": 618, "cyclo": 992, "fields": 149, "funcs": 156, "lcom": 0, "lines": 4719, "loc": 2956}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 2, "smells": 18, "timestamp": "2026-09-15T22:33:07Z"} | |
| 3 | -{"branch": "main", "breaches": ["warning-level issues: 69 (max 0)", "code smells: 20 (max 0)"], "commit": "d722711", "counts": {"warning": 69}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 45, "complex": 770, "cyclo": 1251, "fields": 172, "funcs": 203, "lcom": 0, "lines": 5753, "loc": 3655}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 3, "smells": 20, "timestamp": "2026-09-16T04:25:47Z"} | |
| 4 | -{"branch": "main", "breaches": ["warning-level issues: 68 (max 0)", "code smells: 21 (max 0)"], "commit": "d722711", "counts": {"warning": 68}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 47, "complex": 777, "cyclo": 1277, "fields": 178, "funcs": 220, "lcom": 0, "lines": 5988, "loc": 3830}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 4, "smells": 21, "timestamp": "2026-09-16T04:26:38Z"} | |
| 5 | -{"branch": "main", "breaches": ["warning-level issues: 67 (max 0)", "code smells: 20 (max 0)"], "commit": "d722711", "counts": {"warning": 67}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 48, "complex": 777, "cyclo": 1277, "fields": 183, "funcs": 220, "lcom": 0, "lines": 5998, "loc": 3837}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 5, "smells": 20, "timestamp": "2026-09-16T04:27:10Z"} | |
| 6 | -{"branch": "main", "breaches": ["warning-level issues: 67 (max 0)", "code smells: 19 (max 0)"], "commit": "d722711", "counts": {"warning": 67}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 48, "complex": 778, "cyclo": 1278, "fields": 183, "funcs": 221, "lcom": 0, "lines": 6007, "loc": 3843}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 6, "smells": 19, "timestamp": "2026-09-16T04:31:40Z"} | |
| 7 | -{"branch": "main", "breaches": ["warning-level issues: 69 (max 0)", "code smells: 22 (max 0)"], "commit": "d722711", "counts": {"note": 2, "warning": 69}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 69, "complex": 999, "cyclo": 1842, "fields": 280, "funcs": 361, "lcom": 0, "lines": 8257, "loc": 5493}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 7, "smells": 22, "timestamp": "2026-09-16T05:25:29Z"} | |
| 8 | -{"branch": "main", "breaches": ["warning-level issues: 63 (max 0)", "code smells: 20 (max 0)"], "commit": "d722711", "counts": {"note": 2, "warning": 63}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 69, "complex": 997, "cyclo": 1836, "fields": 280, "funcs": 364, "lcom": 0, "lines": 8269, "loc": 5495}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 8, "smells": 20, "timestamp": "2026-09-16T05:26:49Z"} | |
| 9 | -{"branch": "main", "breaches": ["warning-level issues: 63 (max 0)", "code smells: 19 (max 0)"], "commit": "d722711", "counts": {"note": 2, "warning": 63}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 69, "complex": 997, "cyclo": 1836, "fields": 280, "funcs": 366, "lcom": 0, "lines": 8275, "loc": 5500}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 9, "smells": 19, "timestamp": "2026-09-16T05:27:55Z"} | |
| 10 | -{"branch": "main", "breaches": ["code smells: 19 (max 0)"], "commit": "d722711", "counts": {}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 70, "complex": 1028, "cyclo": 1897, "fields": 282, "funcs": 365, "lcom": 0, "lines": 8345, "loc": 5537}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 10, "smells": 19, "timestamp": "2026-09-16T06:09:34Z"} | |
| 11 | -{"branch": "main", "breaches": ["warning-level issues: 63 (max 0)", "code smells: 18 (max 0)"], "commit": "d722711", "counts": {"warning": 63}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 70, "complex": 1029, "cyclo": 1899, "fields": 282, "funcs": 365, "lcom": 0, "lines": 8366, "loc": 5549}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 11, "smells": 18, "timestamp": "2026-09-16T06:12:48Z"} | |
| 12 | -{"branch": "main", "breaches": ["warning-level issues: 63 (max 0)", "code smells: 19 (max 0)"], "commit": "d722711", "counts": {"warning": 63}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 73, "complex": 1072, "cyclo": 1952, "fields": 291, "funcs": 387, "lcom": 0, "lines": 8660, "loc": 5735}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 12, "smells": 19, "timestamp": "2026-09-16T06:28:23Z"} | |
| 13 | -{"branch": "main", "breaches": ["warning-level issues: 63 (max 0)", "code smells: 19 (max 0)"], "commit": "d722711", "counts": {"warning": 63}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 73, "complex": 1072, "cyclo": 1952, "fields": 291, "funcs": 387, "lcom": 0, "lines": 8660, "loc": 5735}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 13, "smells": 19, "timestamp": "2026-09-16T06:28:41Z"} | |
| 14 | -{"branch": "main", "breaches": ["warning-level issues: 63 (max 0)", "code smells: 18 (max 0)"], "commit": "d722711", "counts": {"warning": 63}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 73, "complex": 1072, "cyclo": 1952, "fields": 291, "funcs": 387, "lcom": 0, "lines": 8662, "loc": 5736}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 14, "smells": 18, "timestamp": "2026-09-16T06:28:58Z"} | |
| deleted file mode 100644 | |||
| @@ -1,14 +0,0 @@ | |||
| 1 | -{"branch": "main", "breaches": ["warning-level issues: 69 (max 0)", "code smells: 18 (max 0)"], "commit": "79fc998", "counts": {"warning": 69}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 38, "complex": 620, "cyclo": 994, "fields": 149, "funcs": 156, "lcom": 0, "lines": 4718, "loc": 2954}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 1, "smells": 18, "timestamp": "2026-09-15T22:32:19Z"} | ||
| 2 | -{"branch": "main", "breaches": ["warning-level issues: 67 (max 0)", "code smells: 18 (max 0)"], "commit": "79fc998", "counts": {"warning": 67}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 38, "complex": 618, "cyclo": 992, "fields": 149, "funcs": 156, "lcom": 0, "lines": 4719, "loc": 2956}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 2, "smells": 18, "timestamp": "2026-09-15T22:33:07Z"} | ||
| 3 | -{"branch": "main", "breaches": ["warning-level issues: 69 (max 0)", "code smells: 20 (max 0)"], "commit": "d722711", "counts": {"warning": 69}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 45, "complex": 770, "cyclo": 1251, "fields": 172, "funcs": 203, "lcom": 0, "lines": 5753, "loc": 3655}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 3, "smells": 20, "timestamp": "2026-09-16T04:25:47Z"} | ||
| 4 | -{"branch": "main", "breaches": ["warning-level issues: 68 (max 0)", "code smells: 21 (max 0)"], "commit": "d722711", "counts": {"warning": 68}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 47, "complex": 777, "cyclo": 1277, "fields": 178, "funcs": 220, "lcom": 0, "lines": 5988, "loc": 3830}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 4, "smells": 21, "timestamp": "2026-09-16T04:26:38Z"} | ||
| 5 | -{"branch": "main", "breaches": ["warning-level issues: 67 (max 0)", "code smells: 20 (max 0)"], "commit": "d722711", "counts": {"warning": 67}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 48, "complex": 777, "cyclo": 1277, "fields": 183, "funcs": 220, "lcom": 0, "lines": 5998, "loc": 3837}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 5, "smells": 20, "timestamp": "2026-09-16T04:27:10Z"} | ||
| 6 | -{"branch": "main", "breaches": ["warning-level issues: 67 (max 0)", "code smells: 19 (max 0)"], "commit": "d722711", "counts": {"warning": 67}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 48, "complex": 778, "cyclo": 1278, "fields": 183, "funcs": 221, "lcom": 0, "lines": 6007, "loc": 3843}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 6, "smells": 19, "timestamp": "2026-09-16T04:31:40Z"} | ||
| 7 | -{"branch": "main", "breaches": ["warning-level issues: 69 (max 0)", "code smells: 22 (max 0)"], "commit": "d722711", "counts": {"note": 2, "warning": 69}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 69, "complex": 999, "cyclo": 1842, "fields": 280, "funcs": 361, "lcom": 0, "lines": 8257, "loc": 5493}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 7, "smells": 22, "timestamp": "2026-09-16T05:25:29Z"} | ||
| 8 | -{"branch": "main", "breaches": ["warning-level issues: 63 (max 0)", "code smells: 20 (max 0)"], "commit": "d722711", "counts": {"note": 2, "warning": 63}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 69, "complex": 997, "cyclo": 1836, "fields": 280, "funcs": 364, "lcom": 0, "lines": 8269, "loc": 5495}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 8, "smells": 20, "timestamp": "2026-09-16T05:26:49Z"} | ||
| 9 | -{"branch": "main", "breaches": ["warning-level issues: 63 (max 0)", "code smells: 19 (max 0)"], "commit": "d722711", "counts": {"note": 2, "warning": 63}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 69, "complex": 997, "cyclo": 1836, "fields": 280, "funcs": 366, "lcom": 0, "lines": 8275, "loc": 5500}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 9, "smells": 19, "timestamp": "2026-09-16T05:27:55Z"} | ||
| 10 | -{"branch": "main", "breaches": ["code smells: 19 (max 0)"], "commit": "d722711", "counts": {}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 70, "complex": 1028, "cyclo": 1897, "fields": 282, "funcs": 365, "lcom": 0, "lines": 8345, "loc": 5537}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 10, "smells": 19, "timestamp": "2026-09-16T06:09:34Z"} | ||
| 11 | -{"branch": "main", "breaches": ["warning-level issues: 63 (max 0)", "code smells: 18 (max 0)"], "commit": "d722711", "counts": {"warning": 63}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 70, "complex": 1029, "cyclo": 1899, "fields": 282, "funcs": 365, "lcom": 0, "lines": 8366, "loc": 5549}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 11, "smells": 18, "timestamp": "2026-09-16T06:12:48Z"} | ||
| 12 | -{"branch": "main", "breaches": ["warning-level issues: 63 (max 0)", "code smells: 19 (max 0)"], "commit": "d722711", "counts": {"warning": 63}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 73, "complex": 1072, "cyclo": 1952, "fields": 291, "funcs": 387, "lcom": 0, "lines": 8660, "loc": 5735}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 12, "smells": 19, "timestamp": "2026-09-16T06:28:23Z"} | ||
| 13 | -{"branch": "main", "breaches": ["warning-level issues: 63 (max 0)", "code smells: 19 (max 0)"], "commit": "d722711", "counts": {"warning": 63}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 73, "complex": 1072, "cyclo": 1952, "fields": 291, "funcs": 387, "lcom": 0, "lines": 8660, "loc": 5735}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 13, "smells": 19, "timestamp": "2026-09-16T06:28:41Z"} | ||
| 14 | -{"branch": "main", "breaches": ["warning-level issues: 63 (max 0)", "code smells: 18 (max 0)"], "commit": "d722711", "counts": {"warning": 63}, "gate": {"max_error": 0, "max_smells": 0, "max_warning": 0}, "gate_passed": false, "metrics": {"classes": 73, "complex": 1072, "cyclo": 1952, "fields": 291, "funcs": 387, "lcom": 0, "lines": 8662, "loc": 5736}, "qlty_version": "qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23)", "run": 14, "smells": 18, "timestamp": "2026-09-16T06:28:58Z"} | ||
deleted
.quality/report-20260915T223219Z.md +0 -114 | deleted file mode 100644 | ||
| @@ -1,114 +0,0 @@ | ||
| 1 | -# Quality report — 2026-09-15T22:32:19Z | |
| 2 | - | |
| 3 | -- **Gate**: ❌ **FAIL** | |
| 4 | -- **Commit**: `79fc998` on `main` | |
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | |
| 6 | -- **Run**: #1 (first recorded run) | |
| 7 | - | |
| 8 | -## Gate violations | |
| 9 | - | |
| 10 | -- warning-level issues: 69 (max 0) | |
| 11 | -- code smells: 18 (max 0) | |
| 12 | - | |
| 13 | -## Lint issues (`qlty check`) | |
| 14 | - | |
| 15 | -| level | count | vs previous | | |
| 16 | -|---|---|---| | |
| 17 | -| warning | 69 | — | | |
| 18 | - | |
| 19 | -### Top rules | |
| 20 | - | |
| 21 | -| rule | count | | |
| 22 | -|---|---| | |
| 23 | -| golangci-lint:errcheck | 12 | | |
| 24 | -| osv-scanner:CVE-2026-32285 | 2 | | |
| 25 | -| osv-scanner:CVE-2026-24051 | 2 | | |
| 26 | -| osv-scanner:CVE-2026-39883 | 2 | | |
| 27 | -| osv-scanner:CVE-2026-29181 | 2 | | |
| 28 | -| osv-scanner:CVE-2026-39824 | 1 | | |
| 29 | -| osv-scanner:CVE-2025-47910 | 1 | | |
| 30 | -| osv-scanner:CVE-2025-47912 | 1 | | |
| 31 | -| osv-scanner:CVE-2025-58183 | 1 | | |
| 32 | -| osv-scanner:CVE-2025-58185 | 1 | | |
| 33 | -| osv-scanner:CVE-2025-58186 | 1 | | |
| 34 | -| osv-scanner:CVE-2025-58187 | 1 | | |
| 35 | -| osv-scanner:CVE-2025-58188 | 1 | | |
| 36 | -| osv-scanner:CVE-2025-58189 | 1 | | |
| 37 | -| osv-scanner:CVE-2025-61723 | 1 | | |
| 38 | - | |
| 39 | -### Most affected files | |
| 40 | - | |
| 41 | -| file | issues | | |
| 42 | -|---|---| | |
| 43 | -| go.mod | 55 | | |
| 44 | -| main.go | 5 | | |
| 45 | -| internal/engine/openai_compat.go | 2 | | |
| 46 | -| internal/fileedit/fileedit_test.go | 2 | | |
| 47 | -| internal/fileedit/textfile.go | 2 | | |
| 48 | -| internal/agent/agent.go | 1 | | |
| 49 | -| internal/engine/engine.go | 1 | | |
| 50 | -| internal/session/session_test.go | 1 | | |
| 51 | - | |
| 52 | -## Code smells (`qlty smells`) | |
| 53 | - | |
| 54 | -Total: **18** (vs previous: —) | |
| 55 | - | |
| 56 | -| smell | file | line | detail | | |
| 57 | -|---|---|---|---| | |
| 58 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | |
| 59 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | |
| 60 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | |
| 61 | -| qlty:return-statements | internal/agent/agent.go | 37 | Function with many returns (count = 6): Run | | |
| 62 | -| qlty:nested-control-flow | internal/agent/agent.go | 199 | Deeply nested control flow (level = 5) | | |
| 63 | -| qlty:nested-control-flow | internal/agent/agent.go | 208 | Deeply nested control flow (level = 5) | | |
| 64 | -| qlty:nested-control-flow | internal/agent/agent.go | 278 | Deeply nested control flow (level = 5) | | |
| 65 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 133) | | |
| 66 | -| qlty:function-complexity | internal/agent/agent.go | 37 | Function with high complexity (count = 121): Run | | |
| 67 | -| qlty:return-statements | internal/config/config.go | 254 | Function with many returns (count = 11): validate | | |
| 68 | -| qlty:return-statements | internal/compact/compact.go | 102 | Function with many returns (count = 6): Compact | | |
| 69 | -| qlty:return-statements | internal/compact/compact.go | 184 | Function with many returns (count = 6): Valid | | |
| 70 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 50) | | |
| 71 | -| qlty:function-complexity | internal/compact/compact.go | 184 | Function with high complexity (count = 22): Valid | | |
| 72 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | |
| 73 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | |
| 74 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | |
| 75 | -| qlty:return-statements | internal/engine/explain.go | 24 | Function with many returns (count = 9): Explain | | |
| 76 | - | |
| 77 | -## Metrics (`qlty metrics`) | |
| 78 | - | |
| 79 | -| metric | total | vs previous | | |
| 80 | -|---|---|---| | |
| 81 | -| funcs | 156 | — | | |
| 82 | -| classes | 38 | — | | |
| 83 | -| fields | 149 | — | | |
| 84 | -| cyclo | 994 | — | | |
| 85 | -| complex | 620 | — | | |
| 86 | -| lcom | 0 | — | | |
| 87 | -| lines | 4718 | — | | |
| 88 | -| loc | 2954 | — | | |
| 89 | - | |
| 90 | -### Most complex files | |
| 91 | - | |
| 92 | -| file | complex | cyclo | loc | | |
| 93 | -|---|---|---|---| | |
| 94 | -| internal/agent/agent.go | 133 | 99 | 268 | | |
| 95 | -| internal/engine/engine.go | 91 | 121 | 347 | | |
| 96 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | |
| 97 | -| internal/compact/compact.go | 50 | 92 | 175 | | |
| 98 | -| internal/tools/files.go | 32 | 50 | 238 | | |
| 99 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | |
| 100 | -| internal/tools/tools.go | 28 | 47 | 191 | | |
| 101 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | |
| 102 | -| internal/skills/skills.go | 20 | 28 | 79 | | |
| 103 | -| internal/fileedit/textfile.go | 15 | 27 | 76 | | |
| 104 | -| main.go | 15 | 31 | 92 | | |
| 105 | -| internal/fileedit/edits.go | 14 | 38 | 88 | | |
| 106 | -| internal/engine/explain.go | 13 | 31 | 58 | | |
| 107 | -| internal/spinner/spinner.go | 13 | 27 | 102 | | |
| 108 | -| internal/acp/acp.go | 11 | 28 | 183 | | |
| 109 | - | |
| 110 | -## Trend | |
| 111 | - | |
| 112 | -| run | timestamp | error | warning | smells | complex | gate | | |
| 113 | -|---|---|---|---|---|---|---| | |
| 114 | -| 1 | 2026-09-15T22:32:19Z | 0 | 69 | 18 | 620 | FAIL | | |
| deleted file mode 100644 | |||
| @@ -1,114 +0,0 @@ | |||
| 1 | -# Quality report — 2026-09-15T22:32:19Z | ||
| 2 | - | ||
| 3 | -- **Gate**: ❌ **FAIL** | ||
| 4 | -- **Commit**: `79fc998` on `main` | ||
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | ||
| 6 | -- **Run**: #1 (first recorded run) | ||
| 7 | - | ||
| 8 | -## Gate violations | ||
| 9 | - | ||
| 10 | -- warning-level issues: 69 (max 0) | ||
| 11 | -- code smells: 18 (max 0) | ||
| 12 | - | ||
| 13 | -## Lint issues (`qlty check`) | ||
| 14 | - | ||
| 15 | -| level | count | vs previous | | ||
| 16 | -|---|---|---| | ||
| 17 | -| warning | 69 | — | | ||
| 18 | - | ||
| 19 | -### Top rules | ||
| 20 | - | ||
| 21 | -| rule | count | | ||
| 22 | -|---|---| | ||
| 23 | -| golangci-lint:errcheck | 12 | | ||
| 24 | -| osv-scanner:CVE-2026-32285 | 2 | | ||
| 25 | -| osv-scanner:CVE-2026-24051 | 2 | | ||
| 26 | -| osv-scanner:CVE-2026-39883 | 2 | | ||
| 27 | -| osv-scanner:CVE-2026-29181 | 2 | | ||
| 28 | -| osv-scanner:CVE-2026-39824 | 1 | | ||
| 29 | -| osv-scanner:CVE-2025-47910 | 1 | | ||
| 30 | -| osv-scanner:CVE-2025-47912 | 1 | | ||
| 31 | -| osv-scanner:CVE-2025-58183 | 1 | | ||
| 32 | -| osv-scanner:CVE-2025-58185 | 1 | | ||
| 33 | -| osv-scanner:CVE-2025-58186 | 1 | | ||
| 34 | -| osv-scanner:CVE-2025-58187 | 1 | | ||
| 35 | -| osv-scanner:CVE-2025-58188 | 1 | | ||
| 36 | -| osv-scanner:CVE-2025-58189 | 1 | | ||
| 37 | -| osv-scanner:CVE-2025-61723 | 1 | | ||
| 38 | - | ||
| 39 | -### Most affected files | ||
| 40 | - | ||
| 41 | -| file | issues | | ||
| 42 | -|---|---| | ||
| 43 | -| go.mod | 55 | | ||
| 44 | -| main.go | 5 | | ||
| 45 | -| internal/engine/openai_compat.go | 2 | | ||
| 46 | -| internal/fileedit/fileedit_test.go | 2 | | ||
| 47 | -| internal/fileedit/textfile.go | 2 | | ||
| 48 | -| internal/agent/agent.go | 1 | | ||
| 49 | -| internal/engine/engine.go | 1 | | ||
| 50 | -| internal/session/session_test.go | 1 | | ||
| 51 | - | ||
| 52 | -## Code smells (`qlty smells`) | ||
| 53 | - | ||
| 54 | -Total: **18** (vs previous: —) | ||
| 55 | - | ||
| 56 | -| smell | file | line | detail | | ||
| 57 | -|---|---|---|---| | ||
| 58 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | ||
| 59 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | ||
| 60 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | ||
| 61 | -| qlty:return-statements | internal/agent/agent.go | 37 | Function with many returns (count = 6): Run | | ||
| 62 | -| qlty:nested-control-flow | internal/agent/agent.go | 199 | Deeply nested control flow (level = 5) | | ||
| 63 | -| qlty:nested-control-flow | internal/agent/agent.go | 208 | Deeply nested control flow (level = 5) | | ||
| 64 | -| qlty:nested-control-flow | internal/agent/agent.go | 278 | Deeply nested control flow (level = 5) | | ||
| 65 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 133) | | ||
| 66 | -| qlty:function-complexity | internal/agent/agent.go | 37 | Function with high complexity (count = 121): Run | | ||
| 67 | -| qlty:return-statements | internal/config/config.go | 254 | Function with many returns (count = 11): validate | | ||
| 68 | -| qlty:return-statements | internal/compact/compact.go | 102 | Function with many returns (count = 6): Compact | | ||
| 69 | -| qlty:return-statements | internal/compact/compact.go | 184 | Function with many returns (count = 6): Valid | | ||
| 70 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 50) | | ||
| 71 | -| qlty:function-complexity | internal/compact/compact.go | 184 | Function with high complexity (count = 22): Valid | | ||
| 72 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | ||
| 73 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | ||
| 74 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | ||
| 75 | -| qlty:return-statements | internal/engine/explain.go | 24 | Function with many returns (count = 9): Explain | | ||
| 76 | - | ||
| 77 | -## Metrics (`qlty metrics`) | ||
| 78 | - | ||
| 79 | -| metric | total | vs previous | | ||
| 80 | -|---|---|---| | ||
| 81 | -| funcs | 156 | — | | ||
| 82 | -| classes | 38 | — | | ||
| 83 | -| fields | 149 | — | | ||
| 84 | -| cyclo | 994 | — | | ||
| 85 | -| complex | 620 | — | | ||
| 86 | -| lcom | 0 | — | | ||
| 87 | -| lines | 4718 | — | | ||
| 88 | -| loc | 2954 | — | | ||
| 89 | - | ||
| 90 | -### Most complex files | ||
| 91 | - | ||
| 92 | -| file | complex | cyclo | loc | | ||
| 93 | -|---|---|---|---| | ||
| 94 | -| internal/agent/agent.go | 133 | 99 | 268 | | ||
| 95 | -| internal/engine/engine.go | 91 | 121 | 347 | | ||
| 96 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | ||
| 97 | -| internal/compact/compact.go | 50 | 92 | 175 | | ||
| 98 | -| internal/tools/files.go | 32 | 50 | 238 | | ||
| 99 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | ||
| 100 | -| internal/tools/tools.go | 28 | 47 | 191 | | ||
| 101 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | ||
| 102 | -| internal/skills/skills.go | 20 | 28 | 79 | | ||
| 103 | -| internal/fileedit/textfile.go | 15 | 27 | 76 | | ||
| 104 | -| main.go | 15 | 31 | 92 | | ||
| 105 | -| internal/fileedit/edits.go | 14 | 38 | 88 | | ||
| 106 | -| internal/engine/explain.go | 13 | 31 | 58 | | ||
| 107 | -| internal/spinner/spinner.go | 13 | 27 | 102 | | ||
| 108 | -| internal/acp/acp.go | 11 | 28 | 183 | | ||
| 109 | - | ||
| 110 | -## Trend | ||
| 111 | - | ||
| 112 | -| run | timestamp | error | warning | smells | complex | gate | | ||
| 113 | -|---|---|---|---|---|---|---| | ||
| 114 | -| 1 | 2026-09-15T22:32:19Z | 0 | 69 | 18 | 620 | FAIL | | ||
deleted
.quality/report-20260915T223307Z.md +0 -113 | deleted file mode 100644 | ||
| @@ -1,113 +0,0 @@ | ||
| 1 | -# Quality report — 2026-09-15T22:33:07Z | |
| 2 | - | |
| 3 | -- **Gate**: ❌ **FAIL** | |
| 4 | -- **Commit**: `79fc998` on `main` | |
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | |
| 6 | -- **Run**: #2 (previous: 2026-09-15T22:32:19Z) | |
| 7 | - | |
| 8 | -## Gate violations | |
| 9 | - | |
| 10 | -- warning-level issues: 67 (max 0) | |
| 11 | -- code smells: 18 (max 0) | |
| 12 | - | |
| 13 | -## Lint issues (`qlty check`) | |
| 14 | - | |
| 15 | -| level | count | vs previous | | |
| 16 | -|---|---|---| | |
| 17 | -| warning | 67 | -2 | | |
| 18 | - | |
| 19 | -### Top rules | |
| 20 | - | |
| 21 | -| rule | count | | |
| 22 | -|---|---| | |
| 23 | -| golangci-lint:errcheck | 12 | | |
| 24 | -| osv-scanner:CVE-2026-32285 | 2 | | |
| 25 | -| osv-scanner:CVE-2026-24051 | 2 | | |
| 26 | -| osv-scanner:CVE-2026-39883 | 2 | | |
| 27 | -| osv-scanner:CVE-2026-29181 | 2 | | |
| 28 | -| osv-scanner:CVE-2026-39824 | 1 | | |
| 29 | -| osv-scanner:CVE-2025-47910 | 1 | | |
| 30 | -| osv-scanner:CVE-2025-47912 | 1 | | |
| 31 | -| osv-scanner:CVE-2025-58183 | 1 | | |
| 32 | -| osv-scanner:CVE-2025-58185 | 1 | | |
| 33 | -| osv-scanner:CVE-2025-58186 | 1 | | |
| 34 | -| osv-scanner:CVE-2025-58187 | 1 | | |
| 35 | -| osv-scanner:CVE-2025-58188 | 1 | | |
| 36 | -| osv-scanner:CVE-2025-58189 | 1 | | |
| 37 | -| osv-scanner:CVE-2025-61723 | 1 | | |
| 38 | - | |
| 39 | -### Most affected files | |
| 40 | - | |
| 41 | -| file | issues | | |
| 42 | -|---|---| | |
| 43 | -| go.mod | 55 | | |
| 44 | -| main.go | 5 | | |
| 45 | -| internal/engine/openai_compat.go | 2 | | |
| 46 | -| internal/fileedit/fileedit_test.go | 2 | | |
| 47 | -| internal/fileedit/textfile.go | 2 | | |
| 48 | -| internal/engine/engine.go | 1 | | |
| 49 | - | |
| 50 | -## Code smells (`qlty smells`) | |
| 51 | - | |
| 52 | -Total: **18** (vs previous: ±0) | |
| 53 | - | |
| 54 | -| smell | file | line | detail | | |
| 55 | -|---|---|---|---| | |
| 56 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | |
| 57 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | |
| 58 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | |
| 59 | -| qlty:return-statements | internal/agent/agent.go | 37 | Function with many returns (count = 6): Run | | |
| 60 | -| qlty:nested-control-flow | internal/agent/agent.go | 199 | Deeply nested control flow (level = 5) | | |
| 61 | -| qlty:nested-control-flow | internal/agent/agent.go | 208 | Deeply nested control flow (level = 5) | | |
| 62 | -| qlty:nested-control-flow | internal/agent/agent.go | 279 | Deeply nested control flow (level = 5) | | |
| 63 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 131) | | |
| 64 | -| qlty:function-complexity | internal/agent/agent.go | 37 | Function with high complexity (count = 119): Run | | |
| 65 | -| qlty:return-statements | internal/config/config.go | 254 | Function with many returns (count = 11): validate | | |
| 66 | -| qlty:return-statements | internal/compact/compact.go | 102 | Function with many returns (count = 6): Compact | | |
| 67 | -| qlty:return-statements | internal/compact/compact.go | 184 | Function with many returns (count = 6): Valid | | |
| 68 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 50) | | |
| 69 | -| qlty:function-complexity | internal/compact/compact.go | 184 | Function with high complexity (count = 22): Valid | | |
| 70 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | |
| 71 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | |
| 72 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | |
| 73 | -| qlty:return-statements | internal/engine/explain.go | 24 | Function with many returns (count = 9): Explain | | |
| 74 | - | |
| 75 | -## Metrics (`qlty metrics`) | |
| 76 | - | |
| 77 | -| metric | total | vs previous | | |
| 78 | -|---|---|---| | |
| 79 | -| funcs | 156 | ±0 | | |
| 80 | -| classes | 38 | ±0 | | |
| 81 | -| fields | 149 | ±0 | | |
| 82 | -| cyclo | 992 | -2 | | |
| 83 | -| complex | 618 | -2 | | |
| 84 | -| lcom | 0 | ±0 | | |
| 85 | -| lines | 4719 | +1 | | |
| 86 | -| loc | 2956 | +2 | | |
| 87 | - | |
| 88 | -### Most complex files | |
| 89 | - | |
| 90 | -| file | complex | cyclo | loc | | |
| 91 | -|---|---|---|---| | |
| 92 | -| internal/agent/agent.go | 131 | 97 | 270 | | |
| 93 | -| internal/engine/engine.go | 91 | 121 | 347 | | |
| 94 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | |
| 95 | -| internal/compact/compact.go | 50 | 92 | 175 | | |
| 96 | -| internal/tools/files.go | 32 | 50 | 238 | | |
| 97 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | |
| 98 | -| internal/tools/tools.go | 28 | 47 | 191 | | |
| 99 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | |
| 100 | -| internal/skills/skills.go | 20 | 28 | 79 | | |
| 101 | -| internal/fileedit/textfile.go | 15 | 27 | 76 | | |
| 102 | -| main.go | 15 | 31 | 92 | | |
| 103 | -| internal/fileedit/edits.go | 14 | 38 | 88 | | |
| 104 | -| internal/engine/explain.go | 13 | 31 | 58 | | |
| 105 | -| internal/spinner/spinner.go | 13 | 27 | 102 | | |
| 106 | -| internal/acp/acp.go | 11 | 28 | 183 | | |
| 107 | - | |
| 108 | -## Trend | |
| 109 | - | |
| 110 | -| run | timestamp | error | warning | smells | complex | gate | | |
| 111 | -|---|---|---|---|---|---|---| | |
| 112 | -| 1 | 2026-09-15T22:32:19Z | 0 | 69 | 18 | 620 | FAIL | | |
| 113 | -| 2 | 2026-09-15T22:33:07Z | 0 | 67 | 18 | 618 | FAIL | | |
| deleted file mode 100644 | |||
| @@ -1,113 +0,0 @@ | |||
| 1 | -# Quality report — 2026-09-15T22:33:07Z | ||
| 2 | - | ||
| 3 | -- **Gate**: ❌ **FAIL** | ||
| 4 | -- **Commit**: `79fc998` on `main` | ||
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | ||
| 6 | -- **Run**: #2 (previous: 2026-09-15T22:32:19Z) | ||
| 7 | - | ||
| 8 | -## Gate violations | ||
| 9 | - | ||
| 10 | -- warning-level issues: 67 (max 0) | ||
| 11 | -- code smells: 18 (max 0) | ||
| 12 | - | ||
| 13 | -## Lint issues (`qlty check`) | ||
| 14 | - | ||
| 15 | -| level | count | vs previous | | ||
| 16 | -|---|---|---| | ||
| 17 | -| warning | 67 | -2 | | ||
| 18 | - | ||
| 19 | -### Top rules | ||
| 20 | - | ||
| 21 | -| rule | count | | ||
| 22 | -|---|---| | ||
| 23 | -| golangci-lint:errcheck | 12 | | ||
| 24 | -| osv-scanner:CVE-2026-32285 | 2 | | ||
| 25 | -| osv-scanner:CVE-2026-24051 | 2 | | ||
| 26 | -| osv-scanner:CVE-2026-39883 | 2 | | ||
| 27 | -| osv-scanner:CVE-2026-29181 | 2 | | ||
| 28 | -| osv-scanner:CVE-2026-39824 | 1 | | ||
| 29 | -| osv-scanner:CVE-2025-47910 | 1 | | ||
| 30 | -| osv-scanner:CVE-2025-47912 | 1 | | ||
| 31 | -| osv-scanner:CVE-2025-58183 | 1 | | ||
| 32 | -| osv-scanner:CVE-2025-58185 | 1 | | ||
| 33 | -| osv-scanner:CVE-2025-58186 | 1 | | ||
| 34 | -| osv-scanner:CVE-2025-58187 | 1 | | ||
| 35 | -| osv-scanner:CVE-2025-58188 | 1 | | ||
| 36 | -| osv-scanner:CVE-2025-58189 | 1 | | ||
| 37 | -| osv-scanner:CVE-2025-61723 | 1 | | ||
| 38 | - | ||
| 39 | -### Most affected files | ||
| 40 | - | ||
| 41 | -| file | issues | | ||
| 42 | -|---|---| | ||
| 43 | -| go.mod | 55 | | ||
| 44 | -| main.go | 5 | | ||
| 45 | -| internal/engine/openai_compat.go | 2 | | ||
| 46 | -| internal/fileedit/fileedit_test.go | 2 | | ||
| 47 | -| internal/fileedit/textfile.go | 2 | | ||
| 48 | -| internal/engine/engine.go | 1 | | ||
| 49 | - | ||
| 50 | -## Code smells (`qlty smells`) | ||
| 51 | - | ||
| 52 | -Total: **18** (vs previous: ±0) | ||
| 53 | - | ||
| 54 | -| smell | file | line | detail | | ||
| 55 | -|---|---|---|---| | ||
| 56 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | ||
| 57 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | ||
| 58 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | ||
| 59 | -| qlty:return-statements | internal/agent/agent.go | 37 | Function with many returns (count = 6): Run | | ||
| 60 | -| qlty:nested-control-flow | internal/agent/agent.go | 199 | Deeply nested control flow (level = 5) | | ||
| 61 | -| qlty:nested-control-flow | internal/agent/agent.go | 208 | Deeply nested control flow (level = 5) | | ||
| 62 | -| qlty:nested-control-flow | internal/agent/agent.go | 279 | Deeply nested control flow (level = 5) | | ||
| 63 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 131) | | ||
| 64 | -| qlty:function-complexity | internal/agent/agent.go | 37 | Function with high complexity (count = 119): Run | | ||
| 65 | -| qlty:return-statements | internal/config/config.go | 254 | Function with many returns (count = 11): validate | | ||
| 66 | -| qlty:return-statements | internal/compact/compact.go | 102 | Function with many returns (count = 6): Compact | | ||
| 67 | -| qlty:return-statements | internal/compact/compact.go | 184 | Function with many returns (count = 6): Valid | | ||
| 68 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 50) | | ||
| 69 | -| qlty:function-complexity | internal/compact/compact.go | 184 | Function with high complexity (count = 22): Valid | | ||
| 70 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | ||
| 71 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | ||
| 72 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | ||
| 73 | -| qlty:return-statements | internal/engine/explain.go | 24 | Function with many returns (count = 9): Explain | | ||
| 74 | - | ||
| 75 | -## Metrics (`qlty metrics`) | ||
| 76 | - | ||
| 77 | -| metric | total | vs previous | | ||
| 78 | -|---|---|---| | ||
| 79 | -| funcs | 156 | ±0 | | ||
| 80 | -| classes | 38 | ±0 | | ||
| 81 | -| fields | 149 | ±0 | | ||
| 82 | -| cyclo | 992 | -2 | | ||
| 83 | -| complex | 618 | -2 | | ||
| 84 | -| lcom | 0 | ±0 | | ||
| 85 | -| lines | 4719 | +1 | | ||
| 86 | -| loc | 2956 | +2 | | ||
| 87 | - | ||
| 88 | -### Most complex files | ||
| 89 | - | ||
| 90 | -| file | complex | cyclo | loc | | ||
| 91 | -|---|---|---|---| | ||
| 92 | -| internal/agent/agent.go | 131 | 97 | 270 | | ||
| 93 | -| internal/engine/engine.go | 91 | 121 | 347 | | ||
| 94 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | ||
| 95 | -| internal/compact/compact.go | 50 | 92 | 175 | | ||
| 96 | -| internal/tools/files.go | 32 | 50 | 238 | | ||
| 97 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | ||
| 98 | -| internal/tools/tools.go | 28 | 47 | 191 | | ||
| 99 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | ||
| 100 | -| internal/skills/skills.go | 20 | 28 | 79 | | ||
| 101 | -| internal/fileedit/textfile.go | 15 | 27 | 76 | | ||
| 102 | -| main.go | 15 | 31 | 92 | | ||
| 103 | -| internal/fileedit/edits.go | 14 | 38 | 88 | | ||
| 104 | -| internal/engine/explain.go | 13 | 31 | 58 | | ||
| 105 | -| internal/spinner/spinner.go | 13 | 27 | 102 | | ||
| 106 | -| internal/acp/acp.go | 11 | 28 | 183 | | ||
| 107 | - | ||
| 108 | -## Trend | ||
| 109 | - | ||
| 110 | -| run | timestamp | error | warning | smells | complex | gate | | ||
| 111 | -|---|---|---|---|---|---|---| | ||
| 112 | -| 1 | 2026-09-15T22:32:19Z | 0 | 69 | 18 | 620 | FAIL | | ||
| 113 | -| 2 | 2026-09-15T22:33:07Z | 0 | 67 | 18 | 618 | FAIL | | ||
deleted
.quality/report-20260916T042547Z.md +0 -117 | deleted file mode 100644 | ||
| @@ -1,117 +0,0 @@ | ||
| 1 | -# Quality report — 2026-09-16T04:25:47Z | |
| 2 | - | |
| 3 | -- **Gate**: ❌ **FAIL** | |
| 4 | -- **Commit**: `d722711` on `main` | |
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | |
| 6 | -- **Run**: #3 (previous: 2026-09-15T22:33:07Z) | |
| 7 | - | |
| 8 | -## Gate violations | |
| 9 | - | |
| 10 | -- warning-level issues: 69 (max 0) | |
| 11 | -- code smells: 20 (max 0) | |
| 12 | - | |
| 13 | -## Lint issues (`qlty check`) | |
| 14 | - | |
| 15 | -| level | count | vs previous | | |
| 16 | -|---|---|---| | |
| 17 | -| warning | 69 | +2 | | |
| 18 | - | |
| 19 | -### Top rules | |
| 20 | - | |
| 21 | -| rule | count | | |
| 22 | -|---|---| | |
| 23 | -| golangci-lint:errcheck | 13 | | |
| 24 | -| osv-scanner:CVE-2026-32285 | 2 | | |
| 25 | -| osv-scanner:CVE-2026-24051 | 2 | | |
| 26 | -| osv-scanner:CVE-2026-39883 | 2 | | |
| 27 | -| osv-scanner:CVE-2026-29181 | 2 | | |
| 28 | -| osv-scanner:CVE-2026-39824 | 1 | | |
| 29 | -| osv-scanner:CVE-2025-47910 | 1 | | |
| 30 | -| osv-scanner:CVE-2025-47912 | 1 | | |
| 31 | -| osv-scanner:CVE-2025-58183 | 1 | | |
| 32 | -| osv-scanner:CVE-2025-58185 | 1 | | |
| 33 | -| osv-scanner:CVE-2025-58186 | 1 | | |
| 34 | -| osv-scanner:CVE-2025-58187 | 1 | | |
| 35 | -| osv-scanner:CVE-2025-58188 | 1 | | |
| 36 | -| osv-scanner:CVE-2025-58189 | 1 | | |
| 37 | -| osv-scanner:CVE-2025-61723 | 1 | | |
| 38 | - | |
| 39 | -### Most affected files | |
| 40 | - | |
| 41 | -| file | issues | | |
| 42 | -|---|---| | |
| 43 | -| go.mod | 55 | | |
| 44 | -| main.go | 5 | | |
| 45 | -| internal/agent/persist_test.go | 2 | | |
| 46 | -| internal/engine/openai_compat.go | 2 | | |
| 47 | -| internal/fileedit/fileedit_test.go | 2 | | |
| 48 | -| internal/fileedit/textfile.go | 2 | | |
| 49 | -| internal/engine/engine.go | 1 | | |
| 50 | - | |
| 51 | -## Code smells (`qlty smells`) | |
| 52 | - | |
| 53 | -Total: **20** (vs previous: +2) | |
| 54 | - | |
| 55 | -| smell | file | line | detail | | |
| 56 | -|---|---|---|---| | |
| 57 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | |
| 58 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | |
| 59 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | |
| 60 | -| qlty:return-statements | internal/acp/acp.go | 271 | Function with many returns (count = 6): Prompt | | |
| 61 | -| qlty:return-statements | internal/agent/agent.go | 37 | Function with many returns (count = 6): Run | | |
| 62 | -| qlty:nested-control-flow | internal/agent/agent.go | 243 | Deeply nested control flow (level = 5) | | |
| 63 | -| qlty:nested-control-flow | internal/agent/agent.go | 252 | Deeply nested control flow (level = 5) | | |
| 64 | -| qlty:nested-control-flow | internal/agent/agent.go | 323 | Deeply nested control flow (level = 5) | | |
| 65 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 140) | | |
| 66 | -| qlty:function-complexity | internal/agent/agent.go | 37 | Function with high complexity (count = 130): Run | | |
| 67 | -| qlty:return-statements | internal/config/config.go | 276 | Function with many returns (count = 12): validate | | |
| 68 | -| qlty:return-statements | internal/compact/compact.go | 127 | Function with many returns (count = 6): Compact | | |
| 69 | -| qlty:return-statements | internal/compact/compact.go | 209 | Function with many returns (count = 6): Valid | | |
| 70 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 52) | | |
| 71 | -| qlty:function-complexity | internal/compact/compact.go | 209 | Function with high complexity (count = 22): Valid | | |
| 72 | -| qlty:return-statements | internal/store/store.go | 93 | Function with many returns (count = 6): Save | | |
| 73 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | |
| 74 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | |
| 75 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | |
| 76 | -| qlty:return-statements | internal/engine/explain.go | 24 | Function with many returns (count = 9): Explain | | |
| 77 | - | |
| 78 | -## Metrics (`qlty metrics`) | |
| 79 | - | |
| 80 | -| metric | total | vs previous | | |
| 81 | -|---|---|---| | |
| 82 | -| funcs | 203 | +47 | | |
| 83 | -| classes | 45 | +7 | | |
| 84 | -| fields | 172 | +23 | | |
| 85 | -| cyclo | 1251 | +259 | | |
| 86 | -| complex | 770 | +152 | | |
| 87 | -| lcom | 0 | ±0 | | |
| 88 | -| lines | 5753 | +1034 | | |
| 89 | -| loc | 3655 | +699 | | |
| 90 | - | |
| 91 | -### Most complex files | |
| 92 | - | |
| 93 | -| file | complex | cyclo | loc | | |
| 94 | -|---|---|---|---| | |
| 95 | -| internal/agent/agent.go | 140 | 104 | 287 | | |
| 96 | -| internal/engine/engine.go | 91 | 121 | 347 | | |
| 97 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | |
| 98 | -| internal/compact/compact.go | 52 | 98 | 191 | | |
| 99 | -| internal/acp/replay.go | 33 | 43 | 95 | | |
| 100 | -| internal/tools/files.go | 32 | 50 | 238 | | |
| 101 | -| internal/agent/persist.go | 29 | 53 | 117 | | |
| 102 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | |
| 103 | -| internal/store/store.go | 28 | 51 | 147 | | |
| 104 | -| internal/tools/tools.go | 28 | 47 | 191 | | |
| 105 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | |
| 106 | -| internal/skills/skills.go | 25 | 36 | 96 | | |
| 107 | -| internal/acp/acp.go | 21 | 49 | 286 | | |
| 108 | -| internal/mention/mention.go | 21 | 38 | 79 | | |
| 109 | -| main.go | 18 | 35 | 108 | | |
| 110 | - | |
| 111 | -## Trend | |
| 112 | - | |
| 113 | -| run | timestamp | error | warning | smells | complex | gate | | |
| 114 | -|---|---|---|---|---|---|---| | |
| 115 | -| 1 | 2026-09-15T22:32:19Z | 0 | 69 | 18 | 620 | FAIL | | |
| 116 | -| 2 | 2026-09-15T22:33:07Z | 0 | 67 | 18 | 618 | FAIL | | |
| 117 | -| 3 | 2026-09-16T04:25:47Z | 0 | 69 | 20 | 770 | FAIL | | |
| deleted file mode 100644 | |||
| @@ -1,117 +0,0 @@ | |||
| 1 | -# Quality report — 2026-09-16T04:25:47Z | ||
| 2 | - | ||
| 3 | -- **Gate**: ❌ **FAIL** | ||
| 4 | -- **Commit**: `d722711` on `main` | ||
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | ||
| 6 | -- **Run**: #3 (previous: 2026-09-15T22:33:07Z) | ||
| 7 | - | ||
| 8 | -## Gate violations | ||
| 9 | - | ||
| 10 | -- warning-level issues: 69 (max 0) | ||
| 11 | -- code smells: 20 (max 0) | ||
| 12 | - | ||
| 13 | -## Lint issues (`qlty check`) | ||
| 14 | - | ||
| 15 | -| level | count | vs previous | | ||
| 16 | -|---|---|---| | ||
| 17 | -| warning | 69 | +2 | | ||
| 18 | - | ||
| 19 | -### Top rules | ||
| 20 | - | ||
| 21 | -| rule | count | | ||
| 22 | -|---|---| | ||
| 23 | -| golangci-lint:errcheck | 13 | | ||
| 24 | -| osv-scanner:CVE-2026-32285 | 2 | | ||
| 25 | -| osv-scanner:CVE-2026-24051 | 2 | | ||
| 26 | -| osv-scanner:CVE-2026-39883 | 2 | | ||
| 27 | -| osv-scanner:CVE-2026-29181 | 2 | | ||
| 28 | -| osv-scanner:CVE-2026-39824 | 1 | | ||
| 29 | -| osv-scanner:CVE-2025-47910 | 1 | | ||
| 30 | -| osv-scanner:CVE-2025-47912 | 1 | | ||
| 31 | -| osv-scanner:CVE-2025-58183 | 1 | | ||
| 32 | -| osv-scanner:CVE-2025-58185 | 1 | | ||
| 33 | -| osv-scanner:CVE-2025-58186 | 1 | | ||
| 34 | -| osv-scanner:CVE-2025-58187 | 1 | | ||
| 35 | -| osv-scanner:CVE-2025-58188 | 1 | | ||
| 36 | -| osv-scanner:CVE-2025-58189 | 1 | | ||
| 37 | -| osv-scanner:CVE-2025-61723 | 1 | | ||
| 38 | - | ||
| 39 | -### Most affected files | ||
| 40 | - | ||
| 41 | -| file | issues | | ||
| 42 | -|---|---| | ||
| 43 | -| go.mod | 55 | | ||
| 44 | -| main.go | 5 | | ||
| 45 | -| internal/agent/persist_test.go | 2 | | ||
| 46 | -| internal/engine/openai_compat.go | 2 | | ||
| 47 | -| internal/fileedit/fileedit_test.go | 2 | | ||
| 48 | -| internal/fileedit/textfile.go | 2 | | ||
| 49 | -| internal/engine/engine.go | 1 | | ||
| 50 | - | ||
| 51 | -## Code smells (`qlty smells`) | ||
| 52 | - | ||
| 53 | -Total: **20** (vs previous: +2) | ||
| 54 | - | ||
| 55 | -| smell | file | line | detail | | ||
| 56 | -|---|---|---|---| | ||
| 57 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | ||
| 58 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | ||
| 59 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | ||
| 60 | -| qlty:return-statements | internal/acp/acp.go | 271 | Function with many returns (count = 6): Prompt | | ||
| 61 | -| qlty:return-statements | internal/agent/agent.go | 37 | Function with many returns (count = 6): Run | | ||
| 62 | -| qlty:nested-control-flow | internal/agent/agent.go | 243 | Deeply nested control flow (level = 5) | | ||
| 63 | -| qlty:nested-control-flow | internal/agent/agent.go | 252 | Deeply nested control flow (level = 5) | | ||
| 64 | -| qlty:nested-control-flow | internal/agent/agent.go | 323 | Deeply nested control flow (level = 5) | | ||
| 65 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 140) | | ||
| 66 | -| qlty:function-complexity | internal/agent/agent.go | 37 | Function with high complexity (count = 130): Run | | ||
| 67 | -| qlty:return-statements | internal/config/config.go | 276 | Function with many returns (count = 12): validate | | ||
| 68 | -| qlty:return-statements | internal/compact/compact.go | 127 | Function with many returns (count = 6): Compact | | ||
| 69 | -| qlty:return-statements | internal/compact/compact.go | 209 | Function with many returns (count = 6): Valid | | ||
| 70 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 52) | | ||
| 71 | -| qlty:function-complexity | internal/compact/compact.go | 209 | Function with high complexity (count = 22): Valid | | ||
| 72 | -| qlty:return-statements | internal/store/store.go | 93 | Function with many returns (count = 6): Save | | ||
| 73 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | ||
| 74 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | ||
| 75 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | ||
| 76 | -| qlty:return-statements | internal/engine/explain.go | 24 | Function with many returns (count = 9): Explain | | ||
| 77 | - | ||
| 78 | -## Metrics (`qlty metrics`) | ||
| 79 | - | ||
| 80 | -| metric | total | vs previous | | ||
| 81 | -|---|---|---| | ||
| 82 | -| funcs | 203 | +47 | | ||
| 83 | -| classes | 45 | +7 | | ||
| 84 | -| fields | 172 | +23 | | ||
| 85 | -| cyclo | 1251 | +259 | | ||
| 86 | -| complex | 770 | +152 | | ||
| 87 | -| lcom | 0 | ±0 | | ||
| 88 | -| lines | 5753 | +1034 | | ||
| 89 | -| loc | 3655 | +699 | | ||
| 90 | - | ||
| 91 | -### Most complex files | ||
| 92 | - | ||
| 93 | -| file | complex | cyclo | loc | | ||
| 94 | -|---|---|---|---| | ||
| 95 | -| internal/agent/agent.go | 140 | 104 | 287 | | ||
| 96 | -| internal/engine/engine.go | 91 | 121 | 347 | | ||
| 97 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | ||
| 98 | -| internal/compact/compact.go | 52 | 98 | 191 | | ||
| 99 | -| internal/acp/replay.go | 33 | 43 | 95 | | ||
| 100 | -| internal/tools/files.go | 32 | 50 | 238 | | ||
| 101 | -| internal/agent/persist.go | 29 | 53 | 117 | | ||
| 102 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | ||
| 103 | -| internal/store/store.go | 28 | 51 | 147 | | ||
| 104 | -| internal/tools/tools.go | 28 | 47 | 191 | | ||
| 105 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | ||
| 106 | -| internal/skills/skills.go | 25 | 36 | 96 | | ||
| 107 | -| internal/acp/acp.go | 21 | 49 | 286 | | ||
| 108 | -| internal/mention/mention.go | 21 | 38 | 79 | | ||
| 109 | -| main.go | 18 | 35 | 108 | | ||
| 110 | - | ||
| 111 | -## Trend | ||
| 112 | - | ||
| 113 | -| run | timestamp | error | warning | smells | complex | gate | | ||
| 114 | -|---|---|---|---|---|---|---| | ||
| 115 | -| 1 | 2026-09-15T22:32:19Z | 0 | 69 | 18 | 620 | FAIL | | ||
| 116 | -| 2 | 2026-09-15T22:33:07Z | 0 | 67 | 18 | 618 | FAIL | | ||
| 117 | -| 3 | 2026-09-16T04:25:47Z | 0 | 69 | 20 | 770 | FAIL | | ||
deleted
.quality/report-20260916T042638Z.md +0 -118 | deleted file mode 100644 | ||
| @@ -1,118 +0,0 @@ | ||
| 1 | -# Quality report — 2026-09-16T04:26:38Z | |
| 2 | - | |
| 3 | -- **Gate**: ❌ **FAIL** | |
| 4 | -- **Commit**: `d722711` on `main` | |
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | |
| 6 | -- **Run**: #4 (previous: 2026-09-16T04:25:47Z) | |
| 7 | - | |
| 8 | -## Gate violations | |
| 9 | - | |
| 10 | -- warning-level issues: 68 (max 0) | |
| 11 | -- code smells: 21 (max 0) | |
| 12 | - | |
| 13 | -## Lint issues (`qlty check`) | |
| 14 | - | |
| 15 | -| level | count | vs previous | | |
| 16 | -|---|---|---| | |
| 17 | -| warning | 68 | -1 | | |
| 18 | - | |
| 19 | -### Top rules | |
| 20 | - | |
| 21 | -| rule | count | | |
| 22 | -|---|---| | |
| 23 | -| golangci-lint:errcheck | 12 | | |
| 24 | -| osv-scanner:CVE-2026-32285 | 2 | | |
| 25 | -| osv-scanner:CVE-2026-24051 | 2 | | |
| 26 | -| osv-scanner:CVE-2026-39883 | 2 | | |
| 27 | -| osv-scanner:CVE-2026-29181 | 2 | | |
| 28 | -| osv-scanner:CVE-2026-39824 | 1 | | |
| 29 | -| osv-scanner:CVE-2025-47910 | 1 | | |
| 30 | -| osv-scanner:CVE-2025-47912 | 1 | | |
| 31 | -| osv-scanner:CVE-2025-58183 | 1 | | |
| 32 | -| osv-scanner:CVE-2025-58185 | 1 | | |
| 33 | -| osv-scanner:CVE-2025-58186 | 1 | | |
| 34 | -| osv-scanner:CVE-2025-58187 | 1 | | |
| 35 | -| osv-scanner:CVE-2025-58188 | 1 | | |
| 36 | -| osv-scanner:CVE-2025-58189 | 1 | | |
| 37 | -| osv-scanner:CVE-2025-61723 | 1 | | |
| 38 | - | |
| 39 | -### Most affected files | |
| 40 | - | |
| 41 | -| file | issues | | |
| 42 | -|---|---| | |
| 43 | -| go.mod | 55 | | |
| 44 | -| main.go | 5 | | |
| 45 | -| internal/engine/openai_compat.go | 2 | | |
| 46 | -| internal/fileedit/fileedit_test.go | 2 | | |
| 47 | -| internal/fileedit/textfile.go | 2 | | |
| 48 | -| internal/agent/persist_test.go | 1 | | |
| 49 | -| internal/engine/engine.go | 1 | | |
| 50 | - | |
| 51 | -## Code smells (`qlty smells`) | |
| 52 | - | |
| 53 | -Total: **21** (vs previous: +1) | |
| 54 | - | |
| 55 | -| smell | file | line | detail | | |
| 56 | -|---|---|---|---| | |
| 57 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | |
| 58 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | |
| 59 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | |
| 60 | -| qlty:return-statements | internal/acp/acp.go | 271 | Function with many returns (count = 6): Prompt | | |
| 61 | -| qlty:function-parameters | internal/agent/agent.go | 438 | Function with many parameters (count = 6): historyCommand | | |
| 62 | -| qlty:return-statements | internal/agent/agent.go | 37 | Function with many returns (count = 6): Run | | |
| 63 | -| qlty:nested-control-flow | internal/agent/agent.go | 216 | Deeply nested control flow (level = 5) | | |
| 64 | -| qlty:nested-control-flow | internal/agent/agent.go | 225 | Deeply nested control flow (level = 5) | | |
| 65 | -| qlty:nested-control-flow | internal/agent/agent.go | 296 | Deeply nested control flow (level = 5) | | |
| 66 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 134) | | |
| 67 | -| qlty:function-complexity | internal/agent/agent.go | 37 | Function with high complexity (count = 120): Run | | |
| 68 | -| qlty:return-statements | blog/fake-agent/main.go | 96 | Function with many returns (count = 6): Prompt | | |
| 69 | -| qlty:return-statements | internal/compact/compact.go | 127 | Function with many returns (count = 6): Compact | | |
| 70 | -| qlty:return-statements | internal/compact/compact.go | 209 | Function with many returns (count = 6): Valid | | |
| 71 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 52) | | |
| 72 | -| qlty:function-complexity | internal/compact/compact.go | 209 | Function with high complexity (count = 22): Valid | | |
| 73 | -| qlty:return-statements | internal/config/config.go | 276 | Function with many returns (count = 12): validate | | |
| 74 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | |
| 75 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | |
| 76 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | |
| 77 | - | |
| 78 | -## Metrics (`qlty metrics`) | |
| 79 | - | |
| 80 | -| metric | total | vs previous | | |
| 81 | -|---|---|---| | |
| 82 | -| funcs | 220 | +17 | | |
| 83 | -| classes | 47 | +2 | | |
| 84 | -| fields | 178 | +6 | | |
| 85 | -| cyclo | 1277 | +26 | | |
| 86 | -| complex | 777 | +7 | | |
| 87 | -| lcom | 0 | ±0 | | |
| 88 | -| lines | 5988 | +235 | | |
| 89 | -| loc | 3830 | +175 | | |
| 90 | - | |
| 91 | -### Most complex files | |
| 92 | - | |
| 93 | -| file | complex | cyclo | loc | | |
| 94 | -|---|---|---|---| | |
| 95 | -| internal/agent/agent.go | 134 | 105 | 290 | | |
| 96 | -| internal/engine/engine.go | 91 | 121 | 347 | | |
| 97 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | |
| 98 | -| internal/compact/compact.go | 52 | 98 | 191 | | |
| 99 | -| internal/acp/replay.go | 33 | 43 | 95 | | |
| 100 | -| internal/tools/files.go | 32 | 50 | 238 | | |
| 101 | -| internal/agent/persist.go | 29 | 53 | 117 | | |
| 102 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | |
| 103 | -| internal/store/store.go | 29 | 53 | 152 | | |
| 104 | -| internal/tools/tools.go | 28 | 47 | 191 | | |
| 105 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | |
| 106 | -| internal/skills/skills.go | 25 | 36 | 96 | | |
| 107 | -| internal/acp/acp.go | 21 | 49 | 286 | | |
| 108 | -| internal/mention/mention.go | 21 | 38 | 79 | | |
| 109 | -| main.go | 18 | 35 | 108 | | |
| 110 | - | |
| 111 | -## Trend | |
| 112 | - | |
| 113 | -| run | timestamp | error | warning | smells | complex | gate | | |
| 114 | -|---|---|---|---|---|---|---| | |
| 115 | -| 1 | 2026-09-15T22:32:19Z | 0 | 69 | 18 | 620 | FAIL | | |
| 116 | -| 2 | 2026-09-15T22:33:07Z | 0 | 67 | 18 | 618 | FAIL | | |
| 117 | -| 3 | 2026-09-16T04:25:47Z | 0 | 69 | 20 | 770 | FAIL | | |
| 118 | -| 4 | 2026-09-16T04:26:38Z | 0 | 68 | 21 | 777 | FAIL | | |
| deleted file mode 100644 | |||
| @@ -1,118 +0,0 @@ | |||
| 1 | -# Quality report — 2026-09-16T04:26:38Z | ||
| 2 | - | ||
| 3 | -- **Gate**: ❌ **FAIL** | ||
| 4 | -- **Commit**: `d722711` on `main` | ||
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | ||
| 6 | -- **Run**: #4 (previous: 2026-09-16T04:25:47Z) | ||
| 7 | - | ||
| 8 | -## Gate violations | ||
| 9 | - | ||
| 10 | -- warning-level issues: 68 (max 0) | ||
| 11 | -- code smells: 21 (max 0) | ||
| 12 | - | ||
| 13 | -## Lint issues (`qlty check`) | ||
| 14 | - | ||
| 15 | -| level | count | vs previous | | ||
| 16 | -|---|---|---| | ||
| 17 | -| warning | 68 | -1 | | ||
| 18 | - | ||
| 19 | -### Top rules | ||
| 20 | - | ||
| 21 | -| rule | count | | ||
| 22 | -|---|---| | ||
| 23 | -| golangci-lint:errcheck | 12 | | ||
| 24 | -| osv-scanner:CVE-2026-32285 | 2 | | ||
| 25 | -| osv-scanner:CVE-2026-24051 | 2 | | ||
| 26 | -| osv-scanner:CVE-2026-39883 | 2 | | ||
| 27 | -| osv-scanner:CVE-2026-29181 | 2 | | ||
| 28 | -| osv-scanner:CVE-2026-39824 | 1 | | ||
| 29 | -| osv-scanner:CVE-2025-47910 | 1 | | ||
| 30 | -| osv-scanner:CVE-2025-47912 | 1 | | ||
| 31 | -| osv-scanner:CVE-2025-58183 | 1 | | ||
| 32 | -| osv-scanner:CVE-2025-58185 | 1 | | ||
| 33 | -| osv-scanner:CVE-2025-58186 | 1 | | ||
| 34 | -| osv-scanner:CVE-2025-58187 | 1 | | ||
| 35 | -| osv-scanner:CVE-2025-58188 | 1 | | ||
| 36 | -| osv-scanner:CVE-2025-58189 | 1 | | ||
| 37 | -| osv-scanner:CVE-2025-61723 | 1 | | ||
| 38 | - | ||
| 39 | -### Most affected files | ||
| 40 | - | ||
| 41 | -| file | issues | | ||
| 42 | -|---|---| | ||
| 43 | -| go.mod | 55 | | ||
| 44 | -| main.go | 5 | | ||
| 45 | -| internal/engine/openai_compat.go | 2 | | ||
| 46 | -| internal/fileedit/fileedit_test.go | 2 | | ||
| 47 | -| internal/fileedit/textfile.go | 2 | | ||
| 48 | -| internal/agent/persist_test.go | 1 | | ||
| 49 | -| internal/engine/engine.go | 1 | | ||
| 50 | - | ||
| 51 | -## Code smells (`qlty smells`) | ||
| 52 | - | ||
| 53 | -Total: **21** (vs previous: +1) | ||
| 54 | - | ||
| 55 | -| smell | file | line | detail | | ||
| 56 | -|---|---|---|---| | ||
| 57 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | ||
| 58 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | ||
| 59 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | ||
| 60 | -| qlty:return-statements | internal/acp/acp.go | 271 | Function with many returns (count = 6): Prompt | | ||
| 61 | -| qlty:function-parameters | internal/agent/agent.go | 438 | Function with many parameters (count = 6): historyCommand | | ||
| 62 | -| qlty:return-statements | internal/agent/agent.go | 37 | Function with many returns (count = 6): Run | | ||
| 63 | -| qlty:nested-control-flow | internal/agent/agent.go | 216 | Deeply nested control flow (level = 5) | | ||
| 64 | -| qlty:nested-control-flow | internal/agent/agent.go | 225 | Deeply nested control flow (level = 5) | | ||
| 65 | -| qlty:nested-control-flow | internal/agent/agent.go | 296 | Deeply nested control flow (level = 5) | | ||
| 66 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 134) | | ||
| 67 | -| qlty:function-complexity | internal/agent/agent.go | 37 | Function with high complexity (count = 120): Run | | ||
| 68 | -| qlty:return-statements | blog/fake-agent/main.go | 96 | Function with many returns (count = 6): Prompt | | ||
| 69 | -| qlty:return-statements | internal/compact/compact.go | 127 | Function with many returns (count = 6): Compact | | ||
| 70 | -| qlty:return-statements | internal/compact/compact.go | 209 | Function with many returns (count = 6): Valid | | ||
| 71 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 52) | | ||
| 72 | -| qlty:function-complexity | internal/compact/compact.go | 209 | Function with high complexity (count = 22): Valid | | ||
| 73 | -| qlty:return-statements | internal/config/config.go | 276 | Function with many returns (count = 12): validate | | ||
| 74 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | ||
| 75 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | ||
| 76 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | ||
| 77 | - | ||
| 78 | -## Metrics (`qlty metrics`) | ||
| 79 | - | ||
| 80 | -| metric | total | vs previous | | ||
| 81 | -|---|---|---| | ||
| 82 | -| funcs | 220 | +17 | | ||
| 83 | -| classes | 47 | +2 | | ||
| 84 | -| fields | 178 | +6 | | ||
| 85 | -| cyclo | 1277 | +26 | | ||
| 86 | -| complex | 777 | +7 | | ||
| 87 | -| lcom | 0 | ±0 | | ||
| 88 | -| lines | 5988 | +235 | | ||
| 89 | -| loc | 3830 | +175 | | ||
| 90 | - | ||
| 91 | -### Most complex files | ||
| 92 | - | ||
| 93 | -| file | complex | cyclo | loc | | ||
| 94 | -|---|---|---|---| | ||
| 95 | -| internal/agent/agent.go | 134 | 105 | 290 | | ||
| 96 | -| internal/engine/engine.go | 91 | 121 | 347 | | ||
| 97 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | ||
| 98 | -| internal/compact/compact.go | 52 | 98 | 191 | | ||
| 99 | -| internal/acp/replay.go | 33 | 43 | 95 | | ||
| 100 | -| internal/tools/files.go | 32 | 50 | 238 | | ||
| 101 | -| internal/agent/persist.go | 29 | 53 | 117 | | ||
| 102 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | ||
| 103 | -| internal/store/store.go | 29 | 53 | 152 | | ||
| 104 | -| internal/tools/tools.go | 28 | 47 | 191 | | ||
| 105 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | ||
| 106 | -| internal/skills/skills.go | 25 | 36 | 96 | | ||
| 107 | -| internal/acp/acp.go | 21 | 49 | 286 | | ||
| 108 | -| internal/mention/mention.go | 21 | 38 | 79 | | ||
| 109 | -| main.go | 18 | 35 | 108 | | ||
| 110 | - | ||
| 111 | -## Trend | ||
| 112 | - | ||
| 113 | -| run | timestamp | error | warning | smells | complex | gate | | ||
| 114 | -|---|---|---|---|---|---|---| | ||
| 115 | -| 1 | 2026-09-15T22:32:19Z | 0 | 69 | 18 | 620 | FAIL | | ||
| 116 | -| 2 | 2026-09-15T22:33:07Z | 0 | 67 | 18 | 618 | FAIL | | ||
| 117 | -| 3 | 2026-09-16T04:25:47Z | 0 | 69 | 20 | 770 | FAIL | | ||
| 118 | -| 4 | 2026-09-16T04:26:38Z | 0 | 68 | 21 | 777 | FAIL | | ||
deleted
.quality/report-20260916T042710Z.md +0 -118 | deleted file mode 100644 | ||
| @@ -1,118 +0,0 @@ | ||
| 1 | -# Quality report — 2026-09-16T04:27:10Z | |
| 2 | - | |
| 3 | -- **Gate**: ❌ **FAIL** | |
| 4 | -- **Commit**: `d722711` on `main` | |
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | |
| 6 | -- **Run**: #5 (previous: 2026-09-16T04:26:38Z) | |
| 7 | - | |
| 8 | -## Gate violations | |
| 9 | - | |
| 10 | -- warning-level issues: 67 (max 0) | |
| 11 | -- code smells: 20 (max 0) | |
| 12 | - | |
| 13 | -## Lint issues (`qlty check`) | |
| 14 | - | |
| 15 | -| level | count | vs previous | | |
| 16 | -|---|---|---| | |
| 17 | -| warning | 67 | -1 | | |
| 18 | - | |
| 19 | -### Top rules | |
| 20 | - | |
| 21 | -| rule | count | | |
| 22 | -|---|---| | |
| 23 | -| golangci-lint:errcheck | 12 | | |
| 24 | -| osv-scanner:CVE-2026-32285 | 2 | | |
| 25 | -| osv-scanner:CVE-2026-24051 | 2 | | |
| 26 | -| osv-scanner:CVE-2026-39883 | 2 | | |
| 27 | -| osv-scanner:CVE-2026-29181 | 2 | | |
| 28 | -| osv-scanner:CVE-2026-39824 | 1 | | |
| 29 | -| osv-scanner:CVE-2025-47910 | 1 | | |
| 30 | -| osv-scanner:CVE-2025-47912 | 1 | | |
| 31 | -| osv-scanner:CVE-2025-58183 | 1 | | |
| 32 | -| osv-scanner:CVE-2025-58185 | 1 | | |
| 33 | -| osv-scanner:CVE-2025-58186 | 1 | | |
| 34 | -| osv-scanner:CVE-2025-58187 | 1 | | |
| 35 | -| osv-scanner:CVE-2025-58188 | 1 | | |
| 36 | -| osv-scanner:CVE-2025-58189 | 1 | | |
| 37 | -| osv-scanner:CVE-2025-61723 | 1 | | |
| 38 | - | |
| 39 | -### Most affected files | |
| 40 | - | |
| 41 | -| file | issues | | |
| 42 | -|---|---| | |
| 43 | -| go.mod | 55 | | |
| 44 | -| main.go | 5 | | |
| 45 | -| internal/engine/openai_compat.go | 2 | | |
| 46 | -| internal/fileedit/fileedit_test.go | 2 | | |
| 47 | -| internal/fileedit/textfile.go | 2 | | |
| 48 | -| internal/engine/engine.go | 1 | | |
| 49 | - | |
| 50 | -## Code smells (`qlty smells`) | |
| 51 | - | |
| 52 | -Total: **20** (vs previous: -1) | |
| 53 | - | |
| 54 | -| smell | file | line | detail | | |
| 55 | -|---|---|---|---| | |
| 56 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | |
| 57 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | |
| 58 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | |
| 59 | -| qlty:return-statements | internal/config/config.go | 276 | Function with many returns (count = 12): validate | | |
| 60 | -| qlty:return-statements | internal/acp/acp.go | 271 | Function with many returns (count = 6): Prompt | | |
| 61 | -| qlty:return-statements | internal/compact/compact.go | 127 | Function with many returns (count = 6): Compact | | |
| 62 | -| qlty:return-statements | internal/compact/compact.go | 209 | Function with many returns (count = 6): Valid | | |
| 63 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 52) | | |
| 64 | -| qlty:function-complexity | internal/compact/compact.go | 209 | Function with high complexity (count = 22): Valid | | |
| 65 | -| qlty:return-statements | internal/agent/agent.go | 37 | Function with many returns (count = 6): Run | | |
| 66 | -| qlty:nested-control-flow | internal/agent/agent.go | 216 | Deeply nested control flow (level = 5) | | |
| 67 | -| qlty:nested-control-flow | internal/agent/agent.go | 225 | Deeply nested control flow (level = 5) | | |
| 68 | -| qlty:nested-control-flow | internal/agent/agent.go | 296 | Deeply nested control flow (level = 5) | | |
| 69 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 134) | | |
| 70 | -| qlty:function-complexity | internal/agent/agent.go | 37 | Function with high complexity (count = 120): Run | | |
| 71 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | |
| 72 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | |
| 73 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | |
| 74 | -| qlty:return-statements | internal/engine/explain.go | 24 | Function with many returns (count = 9): Explain | | |
| 75 | -| qlty:return-statements | blog/fake-agent/main.go | 96 | Function with many returns (count = 6): Prompt | | |
| 76 | - | |
| 77 | -## Metrics (`qlty metrics`) | |
| 78 | - | |
| 79 | -| metric | total | vs previous | | |
| 80 | -|---|---|---| | |
| 81 | -| funcs | 220 | ±0 | | |
| 82 | -| classes | 48 | +1 | | |
| 83 | -| fields | 183 | +5 | | |
| 84 | -| cyclo | 1277 | ±0 | | |
| 85 | -| complex | 777 | ±0 | | |
| 86 | -| lcom | 0 | ±0 | | |
| 87 | -| lines | 5998 | +10 | | |
| 88 | -| loc | 3837 | +7 | | |
| 89 | - | |
| 90 | -### Most complex files | |
| 91 | - | |
| 92 | -| file | complex | cyclo | loc | | |
| 93 | -|---|---|---|---| | |
| 94 | -| internal/agent/agent.go | 134 | 105 | 297 | | |
| 95 | -| internal/engine/engine.go | 91 | 121 | 347 | | |
| 96 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | |
| 97 | -| internal/compact/compact.go | 52 | 98 | 191 | | |
| 98 | -| internal/acp/replay.go | 33 | 43 | 95 | | |
| 99 | -| internal/tools/files.go | 32 | 50 | 238 | | |
| 100 | -| internal/agent/persist.go | 29 | 53 | 117 | | |
| 101 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | |
| 102 | -| internal/store/store.go | 29 | 53 | 152 | | |
| 103 | -| internal/tools/tools.go | 28 | 47 | 191 | | |
| 104 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | |
| 105 | -| internal/skills/skills.go | 25 | 36 | 96 | | |
| 106 | -| internal/acp/acp.go | 21 | 49 | 286 | | |
| 107 | -| internal/mention/mention.go | 21 | 38 | 79 | | |
| 108 | -| main.go | 18 | 35 | 108 | | |
| 109 | - | |
| 110 | -## Trend | |
| 111 | - | |
| 112 | -| run | timestamp | error | warning | smells | complex | gate | | |
| 113 | -|---|---|---|---|---|---|---| | |
| 114 | -| 1 | 2026-09-15T22:32:19Z | 0 | 69 | 18 | 620 | FAIL | | |
| 115 | -| 2 | 2026-09-15T22:33:07Z | 0 | 67 | 18 | 618 | FAIL | | |
| 116 | -| 3 | 2026-09-16T04:25:47Z | 0 | 69 | 20 | 770 | FAIL | | |
| 117 | -| 4 | 2026-09-16T04:26:38Z | 0 | 68 | 21 | 777 | FAIL | | |
| 118 | -| 5 | 2026-09-16T04:27:10Z | 0 | 67 | 20 | 777 | FAIL | | |
| deleted file mode 100644 | |||
| @@ -1,118 +0,0 @@ | |||
| 1 | -# Quality report — 2026-09-16T04:27:10Z | ||
| 2 | - | ||
| 3 | -- **Gate**: ❌ **FAIL** | ||
| 4 | -- **Commit**: `d722711` on `main` | ||
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | ||
| 6 | -- **Run**: #5 (previous: 2026-09-16T04:26:38Z) | ||
| 7 | - | ||
| 8 | -## Gate violations | ||
| 9 | - | ||
| 10 | -- warning-level issues: 67 (max 0) | ||
| 11 | -- code smells: 20 (max 0) | ||
| 12 | - | ||
| 13 | -## Lint issues (`qlty check`) | ||
| 14 | - | ||
| 15 | -| level | count | vs previous | | ||
| 16 | -|---|---|---| | ||
| 17 | -| warning | 67 | -1 | | ||
| 18 | - | ||
| 19 | -### Top rules | ||
| 20 | - | ||
| 21 | -| rule | count | | ||
| 22 | -|---|---| | ||
| 23 | -| golangci-lint:errcheck | 12 | | ||
| 24 | -| osv-scanner:CVE-2026-32285 | 2 | | ||
| 25 | -| osv-scanner:CVE-2026-24051 | 2 | | ||
| 26 | -| osv-scanner:CVE-2026-39883 | 2 | | ||
| 27 | -| osv-scanner:CVE-2026-29181 | 2 | | ||
| 28 | -| osv-scanner:CVE-2026-39824 | 1 | | ||
| 29 | -| osv-scanner:CVE-2025-47910 | 1 | | ||
| 30 | -| osv-scanner:CVE-2025-47912 | 1 | | ||
| 31 | -| osv-scanner:CVE-2025-58183 | 1 | | ||
| 32 | -| osv-scanner:CVE-2025-58185 | 1 | | ||
| 33 | -| osv-scanner:CVE-2025-58186 | 1 | | ||
| 34 | -| osv-scanner:CVE-2025-58187 | 1 | | ||
| 35 | -| osv-scanner:CVE-2025-58188 | 1 | | ||
| 36 | -| osv-scanner:CVE-2025-58189 | 1 | | ||
| 37 | -| osv-scanner:CVE-2025-61723 | 1 | | ||
| 38 | - | ||
| 39 | -### Most affected files | ||
| 40 | - | ||
| 41 | -| file | issues | | ||
| 42 | -|---|---| | ||
| 43 | -| go.mod | 55 | | ||
| 44 | -| main.go | 5 | | ||
| 45 | -| internal/engine/openai_compat.go | 2 | | ||
| 46 | -| internal/fileedit/fileedit_test.go | 2 | | ||
| 47 | -| internal/fileedit/textfile.go | 2 | | ||
| 48 | -| internal/engine/engine.go | 1 | | ||
| 49 | - | ||
| 50 | -## Code smells (`qlty smells`) | ||
| 51 | - | ||
| 52 | -Total: **20** (vs previous: -1) | ||
| 53 | - | ||
| 54 | -| smell | file | line | detail | | ||
| 55 | -|---|---|---|---| | ||
| 56 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | ||
| 57 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | ||
| 58 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | ||
| 59 | -| qlty:return-statements | internal/config/config.go | 276 | Function with many returns (count = 12): validate | | ||
| 60 | -| qlty:return-statements | internal/acp/acp.go | 271 | Function with many returns (count = 6): Prompt | | ||
| 61 | -| qlty:return-statements | internal/compact/compact.go | 127 | Function with many returns (count = 6): Compact | | ||
| 62 | -| qlty:return-statements | internal/compact/compact.go | 209 | Function with many returns (count = 6): Valid | | ||
| 63 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 52) | | ||
| 64 | -| qlty:function-complexity | internal/compact/compact.go | 209 | Function with high complexity (count = 22): Valid | | ||
| 65 | -| qlty:return-statements | internal/agent/agent.go | 37 | Function with many returns (count = 6): Run | | ||
| 66 | -| qlty:nested-control-flow | internal/agent/agent.go | 216 | Deeply nested control flow (level = 5) | | ||
| 67 | -| qlty:nested-control-flow | internal/agent/agent.go | 225 | Deeply nested control flow (level = 5) | | ||
| 68 | -| qlty:nested-control-flow | internal/agent/agent.go | 296 | Deeply nested control flow (level = 5) | | ||
| 69 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 134) | | ||
| 70 | -| qlty:function-complexity | internal/agent/agent.go | 37 | Function with high complexity (count = 120): Run | | ||
| 71 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | ||
| 72 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | ||
| 73 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | ||
| 74 | -| qlty:return-statements | internal/engine/explain.go | 24 | Function with many returns (count = 9): Explain | | ||
| 75 | -| qlty:return-statements | blog/fake-agent/main.go | 96 | Function with many returns (count = 6): Prompt | | ||
| 76 | - | ||
| 77 | -## Metrics (`qlty metrics`) | ||
| 78 | - | ||
| 79 | -| metric | total | vs previous | | ||
| 80 | -|---|---|---| | ||
| 81 | -| funcs | 220 | ±0 | | ||
| 82 | -| classes | 48 | +1 | | ||
| 83 | -| fields | 183 | +5 | | ||
| 84 | -| cyclo | 1277 | ±0 | | ||
| 85 | -| complex | 777 | ±0 | | ||
| 86 | -| lcom | 0 | ±0 | | ||
| 87 | -| lines | 5998 | +10 | | ||
| 88 | -| loc | 3837 | +7 | | ||
| 89 | - | ||
| 90 | -### Most complex files | ||
| 91 | - | ||
| 92 | -| file | complex | cyclo | loc | | ||
| 93 | -|---|---|---|---| | ||
| 94 | -| internal/agent/agent.go | 134 | 105 | 297 | | ||
| 95 | -| internal/engine/engine.go | 91 | 121 | 347 | | ||
| 96 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | ||
| 97 | -| internal/compact/compact.go | 52 | 98 | 191 | | ||
| 98 | -| internal/acp/replay.go | 33 | 43 | 95 | | ||
| 99 | -| internal/tools/files.go | 32 | 50 | 238 | | ||
| 100 | -| internal/agent/persist.go | 29 | 53 | 117 | | ||
| 101 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | ||
| 102 | -| internal/store/store.go | 29 | 53 | 152 | | ||
| 103 | -| internal/tools/tools.go | 28 | 47 | 191 | | ||
| 104 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | ||
| 105 | -| internal/skills/skills.go | 25 | 36 | 96 | | ||
| 106 | -| internal/acp/acp.go | 21 | 49 | 286 | | ||
| 107 | -| internal/mention/mention.go | 21 | 38 | 79 | | ||
| 108 | -| main.go | 18 | 35 | 108 | | ||
| 109 | - | ||
| 110 | -## Trend | ||
| 111 | - | ||
| 112 | -| run | timestamp | error | warning | smells | complex | gate | | ||
| 113 | -|---|---|---|---|---|---|---| | ||
| 114 | -| 1 | 2026-09-15T22:32:19Z | 0 | 69 | 18 | 620 | FAIL | | ||
| 115 | -| 2 | 2026-09-15T22:33:07Z | 0 | 67 | 18 | 618 | FAIL | | ||
| 116 | -| 3 | 2026-09-16T04:25:47Z | 0 | 69 | 20 | 770 | FAIL | | ||
| 117 | -| 4 | 2026-09-16T04:26:38Z | 0 | 68 | 21 | 777 | FAIL | | ||
| 118 | -| 5 | 2026-09-16T04:27:10Z | 0 | 67 | 20 | 777 | FAIL | | ||
deleted
.quality/report-20260916T043140Z.md +0 -118 | deleted file mode 100644 | ||
| @@ -1,118 +0,0 @@ | ||
| 1 | -# Quality report — 2026-09-16T04:31:40Z | |
| 2 | - | |
| 3 | -- **Gate**: ❌ **FAIL** | |
| 4 | -- **Commit**: `d722711` on `main` | |
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | |
| 6 | -- **Run**: #6 (previous: 2026-09-16T04:27:10Z) | |
| 7 | - | |
| 8 | -## Gate violations | |
| 9 | - | |
| 10 | -- warning-level issues: 67 (max 0) | |
| 11 | -- code smells: 19 (max 0) | |
| 12 | - | |
| 13 | -## Lint issues (`qlty check`) | |
| 14 | - | |
| 15 | -| level | count | vs previous | | |
| 16 | -|---|---|---| | |
| 17 | -| warning | 67 | ±0 | | |
| 18 | - | |
| 19 | -### Top rules | |
| 20 | - | |
| 21 | -| rule | count | | |
| 22 | -|---|---| | |
| 23 | -| golangci-lint:errcheck | 12 | | |
| 24 | -| osv-scanner:CVE-2026-32285 | 2 | | |
| 25 | -| osv-scanner:CVE-2026-24051 | 2 | | |
| 26 | -| osv-scanner:CVE-2026-39883 | 2 | | |
| 27 | -| osv-scanner:CVE-2026-29181 | 2 | | |
| 28 | -| osv-scanner:CVE-2026-39824 | 1 | | |
| 29 | -| osv-scanner:CVE-2025-47910 | 1 | | |
| 30 | -| osv-scanner:CVE-2025-47912 | 1 | | |
| 31 | -| osv-scanner:CVE-2025-58183 | 1 | | |
| 32 | -| osv-scanner:CVE-2025-58185 | 1 | | |
| 33 | -| osv-scanner:CVE-2025-58186 | 1 | | |
| 34 | -| osv-scanner:CVE-2025-58187 | 1 | | |
| 35 | -| osv-scanner:CVE-2025-58188 | 1 | | |
| 36 | -| osv-scanner:CVE-2025-58189 | 1 | | |
| 37 | -| osv-scanner:CVE-2025-61723 | 1 | | |
| 38 | - | |
| 39 | -### Most affected files | |
| 40 | - | |
| 41 | -| file | issues | | |
| 42 | -|---|---| | |
| 43 | -| go.mod | 55 | | |
| 44 | -| main.go | 5 | | |
| 45 | -| internal/engine/openai_compat.go | 2 | | |
| 46 | -| internal/fileedit/fileedit_test.go | 2 | | |
| 47 | -| internal/fileedit/textfile.go | 2 | | |
| 48 | -| internal/engine/engine.go | 1 | | |
| 49 | - | |
| 50 | -## Code smells (`qlty smells`) | |
| 51 | - | |
| 52 | -Total: **19** (vs previous: -1) | |
| 53 | - | |
| 54 | -| smell | file | line | detail | | |
| 55 | -|---|---|---|---| | |
| 56 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | |
| 57 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | |
| 58 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | |
| 59 | -| qlty:return-statements | internal/agent/agent.go | 37 | Function with many returns (count = 6): Run | | |
| 60 | -| qlty:nested-control-flow | internal/agent/agent.go | 216 | Deeply nested control flow (level = 5) | | |
| 61 | -| qlty:nested-control-flow | internal/agent/agent.go | 225 | Deeply nested control flow (level = 5) | | |
| 62 | -| qlty:nested-control-flow | internal/agent/agent.go | 296 | Deeply nested control flow (level = 5) | | |
| 63 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 134) | | |
| 64 | -| qlty:function-complexity | internal/agent/agent.go | 37 | Function with high complexity (count = 120): Run | | |
| 65 | -| qlty:return-statements | internal/config/config.go | 276 | Function with many returns (count = 12): validate | | |
| 66 | -| qlty:return-statements | internal/compact/compact.go | 127 | Function with many returns (count = 6): Compact | | |
| 67 | -| qlty:return-statements | internal/compact/compact.go | 209 | Function with many returns (count = 6): Valid | | |
| 68 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 52) | | |
| 69 | -| qlty:function-complexity | internal/compact/compact.go | 209 | Function with high complexity (count = 22): Valid | | |
| 70 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | |
| 71 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | |
| 72 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | |
| 73 | -| qlty:return-statements | internal/engine/explain.go | 24 | Function with many returns (count = 9): Explain | | |
| 74 | -| qlty:return-statements | blog/fake-agent/main.go | 96 | Function with many returns (count = 6): Prompt | | |
| 75 | - | |
| 76 | -## Metrics (`qlty metrics`) | |
| 77 | - | |
| 78 | -| metric | total | vs previous | | |
| 79 | -|---|---|---| | |
| 80 | -| funcs | 221 | +1 | | |
| 81 | -| classes | 48 | ±0 | | |
| 82 | -| fields | 183 | ±0 | | |
| 83 | -| cyclo | 1278 | +1 | | |
| 84 | -| complex | 778 | +1 | | |
| 85 | -| lcom | 0 | ±0 | | |
| 86 | -| lines | 6007 | +9 | | |
| 87 | -| loc | 3843 | +6 | | |
| 88 | - | |
| 89 | -### Most complex files | |
| 90 | - | |
| 91 | -| file | complex | cyclo | loc | | |
| 92 | -|---|---|---|---| | |
| 93 | -| internal/agent/agent.go | 134 | 105 | 297 | | |
| 94 | -| internal/engine/engine.go | 91 | 121 | 347 | | |
| 95 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | |
| 96 | -| internal/compact/compact.go | 52 | 98 | 191 | | |
| 97 | -| internal/acp/replay.go | 33 | 43 | 95 | | |
| 98 | -| internal/tools/files.go | 32 | 50 | 238 | | |
| 99 | -| internal/agent/persist.go | 29 | 53 | 117 | | |
| 100 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | |
| 101 | -| internal/store/store.go | 29 | 53 | 152 | | |
| 102 | -| internal/tools/tools.go | 28 | 47 | 191 | | |
| 103 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | |
| 104 | -| internal/skills/skills.go | 25 | 36 | 96 | | |
| 105 | -| internal/acp/acp.go | 22 | 50 | 292 | | |
| 106 | -| internal/mention/mention.go | 21 | 38 | 79 | | |
| 107 | -| main.go | 18 | 35 | 108 | | |
| 108 | - | |
| 109 | -## Trend | |
| 110 | - | |
| 111 | -| run | timestamp | error | warning | smells | complex | gate | | |
| 112 | -|---|---|---|---|---|---|---| | |
| 113 | -| 1 | 2026-09-15T22:32:19Z | 0 | 69 | 18 | 620 | FAIL | | |
| 114 | -| 2 | 2026-09-15T22:33:07Z | 0 | 67 | 18 | 618 | FAIL | | |
| 115 | -| 3 | 2026-09-16T04:25:47Z | 0 | 69 | 20 | 770 | FAIL | | |
| 116 | -| 4 | 2026-09-16T04:26:38Z | 0 | 68 | 21 | 777 | FAIL | | |
| 117 | -| 5 | 2026-09-16T04:27:10Z | 0 | 67 | 20 | 777 | FAIL | | |
| 118 | -| 6 | 2026-09-16T04:31:40Z | 0 | 67 | 19 | 778 | FAIL | | |
| deleted file mode 100644 | |||
| @@ -1,118 +0,0 @@ | |||
| 1 | -# Quality report — 2026-09-16T04:31:40Z | ||
| 2 | - | ||
| 3 | -- **Gate**: ❌ **FAIL** | ||
| 4 | -- **Commit**: `d722711` on `main` | ||
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | ||
| 6 | -- **Run**: #6 (previous: 2026-09-16T04:27:10Z) | ||
| 7 | - | ||
| 8 | -## Gate violations | ||
| 9 | - | ||
| 10 | -- warning-level issues: 67 (max 0) | ||
| 11 | -- code smells: 19 (max 0) | ||
| 12 | - | ||
| 13 | -## Lint issues (`qlty check`) | ||
| 14 | - | ||
| 15 | -| level | count | vs previous | | ||
| 16 | -|---|---|---| | ||
| 17 | -| warning | 67 | ±0 | | ||
| 18 | - | ||
| 19 | -### Top rules | ||
| 20 | - | ||
| 21 | -| rule | count | | ||
| 22 | -|---|---| | ||
| 23 | -| golangci-lint:errcheck | 12 | | ||
| 24 | -| osv-scanner:CVE-2026-32285 | 2 | | ||
| 25 | -| osv-scanner:CVE-2026-24051 | 2 | | ||
| 26 | -| osv-scanner:CVE-2026-39883 | 2 | | ||
| 27 | -| osv-scanner:CVE-2026-29181 | 2 | | ||
| 28 | -| osv-scanner:CVE-2026-39824 | 1 | | ||
| 29 | -| osv-scanner:CVE-2025-47910 | 1 | | ||
| 30 | -| osv-scanner:CVE-2025-47912 | 1 | | ||
| 31 | -| osv-scanner:CVE-2025-58183 | 1 | | ||
| 32 | -| osv-scanner:CVE-2025-58185 | 1 | | ||
| 33 | -| osv-scanner:CVE-2025-58186 | 1 | | ||
| 34 | -| osv-scanner:CVE-2025-58187 | 1 | | ||
| 35 | -| osv-scanner:CVE-2025-58188 | 1 | | ||
| 36 | -| osv-scanner:CVE-2025-58189 | 1 | | ||
| 37 | -| osv-scanner:CVE-2025-61723 | 1 | | ||
| 38 | - | ||
| 39 | -### Most affected files | ||
| 40 | - | ||
| 41 | -| file | issues | | ||
| 42 | -|---|---| | ||
| 43 | -| go.mod | 55 | | ||
| 44 | -| main.go | 5 | | ||
| 45 | -| internal/engine/openai_compat.go | 2 | | ||
| 46 | -| internal/fileedit/fileedit_test.go | 2 | | ||
| 47 | -| internal/fileedit/textfile.go | 2 | | ||
| 48 | -| internal/engine/engine.go | 1 | | ||
| 49 | - | ||
| 50 | -## Code smells (`qlty smells`) | ||
| 51 | - | ||
| 52 | -Total: **19** (vs previous: -1) | ||
| 53 | - | ||
| 54 | -| smell | file | line | detail | | ||
| 55 | -|---|---|---|---| | ||
| 56 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | ||
| 57 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | ||
| 58 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | ||
| 59 | -| qlty:return-statements | internal/agent/agent.go | 37 | Function with many returns (count = 6): Run | | ||
| 60 | -| qlty:nested-control-flow | internal/agent/agent.go | 216 | Deeply nested control flow (level = 5) | | ||
| 61 | -| qlty:nested-control-flow | internal/agent/agent.go | 225 | Deeply nested control flow (level = 5) | | ||
| 62 | -| qlty:nested-control-flow | internal/agent/agent.go | 296 | Deeply nested control flow (level = 5) | | ||
| 63 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 134) | | ||
| 64 | -| qlty:function-complexity | internal/agent/agent.go | 37 | Function with high complexity (count = 120): Run | | ||
| 65 | -| qlty:return-statements | internal/config/config.go | 276 | Function with many returns (count = 12): validate | | ||
| 66 | -| qlty:return-statements | internal/compact/compact.go | 127 | Function with many returns (count = 6): Compact | | ||
| 67 | -| qlty:return-statements | internal/compact/compact.go | 209 | Function with many returns (count = 6): Valid | | ||
| 68 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 52) | | ||
| 69 | -| qlty:function-complexity | internal/compact/compact.go | 209 | Function with high complexity (count = 22): Valid | | ||
| 70 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | ||
| 71 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | ||
| 72 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | ||
| 73 | -| qlty:return-statements | internal/engine/explain.go | 24 | Function with many returns (count = 9): Explain | | ||
| 74 | -| qlty:return-statements | blog/fake-agent/main.go | 96 | Function with many returns (count = 6): Prompt | | ||
| 75 | - | ||
| 76 | -## Metrics (`qlty metrics`) | ||
| 77 | - | ||
| 78 | -| metric | total | vs previous | | ||
| 79 | -|---|---|---| | ||
| 80 | -| funcs | 221 | +1 | | ||
| 81 | -| classes | 48 | ±0 | | ||
| 82 | -| fields | 183 | ±0 | | ||
| 83 | -| cyclo | 1278 | +1 | | ||
| 84 | -| complex | 778 | +1 | | ||
| 85 | -| lcom | 0 | ±0 | | ||
| 86 | -| lines | 6007 | +9 | | ||
| 87 | -| loc | 3843 | +6 | | ||
| 88 | - | ||
| 89 | -### Most complex files | ||
| 90 | - | ||
| 91 | -| file | complex | cyclo | loc | | ||
| 92 | -|---|---|---|---| | ||
| 93 | -| internal/agent/agent.go | 134 | 105 | 297 | | ||
| 94 | -| internal/engine/engine.go | 91 | 121 | 347 | | ||
| 95 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | ||
| 96 | -| internal/compact/compact.go | 52 | 98 | 191 | | ||
| 97 | -| internal/acp/replay.go | 33 | 43 | 95 | | ||
| 98 | -| internal/tools/files.go | 32 | 50 | 238 | | ||
| 99 | -| internal/agent/persist.go | 29 | 53 | 117 | | ||
| 100 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | ||
| 101 | -| internal/store/store.go | 29 | 53 | 152 | | ||
| 102 | -| internal/tools/tools.go | 28 | 47 | 191 | | ||
| 103 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | ||
| 104 | -| internal/skills/skills.go | 25 | 36 | 96 | | ||
| 105 | -| internal/acp/acp.go | 22 | 50 | 292 | | ||
| 106 | -| internal/mention/mention.go | 21 | 38 | 79 | | ||
| 107 | -| main.go | 18 | 35 | 108 | | ||
| 108 | - | ||
| 109 | -## Trend | ||
| 110 | - | ||
| 111 | -| run | timestamp | error | warning | smells | complex | gate | | ||
| 112 | -|---|---|---|---|---|---|---| | ||
| 113 | -| 1 | 2026-09-15T22:32:19Z | 0 | 69 | 18 | 620 | FAIL | | ||
| 114 | -| 2 | 2026-09-15T22:33:07Z | 0 | 67 | 18 | 618 | FAIL | | ||
| 115 | -| 3 | 2026-09-16T04:25:47Z | 0 | 69 | 20 | 770 | FAIL | | ||
| 116 | -| 4 | 2026-09-16T04:26:38Z | 0 | 68 | 21 | 777 | FAIL | | ||
| 117 | -| 5 | 2026-09-16T04:27:10Z | 0 | 67 | 20 | 777 | FAIL | | ||
| 118 | -| 6 | 2026-09-16T04:31:40Z | 0 | 67 | 19 | 778 | FAIL | | ||
deleted
.quality/report-20260916T052529Z.md +0 -123 | deleted file mode 100644 | ||
| @@ -1,123 +0,0 @@ | ||
| 1 | -# Quality report — 2026-09-16T05:25:29Z | |
| 2 | - | |
| 3 | -- **Gate**: ❌ **FAIL** | |
| 4 | -- **Commit**: `d722711` on `main` | |
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | |
| 6 | -- **Run**: #7 (previous: 2026-09-16T04:31:40Z) | |
| 7 | - | |
| 8 | -## Gate violations | |
| 9 | - | |
| 10 | -- warning-level issues: 69 (max 0) | |
| 11 | -- code smells: 22 (max 0) | |
| 12 | - | |
| 13 | -## Lint issues (`qlty check`) | |
| 14 | - | |
| 15 | -| level | count | vs previous | | |
| 16 | -|---|---|---| | |
| 17 | -| warning | 69 | +2 | | |
| 18 | -| note | 2 | — | | |
| 19 | - | |
| 20 | -### Top rules | |
| 21 | - | |
| 22 | -| rule | count | | |
| 23 | -|---|---| | |
| 24 | -| golangci-lint:errcheck | 12 | | |
| 25 | -| osv-scanner:CVE-2026-32285 | 2 | | |
| 26 | -| osv-scanner:CVE-2026-24051 | 2 | | |
| 27 | -| osv-scanner:CVE-2026-39883 | 2 | | |
| 28 | -| osv-scanner:CVE-2026-29181 | 2 | | |
| 29 | -| osv-scanner:CVE-2026-39824 | 1 | | |
| 30 | -| osv-scanner:CVE-2026-56852 | 1 | | |
| 31 | -| osv-scanner:CVE-2025-47910 | 1 | | |
| 32 | -| osv-scanner:CVE-2025-47912 | 1 | | |
| 33 | -| osv-scanner:CVE-2025-58183 | 1 | | |
| 34 | -| osv-scanner:CVE-2025-58185 | 1 | | |
| 35 | -| osv-scanner:CVE-2025-58186 | 1 | | |
| 36 | -| osv-scanner:CVE-2025-58187 | 1 | | |
| 37 | -| osv-scanner:CVE-2025-58188 | 1 | | |
| 38 | -| osv-scanner:CVE-2025-58189 | 1 | | |
| 39 | - | |
| 40 | -### Most affected files | |
| 41 | - | |
| 42 | -| file | issues | | |
| 43 | -|---|---| | |
| 44 | -| go.mod | 56 | | |
| 45 | -| main.go | 5 | | |
| 46 | -| hello-world/main.go | 2 | | |
| 47 | -| internal/engine/openai_compat.go | 2 | | |
| 48 | -| internal/fileedit/fileedit_test.go | 2 | | |
| 49 | -| internal/fileedit/textfile.go | 2 | | |
| 50 | -| internal/engine/engine.go | 1 | | |
| 51 | -| internal/tui/tui_test.go | 1 | | |
| 52 | - | |
| 53 | -## Code smells (`qlty smells`) | |
| 54 | - | |
| 55 | -Total: **22** (vs previous: +3) | |
| 56 | - | |
| 57 | -| smell | file | line | detail | | |
| 58 | -|---|---|---|---| | |
| 59 | -| qlty:function-complexity | main.go | 53 | Function with high complexity (count = 22): main | | |
| 60 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | |
| 61 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | |
| 62 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | |
| 63 | -| qlty:return-statements | internal/agent/agent.go | 38 | Function with many returns (count = 6): Run | | |
| 64 | -| qlty:nested-control-flow | internal/agent/agent.go | 212 | Deeply nested control flow (level = 5) | | |
| 65 | -| qlty:nested-control-flow | internal/agent/agent.go | 221 | Deeply nested control flow (level = 5) | | |
| 66 | -| qlty:nested-control-flow | internal/agent/agent.go | 293 | Deeply nested control flow (level = 5) | | |
| 67 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 126) | | |
| 68 | -| qlty:function-complexity | internal/agent/agent.go | 38 | Function with high complexity (count = 110): Run | | |
| 69 | -| qlty:return-statements | internal/config/config.go | 293 | Function with many returns (count = 13): validate | | |
| 70 | -| qlty:return-statements | internal/tui/style.go | 30 | Function with many returns (count = 10): styleOf | | |
| 71 | -| qlty:return-statements | internal/compact/compact.go | 129 | Function with many returns (count = 6): Compact | | |
| 72 | -| qlty:return-statements | internal/compact/compact.go | 211 | Function with many returns (count = 6): Valid | | |
| 73 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 52) | | |
| 74 | -| qlty:function-complexity | internal/compact/compact.go | 211 | Function with high complexity (count = 22): Valid | | |
| 75 | -| qlty:return-statements | internal/store/keeper.go | 100 | Function with many returns (count = 6): Resume | | |
| 76 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | |
| 77 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | |
| 78 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | |
| 79 | - | |
| 80 | -## Metrics (`qlty metrics`) | |
| 81 | - | |
| 82 | -| metric | total | vs previous | | |
| 83 | -|---|---|---| | |
| 84 | -| funcs | 361 | +140 | | |
| 85 | -| classes | 69 | +21 | | |
| 86 | -| fields | 280 | +97 | | |
| 87 | -| cyclo | 1842 | +564 | | |
| 88 | -| complex | 999 | +221 | | |
| 89 | -| lcom | 0 | ±0 | | |
| 90 | -| lines | 8257 | +2250 | | |
| 91 | -| loc | 5493 | +1650 | | |
| 92 | - | |
| 93 | -### Most complex files | |
| 94 | - | |
| 95 | -| file | complex | cyclo | loc | | |
| 96 | -|---|---|---|---| | |
| 97 | -| internal/agent/agent.go | 126 | 92 | 296 | | |
| 98 | -| internal/engine/engine.go | 91 | 121 | 347 | | |
| 99 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | |
| 100 | -| internal/compact/compact.go | 52 | 98 | 191 | | |
| 101 | -| internal/tui/turn.go | 42 | 87 | 337 | | |
| 102 | -| internal/tui/events.go | 39 | 123 | 233 | | |
| 103 | -| internal/acp/replay.go | 33 | 43 | 95 | | |
| 104 | -| internal/tools/files.go | 32 | 50 | 238 | | |
| 105 | -| internal/store/keeper.go | 31 | 58 | 128 | | |
| 106 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | |
| 107 | -| internal/store/store.go | 29 | 53 | 152 | | |
| 108 | -| internal/tools/tools.go | 28 | 47 | 191 | | |
| 109 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | |
| 110 | -| internal/tui/render.go | 27 | 55 | 150 | | |
| 111 | -| main.go | 27 | 44 | 152 | | |
| 112 | - | |
| 113 | -## Trend | |
| 114 | - | |
| 115 | -| run | timestamp | error | warning | smells | complex | gate | | |
| 116 | -|---|---|---|---|---|---|---| | |
| 117 | -| 1 | 2026-09-15T22:32:19Z | 0 | 69 | 18 | 620 | FAIL | | |
| 118 | -| 2 | 2026-09-15T22:33:07Z | 0 | 67 | 18 | 618 | FAIL | | |
| 119 | -| 3 | 2026-09-16T04:25:47Z | 0 | 69 | 20 | 770 | FAIL | | |
| 120 | -| 4 | 2026-09-16T04:26:38Z | 0 | 68 | 21 | 777 | FAIL | | |
| 121 | -| 5 | 2026-09-16T04:27:10Z | 0 | 67 | 20 | 777 | FAIL | | |
| 122 | -| 6 | 2026-09-16T04:31:40Z | 0 | 67 | 19 | 778 | FAIL | | |
| 123 | -| 7 | 2026-09-16T05:25:29Z | 0 | 69 | 22 | 999 | FAIL | | |
| deleted file mode 100644 | |||
| @@ -1,123 +0,0 @@ | |||
| 1 | -# Quality report — 2026-09-16T05:25:29Z | ||
| 2 | - | ||
| 3 | -- **Gate**: ❌ **FAIL** | ||
| 4 | -- **Commit**: `d722711` on `main` | ||
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | ||
| 6 | -- **Run**: #7 (previous: 2026-09-16T04:31:40Z) | ||
| 7 | - | ||
| 8 | -## Gate violations | ||
| 9 | - | ||
| 10 | -- warning-level issues: 69 (max 0) | ||
| 11 | -- code smells: 22 (max 0) | ||
| 12 | - | ||
| 13 | -## Lint issues (`qlty check`) | ||
| 14 | - | ||
| 15 | -| level | count | vs previous | | ||
| 16 | -|---|---|---| | ||
| 17 | -| warning | 69 | +2 | | ||
| 18 | -| note | 2 | — | | ||
| 19 | - | ||
| 20 | -### Top rules | ||
| 21 | - | ||
| 22 | -| rule | count | | ||
| 23 | -|---|---| | ||
| 24 | -| golangci-lint:errcheck | 12 | | ||
| 25 | -| osv-scanner:CVE-2026-32285 | 2 | | ||
| 26 | -| osv-scanner:CVE-2026-24051 | 2 | | ||
| 27 | -| osv-scanner:CVE-2026-39883 | 2 | | ||
| 28 | -| osv-scanner:CVE-2026-29181 | 2 | | ||
| 29 | -| osv-scanner:CVE-2026-39824 | 1 | | ||
| 30 | -| osv-scanner:CVE-2026-56852 | 1 | | ||
| 31 | -| osv-scanner:CVE-2025-47910 | 1 | | ||
| 32 | -| osv-scanner:CVE-2025-47912 | 1 | | ||
| 33 | -| osv-scanner:CVE-2025-58183 | 1 | | ||
| 34 | -| osv-scanner:CVE-2025-58185 | 1 | | ||
| 35 | -| osv-scanner:CVE-2025-58186 | 1 | | ||
| 36 | -| osv-scanner:CVE-2025-58187 | 1 | | ||
| 37 | -| osv-scanner:CVE-2025-58188 | 1 | | ||
| 38 | -| osv-scanner:CVE-2025-58189 | 1 | | ||
| 39 | - | ||
| 40 | -### Most affected files | ||
| 41 | - | ||
| 42 | -| file | issues | | ||
| 43 | -|---|---| | ||
| 44 | -| go.mod | 56 | | ||
| 45 | -| main.go | 5 | | ||
| 46 | -| hello-world/main.go | 2 | | ||
| 47 | -| internal/engine/openai_compat.go | 2 | | ||
| 48 | -| internal/fileedit/fileedit_test.go | 2 | | ||
| 49 | -| internal/fileedit/textfile.go | 2 | | ||
| 50 | -| internal/engine/engine.go | 1 | | ||
| 51 | -| internal/tui/tui_test.go | 1 | | ||
| 52 | - | ||
| 53 | -## Code smells (`qlty smells`) | ||
| 54 | - | ||
| 55 | -Total: **22** (vs previous: +3) | ||
| 56 | - | ||
| 57 | -| smell | file | line | detail | | ||
| 58 | -|---|---|---|---| | ||
| 59 | -| qlty:function-complexity | main.go | 53 | Function with high complexity (count = 22): main | | ||
| 60 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | ||
| 61 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | ||
| 62 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | ||
| 63 | -| qlty:return-statements | internal/agent/agent.go | 38 | Function with many returns (count = 6): Run | | ||
| 64 | -| qlty:nested-control-flow | internal/agent/agent.go | 212 | Deeply nested control flow (level = 5) | | ||
| 65 | -| qlty:nested-control-flow | internal/agent/agent.go | 221 | Deeply nested control flow (level = 5) | | ||
| 66 | -| qlty:nested-control-flow | internal/agent/agent.go | 293 | Deeply nested control flow (level = 5) | | ||
| 67 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 126) | | ||
| 68 | -| qlty:function-complexity | internal/agent/agent.go | 38 | Function with high complexity (count = 110): Run | | ||
| 69 | -| qlty:return-statements | internal/config/config.go | 293 | Function with many returns (count = 13): validate | | ||
| 70 | -| qlty:return-statements | internal/tui/style.go | 30 | Function with many returns (count = 10): styleOf | | ||
| 71 | -| qlty:return-statements | internal/compact/compact.go | 129 | Function with many returns (count = 6): Compact | | ||
| 72 | -| qlty:return-statements | internal/compact/compact.go | 211 | Function with many returns (count = 6): Valid | | ||
| 73 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 52) | | ||
| 74 | -| qlty:function-complexity | internal/compact/compact.go | 211 | Function with high complexity (count = 22): Valid | | ||
| 75 | -| qlty:return-statements | internal/store/keeper.go | 100 | Function with many returns (count = 6): Resume | | ||
| 76 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | ||
| 77 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | ||
| 78 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | ||
| 79 | - | ||
| 80 | -## Metrics (`qlty metrics`) | ||
| 81 | - | ||
| 82 | -| metric | total | vs previous | | ||
| 83 | -|---|---|---| | ||
| 84 | -| funcs | 361 | +140 | | ||
| 85 | -| classes | 69 | +21 | | ||
| 86 | -| fields | 280 | +97 | | ||
| 87 | -| cyclo | 1842 | +564 | | ||
| 88 | -| complex | 999 | +221 | | ||
| 89 | -| lcom | 0 | ±0 | | ||
| 90 | -| lines | 8257 | +2250 | | ||
| 91 | -| loc | 5493 | +1650 | | ||
| 92 | - | ||
| 93 | -### Most complex files | ||
| 94 | - | ||
| 95 | -| file | complex | cyclo | loc | | ||
| 96 | -|---|---|---|---| | ||
| 97 | -| internal/agent/agent.go | 126 | 92 | 296 | | ||
| 98 | -| internal/engine/engine.go | 91 | 121 | 347 | | ||
| 99 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | ||
| 100 | -| internal/compact/compact.go | 52 | 98 | 191 | | ||
| 101 | -| internal/tui/turn.go | 42 | 87 | 337 | | ||
| 102 | -| internal/tui/events.go | 39 | 123 | 233 | | ||
| 103 | -| internal/acp/replay.go | 33 | 43 | 95 | | ||
| 104 | -| internal/tools/files.go | 32 | 50 | 238 | | ||
| 105 | -| internal/store/keeper.go | 31 | 58 | 128 | | ||
| 106 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | ||
| 107 | -| internal/store/store.go | 29 | 53 | 152 | | ||
| 108 | -| internal/tools/tools.go | 28 | 47 | 191 | | ||
| 109 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | ||
| 110 | -| internal/tui/render.go | 27 | 55 | 150 | | ||
| 111 | -| main.go | 27 | 44 | 152 | | ||
| 112 | - | ||
| 113 | -## Trend | ||
| 114 | - | ||
| 115 | -| run | timestamp | error | warning | smells | complex | gate | | ||
| 116 | -|---|---|---|---|---|---|---| | ||
| 117 | -| 1 | 2026-09-15T22:32:19Z | 0 | 69 | 18 | 620 | FAIL | | ||
| 118 | -| 2 | 2026-09-15T22:33:07Z | 0 | 67 | 18 | 618 | FAIL | | ||
| 119 | -| 3 | 2026-09-16T04:25:47Z | 0 | 69 | 20 | 770 | FAIL | | ||
| 120 | -| 4 | 2026-09-16T04:26:38Z | 0 | 68 | 21 | 777 | FAIL | | ||
| 121 | -| 5 | 2026-09-16T04:27:10Z | 0 | 67 | 20 | 777 | FAIL | | ||
| 122 | -| 6 | 2026-09-16T04:31:40Z | 0 | 67 | 19 | 778 | FAIL | | ||
| 123 | -| 7 | 2026-09-16T05:25:29Z | 0 | 69 | 22 | 999 | FAIL | | ||
deleted
.quality/report-20260916T052649Z.md +0 -122 | deleted file mode 100644 | ||
| @@ -1,122 +0,0 @@ | ||
| 1 | -# Quality report — 2026-09-16T05:26:49Z | |
| 2 | - | |
| 3 | -- **Gate**: ❌ **FAIL** | |
| 4 | -- **Commit**: `d722711` on `main` | |
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | |
| 6 | -- **Run**: #8 (previous: 2026-09-16T05:25:29Z) | |
| 7 | - | |
| 8 | -## Gate violations | |
| 9 | - | |
| 10 | -- warning-level issues: 63 (max 0) | |
| 11 | -- code smells: 20 (max 0) | |
| 12 | - | |
| 13 | -## Lint issues (`qlty check`) | |
| 14 | - | |
| 15 | -| level | count | vs previous | | |
| 16 | -|---|---|---| | |
| 17 | -| warning | 63 | -6 | | |
| 18 | -| note | 2 | ±0 | | |
| 19 | - | |
| 20 | -### Top rules | |
| 21 | - | |
| 22 | -| rule | count | | |
| 23 | -|---|---| | |
| 24 | -| golangci-lint:errcheck | 7 | | |
| 25 | -| osv-scanner:CVE-2026-32285 | 2 | | |
| 26 | -| osv-scanner:CVE-2026-24051 | 2 | | |
| 27 | -| osv-scanner:CVE-2026-39883 | 2 | | |
| 28 | -| osv-scanner:CVE-2026-29181 | 2 | | |
| 29 | -| osv-scanner:CVE-2026-39824 | 1 | | |
| 30 | -| osv-scanner:CVE-2026-56852 | 1 | | |
| 31 | -| osv-scanner:CVE-2025-47910 | 1 | | |
| 32 | -| osv-scanner:CVE-2025-47912 | 1 | | |
| 33 | -| osv-scanner:CVE-2025-58183 | 1 | | |
| 34 | -| osv-scanner:CVE-2025-58185 | 1 | | |
| 35 | -| osv-scanner:CVE-2025-58186 | 1 | | |
| 36 | -| osv-scanner:CVE-2025-58187 | 1 | | |
| 37 | -| osv-scanner:CVE-2025-58188 | 1 | | |
| 38 | -| osv-scanner:CVE-2025-58189 | 1 | | |
| 39 | - | |
| 40 | -### Most affected files | |
| 41 | - | |
| 42 | -| file | issues | | |
| 43 | -|---|---| | |
| 44 | -| go.mod | 56 | | |
| 45 | -| hello-world/main.go | 2 | | |
| 46 | -| internal/engine/openai_compat.go | 2 | | |
| 47 | -| internal/fileedit/fileedit_test.go | 2 | | |
| 48 | -| internal/fileedit/textfile.go | 2 | | |
| 49 | -| internal/engine/engine.go | 1 | | |
| 50 | - | |
| 51 | -## Code smells (`qlty smells`) | |
| 52 | - | |
| 53 | -Total: **20** (vs previous: -2) | |
| 54 | - | |
| 55 | -| smell | file | line | detail | | |
| 56 | -|---|---|---|---| | |
| 57 | -| qlty:function-complexity | main.go | 52 | Function with high complexity (count = 18): main | | |
| 58 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | |
| 59 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | |
| 60 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | |
| 61 | -| qlty:return-statements | internal/agent/agent.go | 38 | Function with many returns (count = 6): Run | | |
| 62 | -| qlty:nested-control-flow | internal/agent/agent.go | 212 | Deeply nested control flow (level = 5) | | |
| 63 | -| qlty:nested-control-flow | internal/agent/agent.go | 221 | Deeply nested control flow (level = 5) | | |
| 64 | -| qlty:nested-control-flow | internal/agent/agent.go | 293 | Deeply nested control flow (level = 5) | | |
| 65 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 126) | | |
| 66 | -| qlty:function-complexity | internal/agent/agent.go | 38 | Function with high complexity (count = 110): Run | | |
| 67 | -| qlty:return-statements | internal/config/config.go | 293 | Function with many returns (count = 13): validate | | |
| 68 | -| qlty:return-statements | internal/compact/compact.go | 129 | Function with many returns (count = 6): Compact | | |
| 69 | -| qlty:return-statements | internal/compact/compact.go | 211 | Function with many returns (count = 6): Valid | | |
| 70 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 52) | | |
| 71 | -| qlty:function-complexity | internal/compact/compact.go | 211 | Function with high complexity (count = 22): Valid | | |
| 72 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | |
| 73 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | |
| 74 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | |
| 75 | -| qlty:return-statements | internal/engine/explain.go | 24 | Function with many returns (count = 9): Explain | | |
| 76 | -| qlty:return-statements | blog/fake-agent/main.go | 96 | Function with many returns (count = 6): Prompt | | |
| 77 | - | |
| 78 | -## Metrics (`qlty metrics`) | |
| 79 | - | |
| 80 | -| metric | total | vs previous | | |
| 81 | -|---|---|---| | |
| 82 | -| funcs | 364 | +3 | | |
| 83 | -| classes | 69 | ±0 | | |
| 84 | -| fields | 280 | ±0 | | |
| 85 | -| cyclo | 1836 | -6 | | |
| 86 | -| complex | 997 | -2 | | |
| 87 | -| lcom | 0 | ±0 | | |
| 88 | -| lines | 8269 | +12 | | |
| 89 | -| loc | 5495 | +2 | | |
| 90 | - | |
| 91 | -### Most complex files | |
| 92 | - | |
| 93 | -| file | complex | cyclo | loc | | |
| 94 | -|---|---|---|---| | |
| 95 | -| internal/agent/agent.go | 126 | 92 | 296 | | |
| 96 | -| internal/engine/engine.go | 91 | 121 | 347 | | |
| 97 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | |
| 98 | -| internal/compact/compact.go | 52 | 98 | 191 | | |
| 99 | -| internal/tui/turn.go | 42 | 87 | 337 | | |
| 100 | -| internal/tui/events.go | 39 | 123 | 233 | | |
| 101 | -| internal/acp/replay.go | 33 | 43 | 95 | | |
| 102 | -| internal/tools/files.go | 32 | 50 | 238 | | |
| 103 | -| internal/store/keeper.go | 31 | 60 | 131 | | |
| 104 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | |
| 105 | -| internal/store/store.go | 29 | 53 | 152 | | |
| 106 | -| internal/tools/tools.go | 28 | 47 | 191 | | |
| 107 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | |
| 108 | -| internal/tui/render.go | 27 | 55 | 150 | | |
| 109 | -| internal/tui/draw.go | 26 | 83 | 136 | | |
| 110 | - | |
| 111 | -## Trend | |
| 112 | - | |
| 113 | -| run | timestamp | error | warning | smells | complex | gate | | |
| 114 | -|---|---|---|---|---|---|---| | |
| 115 | -| 1 | 2026-09-15T22:32:19Z | 0 | 69 | 18 | 620 | FAIL | | |
| 116 | -| 2 | 2026-09-15T22:33:07Z | 0 | 67 | 18 | 618 | FAIL | | |
| 117 | -| 3 | 2026-09-16T04:25:47Z | 0 | 69 | 20 | 770 | FAIL | | |
| 118 | -| 4 | 2026-09-16T04:26:38Z | 0 | 68 | 21 | 777 | FAIL | | |
| 119 | -| 5 | 2026-09-16T04:27:10Z | 0 | 67 | 20 | 777 | FAIL | | |
| 120 | -| 6 | 2026-09-16T04:31:40Z | 0 | 67 | 19 | 778 | FAIL | | |
| 121 | -| 7 | 2026-09-16T05:25:29Z | 0 | 69 | 22 | 999 | FAIL | | |
| 122 | -| 8 | 2026-09-16T05:26:49Z | 0 | 63 | 20 | 997 | FAIL | | |
| deleted file mode 100644 | |||
| @@ -1,122 +0,0 @@ | |||
| 1 | -# Quality report — 2026-09-16T05:26:49Z | ||
| 2 | - | ||
| 3 | -- **Gate**: ❌ **FAIL** | ||
| 4 | -- **Commit**: `d722711` on `main` | ||
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | ||
| 6 | -- **Run**: #8 (previous: 2026-09-16T05:25:29Z) | ||
| 7 | - | ||
| 8 | -## Gate violations | ||
| 9 | - | ||
| 10 | -- warning-level issues: 63 (max 0) | ||
| 11 | -- code smells: 20 (max 0) | ||
| 12 | - | ||
| 13 | -## Lint issues (`qlty check`) | ||
| 14 | - | ||
| 15 | -| level | count | vs previous | | ||
| 16 | -|---|---|---| | ||
| 17 | -| warning | 63 | -6 | | ||
| 18 | -| note | 2 | ±0 | | ||
| 19 | - | ||
| 20 | -### Top rules | ||
| 21 | - | ||
| 22 | -| rule | count | | ||
| 23 | -|---|---| | ||
| 24 | -| golangci-lint:errcheck | 7 | | ||
| 25 | -| osv-scanner:CVE-2026-32285 | 2 | | ||
| 26 | -| osv-scanner:CVE-2026-24051 | 2 | | ||
| 27 | -| osv-scanner:CVE-2026-39883 | 2 | | ||
| 28 | -| osv-scanner:CVE-2026-29181 | 2 | | ||
| 29 | -| osv-scanner:CVE-2026-39824 | 1 | | ||
| 30 | -| osv-scanner:CVE-2026-56852 | 1 | | ||
| 31 | -| osv-scanner:CVE-2025-47910 | 1 | | ||
| 32 | -| osv-scanner:CVE-2025-47912 | 1 | | ||
| 33 | -| osv-scanner:CVE-2025-58183 | 1 | | ||
| 34 | -| osv-scanner:CVE-2025-58185 | 1 | | ||
| 35 | -| osv-scanner:CVE-2025-58186 | 1 | | ||
| 36 | -| osv-scanner:CVE-2025-58187 | 1 | | ||
| 37 | -| osv-scanner:CVE-2025-58188 | 1 | | ||
| 38 | -| osv-scanner:CVE-2025-58189 | 1 | | ||
| 39 | - | ||
| 40 | -### Most affected files | ||
| 41 | - | ||
| 42 | -| file | issues | | ||
| 43 | -|---|---| | ||
| 44 | -| go.mod | 56 | | ||
| 45 | -| hello-world/main.go | 2 | | ||
| 46 | -| internal/engine/openai_compat.go | 2 | | ||
| 47 | -| internal/fileedit/fileedit_test.go | 2 | | ||
| 48 | -| internal/fileedit/textfile.go | 2 | | ||
| 49 | -| internal/engine/engine.go | 1 | | ||
| 50 | - | ||
| 51 | -## Code smells (`qlty smells`) | ||
| 52 | - | ||
| 53 | -Total: **20** (vs previous: -2) | ||
| 54 | - | ||
| 55 | -| smell | file | line | detail | | ||
| 56 | -|---|---|---|---| | ||
| 57 | -| qlty:function-complexity | main.go | 52 | Function with high complexity (count = 18): main | | ||
| 58 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | ||
| 59 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | ||
| 60 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | ||
| 61 | -| qlty:return-statements | internal/agent/agent.go | 38 | Function with many returns (count = 6): Run | | ||
| 62 | -| qlty:nested-control-flow | internal/agent/agent.go | 212 | Deeply nested control flow (level = 5) | | ||
| 63 | -| qlty:nested-control-flow | internal/agent/agent.go | 221 | Deeply nested control flow (level = 5) | | ||
| 64 | -| qlty:nested-control-flow | internal/agent/agent.go | 293 | Deeply nested control flow (level = 5) | | ||
| 65 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 126) | | ||
| 66 | -| qlty:function-complexity | internal/agent/agent.go | 38 | Function with high complexity (count = 110): Run | | ||
| 67 | -| qlty:return-statements | internal/config/config.go | 293 | Function with many returns (count = 13): validate | | ||
| 68 | -| qlty:return-statements | internal/compact/compact.go | 129 | Function with many returns (count = 6): Compact | | ||
| 69 | -| qlty:return-statements | internal/compact/compact.go | 211 | Function with many returns (count = 6): Valid | | ||
| 70 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 52) | | ||
| 71 | -| qlty:function-complexity | internal/compact/compact.go | 211 | Function with high complexity (count = 22): Valid | | ||
| 72 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | ||
| 73 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | ||
| 74 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | ||
| 75 | -| qlty:return-statements | internal/engine/explain.go | 24 | Function with many returns (count = 9): Explain | | ||
| 76 | -| qlty:return-statements | blog/fake-agent/main.go | 96 | Function with many returns (count = 6): Prompt | | ||
| 77 | - | ||
| 78 | -## Metrics (`qlty metrics`) | ||
| 79 | - | ||
| 80 | -| metric | total | vs previous | | ||
| 81 | -|---|---|---| | ||
| 82 | -| funcs | 364 | +3 | | ||
| 83 | -| classes | 69 | ±0 | | ||
| 84 | -| fields | 280 | ±0 | | ||
| 85 | -| cyclo | 1836 | -6 | | ||
| 86 | -| complex | 997 | -2 | | ||
| 87 | -| lcom | 0 | ±0 | | ||
| 88 | -| lines | 8269 | +12 | | ||
| 89 | -| loc | 5495 | +2 | | ||
| 90 | - | ||
| 91 | -### Most complex files | ||
| 92 | - | ||
| 93 | -| file | complex | cyclo | loc | | ||
| 94 | -|---|---|---|---| | ||
| 95 | -| internal/agent/agent.go | 126 | 92 | 296 | | ||
| 96 | -| internal/engine/engine.go | 91 | 121 | 347 | | ||
| 97 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | ||
| 98 | -| internal/compact/compact.go | 52 | 98 | 191 | | ||
| 99 | -| internal/tui/turn.go | 42 | 87 | 337 | | ||
| 100 | -| internal/tui/events.go | 39 | 123 | 233 | | ||
| 101 | -| internal/acp/replay.go | 33 | 43 | 95 | | ||
| 102 | -| internal/tools/files.go | 32 | 50 | 238 | | ||
| 103 | -| internal/store/keeper.go | 31 | 60 | 131 | | ||
| 104 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | ||
| 105 | -| internal/store/store.go | 29 | 53 | 152 | | ||
| 106 | -| internal/tools/tools.go | 28 | 47 | 191 | | ||
| 107 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | ||
| 108 | -| internal/tui/render.go | 27 | 55 | 150 | | ||
| 109 | -| internal/tui/draw.go | 26 | 83 | 136 | | ||
| 110 | - | ||
| 111 | -## Trend | ||
| 112 | - | ||
| 113 | -| run | timestamp | error | warning | smells | complex | gate | | ||
| 114 | -|---|---|---|---|---|---|---| | ||
| 115 | -| 1 | 2026-09-15T22:32:19Z | 0 | 69 | 18 | 620 | FAIL | | ||
| 116 | -| 2 | 2026-09-15T22:33:07Z | 0 | 67 | 18 | 618 | FAIL | | ||
| 117 | -| 3 | 2026-09-16T04:25:47Z | 0 | 69 | 20 | 770 | FAIL | | ||
| 118 | -| 4 | 2026-09-16T04:26:38Z | 0 | 68 | 21 | 777 | FAIL | | ||
| 119 | -| 5 | 2026-09-16T04:27:10Z | 0 | 67 | 20 | 777 | FAIL | | ||
| 120 | -| 6 | 2026-09-16T04:31:40Z | 0 | 67 | 19 | 778 | FAIL | | ||
| 121 | -| 7 | 2026-09-16T05:25:29Z | 0 | 69 | 22 | 999 | FAIL | | ||
| 122 | -| 8 | 2026-09-16T05:26:49Z | 0 | 63 | 20 | 997 | FAIL | | ||
deleted
.quality/report-20260916T052755Z.md +0 -122 | deleted file mode 100644 | ||
| @@ -1,122 +0,0 @@ | ||
| 1 | -# Quality report — 2026-09-16T05:27:55Z | |
| 2 | - | |
| 3 | -- **Gate**: ❌ **FAIL** | |
| 4 | -- **Commit**: `d722711` on `main` | |
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | |
| 6 | -- **Run**: #9 (previous: 2026-09-16T05:26:49Z) | |
| 7 | - | |
| 8 | -## Gate violations | |
| 9 | - | |
| 10 | -- warning-level issues: 63 (max 0) | |
| 11 | -- code smells: 19 (max 0) | |
| 12 | - | |
| 13 | -## Lint issues (`qlty check`) | |
| 14 | - | |
| 15 | -| level | count | vs previous | | |
| 16 | -|---|---|---| | |
| 17 | -| warning | 63 | ±0 | | |
| 18 | -| note | 2 | ±0 | | |
| 19 | - | |
| 20 | -### Top rules | |
| 21 | - | |
| 22 | -| rule | count | | |
| 23 | -|---|---| | |
| 24 | -| golangci-lint:errcheck | 7 | | |
| 25 | -| osv-scanner:CVE-2026-32285 | 2 | | |
| 26 | -| osv-scanner:CVE-2026-24051 | 2 | | |
| 27 | -| osv-scanner:CVE-2026-39883 | 2 | | |
| 28 | -| osv-scanner:CVE-2026-29181 | 2 | | |
| 29 | -| osv-scanner:CVE-2026-39824 | 1 | | |
| 30 | -| osv-scanner:CVE-2026-56852 | 1 | | |
| 31 | -| osv-scanner:CVE-2025-47910 | 1 | | |
| 32 | -| osv-scanner:CVE-2025-47912 | 1 | | |
| 33 | -| osv-scanner:CVE-2025-58183 | 1 | | |
| 34 | -| osv-scanner:CVE-2025-58185 | 1 | | |
| 35 | -| osv-scanner:CVE-2025-58186 | 1 | | |
| 36 | -| osv-scanner:CVE-2025-58187 | 1 | | |
| 37 | -| osv-scanner:CVE-2025-58188 | 1 | | |
| 38 | -| osv-scanner:CVE-2025-58189 | 1 | | |
| 39 | - | |
| 40 | -### Most affected files | |
| 41 | - | |
| 42 | -| file | issues | | |
| 43 | -|---|---| | |
| 44 | -| go.mod | 56 | | |
| 45 | -| hello-world/main.go | 2 | | |
| 46 | -| internal/engine/openai_compat.go | 2 | | |
| 47 | -| internal/fileedit/fileedit_test.go | 2 | | |
| 48 | -| internal/fileedit/textfile.go | 2 | | |
| 49 | -| internal/engine/engine.go | 1 | | |
| 50 | - | |
| 51 | -## Code smells (`qlty smells`) | |
| 52 | - | |
| 53 | -Total: **19** (vs previous: -1) | |
| 54 | - | |
| 55 | -| smell | file | line | detail | | |
| 56 | -|---|---|---|---| | |
| 57 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | |
| 58 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | |
| 59 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | |
| 60 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | |
| 61 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | |
| 62 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | |
| 63 | -| qlty:return-statements | internal/config/config.go | 293 | Function with many returns (count = 13): validate | | |
| 64 | -| qlty:return-statements | internal/engine/explain.go | 24 | Function with many returns (count = 9): Explain | | |
| 65 | -| qlty:return-statements | internal/compact/compact.go | 129 | Function with many returns (count = 6): Compact | | |
| 66 | -| qlty:return-statements | internal/compact/compact.go | 211 | Function with many returns (count = 6): Valid | | |
| 67 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 52) | | |
| 68 | -| qlty:function-complexity | internal/compact/compact.go | 211 | Function with high complexity (count = 22): Valid | | |
| 69 | -| qlty:return-statements | internal/agent/agent.go | 38 | Function with many returns (count = 6): Run | | |
| 70 | -| qlty:nested-control-flow | internal/agent/agent.go | 212 | Deeply nested control flow (level = 5) | | |
| 71 | -| qlty:nested-control-flow | internal/agent/agent.go | 221 | Deeply nested control flow (level = 5) | | |
| 72 | -| qlty:nested-control-flow | internal/agent/agent.go | 293 | Deeply nested control flow (level = 5) | | |
| 73 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 126) | | |
| 74 | -| qlty:function-complexity | internal/agent/agent.go | 38 | Function with high complexity (count = 110): Run | | |
| 75 | -| qlty:return-statements | blog/fake-agent/main.go | 96 | Function with many returns (count = 6): Prompt | | |
| 76 | - | |
| 77 | -## Metrics (`qlty metrics`) | |
| 78 | - | |
| 79 | -| metric | total | vs previous | | |
| 80 | -|---|---|---| | |
| 81 | -| funcs | 366 | +2 | | |
| 82 | -| classes | 69 | ±0 | | |
| 83 | -| fields | 280 | ±0 | | |
| 84 | -| cyclo | 1836 | ±0 | | |
| 85 | -| complex | 997 | ±0 | | |
| 86 | -| lcom | 0 | ±0 | | |
| 87 | -| lines | 8275 | +6 | | |
| 88 | -| loc | 5500 | +5 | | |
| 89 | - | |
| 90 | -### Most complex files | |
| 91 | - | |
| 92 | -| file | complex | cyclo | loc | | |
| 93 | -|---|---|---|---| | |
| 94 | -| internal/agent/agent.go | 126 | 92 | 296 | | |
| 95 | -| internal/engine/engine.go | 91 | 121 | 347 | | |
| 96 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | |
| 97 | -| internal/compact/compact.go | 52 | 98 | 191 | | |
| 98 | -| internal/tui/turn.go | 42 | 87 | 337 | | |
| 99 | -| internal/tui/events.go | 39 | 123 | 233 | | |
| 100 | -| internal/acp/replay.go | 33 | 43 | 95 | | |
| 101 | -| internal/tools/files.go | 32 | 50 | 238 | | |
| 102 | -| internal/store/keeper.go | 31 | 60 | 131 | | |
| 103 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | |
| 104 | -| internal/store/store.go | 29 | 53 | 152 | | |
| 105 | -| internal/tools/tools.go | 28 | 47 | 191 | | |
| 106 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | |
| 107 | -| internal/tui/render.go | 27 | 55 | 150 | | |
| 108 | -| internal/tui/draw.go | 26 | 83 | 136 | | |
| 109 | - | |
| 110 | -## Trend | |
| 111 | - | |
| 112 | -| run | timestamp | error | warning | smells | complex | gate | | |
| 113 | -|---|---|---|---|---|---|---| | |
| 114 | -| 1 | 2026-09-15T22:32:19Z | 0 | 69 | 18 | 620 | FAIL | | |
| 115 | -| 2 | 2026-09-15T22:33:07Z | 0 | 67 | 18 | 618 | FAIL | | |
| 116 | -| 3 | 2026-09-16T04:25:47Z | 0 | 69 | 20 | 770 | FAIL | | |
| 117 | -| 4 | 2026-09-16T04:26:38Z | 0 | 68 | 21 | 777 | FAIL | | |
| 118 | -| 5 | 2026-09-16T04:27:10Z | 0 | 67 | 20 | 777 | FAIL | | |
| 119 | -| 6 | 2026-09-16T04:31:40Z | 0 | 67 | 19 | 778 | FAIL | | |
| 120 | -| 7 | 2026-09-16T05:25:29Z | 0 | 69 | 22 | 999 | FAIL | | |
| 121 | -| 8 | 2026-09-16T05:26:49Z | 0 | 63 | 20 | 997 | FAIL | | |
| 122 | -| 9 | 2026-09-16T05:27:55Z | 0 | 63 | 19 | 997 | FAIL | | |
| deleted file mode 100644 | |||
| @@ -1,122 +0,0 @@ | |||
| 1 | -# Quality report — 2026-09-16T05:27:55Z | ||
| 2 | - | ||
| 3 | -- **Gate**: ❌ **FAIL** | ||
| 4 | -- **Commit**: `d722711` on `main` | ||
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | ||
| 6 | -- **Run**: #9 (previous: 2026-09-16T05:26:49Z) | ||
| 7 | - | ||
| 8 | -## Gate violations | ||
| 9 | - | ||
| 10 | -- warning-level issues: 63 (max 0) | ||
| 11 | -- code smells: 19 (max 0) | ||
| 12 | - | ||
| 13 | -## Lint issues (`qlty check`) | ||
| 14 | - | ||
| 15 | -| level | count | vs previous | | ||
| 16 | -|---|---|---| | ||
| 17 | -| warning | 63 | ±0 | | ||
| 18 | -| note | 2 | ±0 | | ||
| 19 | - | ||
| 20 | -### Top rules | ||
| 21 | - | ||
| 22 | -| rule | count | | ||
| 23 | -|---|---| | ||
| 24 | -| golangci-lint:errcheck | 7 | | ||
| 25 | -| osv-scanner:CVE-2026-32285 | 2 | | ||
| 26 | -| osv-scanner:CVE-2026-24051 | 2 | | ||
| 27 | -| osv-scanner:CVE-2026-39883 | 2 | | ||
| 28 | -| osv-scanner:CVE-2026-29181 | 2 | | ||
| 29 | -| osv-scanner:CVE-2026-39824 | 1 | | ||
| 30 | -| osv-scanner:CVE-2026-56852 | 1 | | ||
| 31 | -| osv-scanner:CVE-2025-47910 | 1 | | ||
| 32 | -| osv-scanner:CVE-2025-47912 | 1 | | ||
| 33 | -| osv-scanner:CVE-2025-58183 | 1 | | ||
| 34 | -| osv-scanner:CVE-2025-58185 | 1 | | ||
| 35 | -| osv-scanner:CVE-2025-58186 | 1 | | ||
| 36 | -| osv-scanner:CVE-2025-58187 | 1 | | ||
| 37 | -| osv-scanner:CVE-2025-58188 | 1 | | ||
| 38 | -| osv-scanner:CVE-2025-58189 | 1 | | ||
| 39 | - | ||
| 40 | -### Most affected files | ||
| 41 | - | ||
| 42 | -| file | issues | | ||
| 43 | -|---|---| | ||
| 44 | -| go.mod | 56 | | ||
| 45 | -| hello-world/main.go | 2 | | ||
| 46 | -| internal/engine/openai_compat.go | 2 | | ||
| 47 | -| internal/fileedit/fileedit_test.go | 2 | | ||
| 48 | -| internal/fileedit/textfile.go | 2 | | ||
| 49 | -| internal/engine/engine.go | 1 | | ||
| 50 | - | ||
| 51 | -## Code smells (`qlty smells`) | ||
| 52 | - | ||
| 53 | -Total: **19** (vs previous: -1) | ||
| 54 | - | ||
| 55 | -| smell | file | line | detail | | ||
| 56 | -|---|---|---|---| | ||
| 57 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | ||
| 58 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | ||
| 59 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | ||
| 60 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | ||
| 61 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | ||
| 62 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | ||
| 63 | -| qlty:return-statements | internal/config/config.go | 293 | Function with many returns (count = 13): validate | | ||
| 64 | -| qlty:return-statements | internal/engine/explain.go | 24 | Function with many returns (count = 9): Explain | | ||
| 65 | -| qlty:return-statements | internal/compact/compact.go | 129 | Function with many returns (count = 6): Compact | | ||
| 66 | -| qlty:return-statements | internal/compact/compact.go | 211 | Function with many returns (count = 6): Valid | | ||
| 67 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 52) | | ||
| 68 | -| qlty:function-complexity | internal/compact/compact.go | 211 | Function with high complexity (count = 22): Valid | | ||
| 69 | -| qlty:return-statements | internal/agent/agent.go | 38 | Function with many returns (count = 6): Run | | ||
| 70 | -| qlty:nested-control-flow | internal/agent/agent.go | 212 | Deeply nested control flow (level = 5) | | ||
| 71 | -| qlty:nested-control-flow | internal/agent/agent.go | 221 | Deeply nested control flow (level = 5) | | ||
| 72 | -| qlty:nested-control-flow | internal/agent/agent.go | 293 | Deeply nested control flow (level = 5) | | ||
| 73 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 126) | | ||
| 74 | -| qlty:function-complexity | internal/agent/agent.go | 38 | Function with high complexity (count = 110): Run | | ||
| 75 | -| qlty:return-statements | blog/fake-agent/main.go | 96 | Function with many returns (count = 6): Prompt | | ||
| 76 | - | ||
| 77 | -## Metrics (`qlty metrics`) | ||
| 78 | - | ||
| 79 | -| metric | total | vs previous | | ||
| 80 | -|---|---|---| | ||
| 81 | -| funcs | 366 | +2 | | ||
| 82 | -| classes | 69 | ±0 | | ||
| 83 | -| fields | 280 | ±0 | | ||
| 84 | -| cyclo | 1836 | ±0 | | ||
| 85 | -| complex | 997 | ±0 | | ||
| 86 | -| lcom | 0 | ±0 | | ||
| 87 | -| lines | 8275 | +6 | | ||
| 88 | -| loc | 5500 | +5 | | ||
| 89 | - | ||
| 90 | -### Most complex files | ||
| 91 | - | ||
| 92 | -| file | complex | cyclo | loc | | ||
| 93 | -|---|---|---|---| | ||
| 94 | -| internal/agent/agent.go | 126 | 92 | 296 | | ||
| 95 | -| internal/engine/engine.go | 91 | 121 | 347 | | ||
| 96 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | ||
| 97 | -| internal/compact/compact.go | 52 | 98 | 191 | | ||
| 98 | -| internal/tui/turn.go | 42 | 87 | 337 | | ||
| 99 | -| internal/tui/events.go | 39 | 123 | 233 | | ||
| 100 | -| internal/acp/replay.go | 33 | 43 | 95 | | ||
| 101 | -| internal/tools/files.go | 32 | 50 | 238 | | ||
| 102 | -| internal/store/keeper.go | 31 | 60 | 131 | | ||
| 103 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | ||
| 104 | -| internal/store/store.go | 29 | 53 | 152 | | ||
| 105 | -| internal/tools/tools.go | 28 | 47 | 191 | | ||
| 106 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | ||
| 107 | -| internal/tui/render.go | 27 | 55 | 150 | | ||
| 108 | -| internal/tui/draw.go | 26 | 83 | 136 | | ||
| 109 | - | ||
| 110 | -## Trend | ||
| 111 | - | ||
| 112 | -| run | timestamp | error | warning | smells | complex | gate | | ||
| 113 | -|---|---|---|---|---|---|---| | ||
| 114 | -| 1 | 2026-09-15T22:32:19Z | 0 | 69 | 18 | 620 | FAIL | | ||
| 115 | -| 2 | 2026-09-15T22:33:07Z | 0 | 67 | 18 | 618 | FAIL | | ||
| 116 | -| 3 | 2026-09-16T04:25:47Z | 0 | 69 | 20 | 770 | FAIL | | ||
| 117 | -| 4 | 2026-09-16T04:26:38Z | 0 | 68 | 21 | 777 | FAIL | | ||
| 118 | -| 5 | 2026-09-16T04:27:10Z | 0 | 67 | 20 | 777 | FAIL | | ||
| 119 | -| 6 | 2026-09-16T04:31:40Z | 0 | 67 | 19 | 778 | FAIL | | ||
| 120 | -| 7 | 2026-09-16T05:25:29Z | 0 | 69 | 22 | 999 | FAIL | | ||
| 121 | -| 8 | 2026-09-16T05:26:49Z | 0 | 63 | 20 | 997 | FAIL | | ||
| 122 | -| 9 | 2026-09-16T05:27:55Z | 0 | 63 | 19 | 997 | FAIL | | ||
deleted
.quality/report-20260916T060934Z.md +0 -105 | deleted file mode 100644 | ||
| @@ -1,105 +0,0 @@ | ||
| 1 | -# Quality report — 2026-09-16T06:09:34Z | |
| 2 | - | |
| 3 | -- **Gate**: ❌ **FAIL** | |
| 4 | -- **Commit**: `d722711` on `main` | |
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | |
| 6 | -- **Run**: #10 (previous: 2026-09-16T05:27:55Z) | |
| 7 | - | |
| 8 | -## Gate violations | |
| 9 | - | |
| 10 | -- code smells: 19 (max 0) | |
| 11 | - | |
| 12 | -## Lint issues (`qlty check`) | |
| 13 | - | |
| 14 | -| level | count | vs previous | | |
| 15 | -|---|---|---| | |
| 16 | -| warning | 0 | -63 | | |
| 17 | -| note | 0 | -2 | | |
| 18 | - | |
| 19 | -### Top rules | |
| 20 | - | |
| 21 | -_none_ | |
| 22 | - | |
| 23 | -### Most affected files | |
| 24 | - | |
| 25 | -_none_ | |
| 26 | - | |
| 27 | -## Code smells (`qlty smells`) | |
| 28 | - | |
| 29 | -Total: **19** (vs previous: ±0) | |
| 30 | - | |
| 31 | -| smell | file | line | detail | | |
| 32 | -|---|---|---|---| | |
| 33 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | |
| 34 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | |
| 35 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | |
| 36 | -| qlty:return-statements | internal/agent/agent.go | 40 | Function with many returns (count = 6): Run | | |
| 37 | -| qlty:nested-control-flow | internal/agent/agent.go | 214 | Deeply nested control flow (level = 5) | | |
| 38 | -| qlty:nested-control-flow | internal/agent/agent.go | 223 | Deeply nested control flow (level = 5) | | |
| 39 | -| qlty:nested-control-flow | internal/agent/agent.go | 295 | Deeply nested control flow (level = 5) | | |
| 40 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 139) | | |
| 41 | -| qlty:function-complexity | internal/agent/agent.go | 40 | Function with high complexity (count = 110): Run | | |
| 42 | -| qlty:return-statements | internal/config/config.go | 293 | Function with many returns (count = 13): validate | | |
| 43 | -| qlty:file-complexity | internal/tui/turn.go | 1 | High total complexity (count = 52) | | |
| 44 | -| qlty:return-statements | internal/compact/compact.go | 129 | Function with many returns (count = 6): Compact | | |
| 45 | -| qlty:return-statements | internal/compact/compact.go | 211 | Function with many returns (count = 6): Valid | | |
| 46 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 52) | | |
| 47 | -| qlty:function-complexity | internal/compact/compact.go | 211 | Function with high complexity (count = 22): Valid | | |
| 48 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | |
| 49 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | |
| 50 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | |
| 51 | -| qlty:return-statements | internal/engine/explain.go | 24 | Function with many returns (count = 9): Explain | | |
| 52 | - | |
| 53 | -## Metrics (`qlty metrics`) | |
| 54 | - | |
| 55 | -| metric | total | vs previous | | |
| 56 | -|---|---|---| | |
| 57 | -| funcs | 365 | -1 | | |
| 58 | -| classes | 70 | +1 | | |
| 59 | -| fields | 282 | +2 | | |
| 60 | -| cyclo | 1897 | +61 | | |
| 61 | -| complex | 1028 | +31 | | |
| 62 | -| lcom | 0 | ±0 | | |
| 63 | -| lines | 8345 | +70 | | |
| 64 | -| loc | 5537 | +37 | | |
| 65 | - | |
| 66 | -### Most complex files | |
| 67 | - | |
| 68 | -| file | complex | cyclo | loc | | |
| 69 | -|---|---|---|---| | |
| 70 | -| internal/agent/agent.go | 139 | 117 | 345 | | |
| 71 | -| internal/engine/engine.go | 91 | 121 | 347 | | |
| 72 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | |
| 73 | -| internal/compact/compact.go | 52 | 98 | 191 | | |
| 74 | -| internal/tui/turn.go | 52 | 110 | 383 | | |
| 75 | -| internal/tui/events.go | 41 | 129 | 239 | | |
| 76 | -| internal/acp/replay.go | 33 | 43 | 95 | | |
| 77 | -| internal/tools/files.go | 32 | 50 | 238 | | |
| 78 | -| internal/store/keeper.go | 31 | 60 | 131 | | |
| 79 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | |
| 80 | -| internal/store/store.go | 29 | 53 | 152 | | |
| 81 | -| internal/tools/tools.go | 28 | 47 | 191 | | |
| 82 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | |
| 83 | -| internal/skills/skills.go | 27 | 37 | 102 | | |
| 84 | -| internal/tui/render.go | 27 | 55 | 150 | | |
| 85 | - | |
| 86 | -## Tooling notes | |
| 87 | - | |
| 88 | -- `qlty check` exit 99: ERROR | |
| 89 | - | |
| 90 | - > FATAL error occurred running 4 invocations | |
| 91 | - | |
| 92 | -## Trend | |
| 93 | - | |
| 94 | -| run | timestamp | error | warning | smells | complex | gate | | |
| 95 | -|---|---|---|---|---|---|---| | |
| 96 | -| 1 | 2026-09-15T22:32:19Z | 0 | 69 | 18 | 620 | FAIL | | |
| 97 | -| 2 | 2026-09-15T22:33:07Z | 0 | 67 | 18 | 618 | FAIL | | |
| 98 | -| 3 | 2026-09-16T04:25:47Z | 0 | 69 | 20 | 770 | FAIL | | |
| 99 | -| 4 | 2026-09-16T04:26:38Z | 0 | 68 | 21 | 777 | FAIL | | |
| 100 | -| 5 | 2026-09-16T04:27:10Z | 0 | 67 | 20 | 777 | FAIL | | |
| 101 | -| 6 | 2026-09-16T04:31:40Z | 0 | 67 | 19 | 778 | FAIL | | |
| 102 | -| 7 | 2026-09-16T05:25:29Z | 0 | 69 | 22 | 999 | FAIL | | |
| 103 | -| 8 | 2026-09-16T05:26:49Z | 0 | 63 | 20 | 997 | FAIL | | |
| 104 | -| 9 | 2026-09-16T05:27:55Z | 0 | 63 | 19 | 997 | FAIL | | |
| 105 | -| 10 | 2026-09-16T06:09:34Z | 0 | 0 | 19 | 1028 | FAIL | | |
| deleted file mode 100644 | |||
| @@ -1,105 +0,0 @@ | |||
| 1 | -# Quality report — 2026-09-16T06:09:34Z | ||
| 2 | - | ||
| 3 | -- **Gate**: ❌ **FAIL** | ||
| 4 | -- **Commit**: `d722711` on `main` | ||
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | ||
| 6 | -- **Run**: #10 (previous: 2026-09-16T05:27:55Z) | ||
| 7 | - | ||
| 8 | -## Gate violations | ||
| 9 | - | ||
| 10 | -- code smells: 19 (max 0) | ||
| 11 | - | ||
| 12 | -## Lint issues (`qlty check`) | ||
| 13 | - | ||
| 14 | -| level | count | vs previous | | ||
| 15 | -|---|---|---| | ||
| 16 | -| warning | 0 | -63 | | ||
| 17 | -| note | 0 | -2 | | ||
| 18 | - | ||
| 19 | -### Top rules | ||
| 20 | - | ||
| 21 | -_none_ | ||
| 22 | - | ||
| 23 | -### Most affected files | ||
| 24 | - | ||
| 25 | -_none_ | ||
| 26 | - | ||
| 27 | -## Code smells (`qlty smells`) | ||
| 28 | - | ||
| 29 | -Total: **19** (vs previous: ±0) | ||
| 30 | - | ||
| 31 | -| smell | file | line | detail | | ||
| 32 | -|---|---|---|---| | ||
| 33 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | ||
| 34 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | ||
| 35 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | ||
| 36 | -| qlty:return-statements | internal/agent/agent.go | 40 | Function with many returns (count = 6): Run | | ||
| 37 | -| qlty:nested-control-flow | internal/agent/agent.go | 214 | Deeply nested control flow (level = 5) | | ||
| 38 | -| qlty:nested-control-flow | internal/agent/agent.go | 223 | Deeply nested control flow (level = 5) | | ||
| 39 | -| qlty:nested-control-flow | internal/agent/agent.go | 295 | Deeply nested control flow (level = 5) | | ||
| 40 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 139) | | ||
| 41 | -| qlty:function-complexity | internal/agent/agent.go | 40 | Function with high complexity (count = 110): Run | | ||
| 42 | -| qlty:return-statements | internal/config/config.go | 293 | Function with many returns (count = 13): validate | | ||
| 43 | -| qlty:file-complexity | internal/tui/turn.go | 1 | High total complexity (count = 52) | | ||
| 44 | -| qlty:return-statements | internal/compact/compact.go | 129 | Function with many returns (count = 6): Compact | | ||
| 45 | -| qlty:return-statements | internal/compact/compact.go | 211 | Function with many returns (count = 6): Valid | | ||
| 46 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 52) | | ||
| 47 | -| qlty:function-complexity | internal/compact/compact.go | 211 | Function with high complexity (count = 22): Valid | | ||
| 48 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | ||
| 49 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | ||
| 50 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | ||
| 51 | -| qlty:return-statements | internal/engine/explain.go | 24 | Function with many returns (count = 9): Explain | | ||
| 52 | - | ||
| 53 | -## Metrics (`qlty metrics`) | ||
| 54 | - | ||
| 55 | -| metric | total | vs previous | | ||
| 56 | -|---|---|---| | ||
| 57 | -| funcs | 365 | -1 | | ||
| 58 | -| classes | 70 | +1 | | ||
| 59 | -| fields | 282 | +2 | | ||
| 60 | -| cyclo | 1897 | +61 | | ||
| 61 | -| complex | 1028 | +31 | | ||
| 62 | -| lcom | 0 | ±0 | | ||
| 63 | -| lines | 8345 | +70 | | ||
| 64 | -| loc | 5537 | +37 | | ||
| 65 | - | ||
| 66 | -### Most complex files | ||
| 67 | - | ||
| 68 | -| file | complex | cyclo | loc | | ||
| 69 | -|---|---|---|---| | ||
| 70 | -| internal/agent/agent.go | 139 | 117 | 345 | | ||
| 71 | -| internal/engine/engine.go | 91 | 121 | 347 | | ||
| 72 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | ||
| 73 | -| internal/compact/compact.go | 52 | 98 | 191 | | ||
| 74 | -| internal/tui/turn.go | 52 | 110 | 383 | | ||
| 75 | -| internal/tui/events.go | 41 | 129 | 239 | | ||
| 76 | -| internal/acp/replay.go | 33 | 43 | 95 | | ||
| 77 | -| internal/tools/files.go | 32 | 50 | 238 | | ||
| 78 | -| internal/store/keeper.go | 31 | 60 | 131 | | ||
| 79 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | ||
| 80 | -| internal/store/store.go | 29 | 53 | 152 | | ||
| 81 | -| internal/tools/tools.go | 28 | 47 | 191 | | ||
| 82 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | ||
| 83 | -| internal/skills/skills.go | 27 | 37 | 102 | | ||
| 84 | -| internal/tui/render.go | 27 | 55 | 150 | | ||
| 85 | - | ||
| 86 | -## Tooling notes | ||
| 87 | - | ||
| 88 | -- `qlty check` exit 99: ERROR | ||
| 89 | - | ||
| 90 | - > FATAL error occurred running 4 invocations | ||
| 91 | - | ||
| 92 | -## Trend | ||
| 93 | - | ||
| 94 | -| run | timestamp | error | warning | smells | complex | gate | | ||
| 95 | -|---|---|---|---|---|---|---| | ||
| 96 | -| 1 | 2026-09-15T22:32:19Z | 0 | 69 | 18 | 620 | FAIL | | ||
| 97 | -| 2 | 2026-09-15T22:33:07Z | 0 | 67 | 18 | 618 | FAIL | | ||
| 98 | -| 3 | 2026-09-16T04:25:47Z | 0 | 69 | 20 | 770 | FAIL | | ||
| 99 | -| 4 | 2026-09-16T04:26:38Z | 0 | 68 | 21 | 777 | FAIL | | ||
| 100 | -| 5 | 2026-09-16T04:27:10Z | 0 | 67 | 20 | 777 | FAIL | | ||
| 101 | -| 6 | 2026-09-16T04:31:40Z | 0 | 67 | 19 | 778 | FAIL | | ||
| 102 | -| 7 | 2026-09-16T05:25:29Z | 0 | 69 | 22 | 999 | FAIL | | ||
| 103 | -| 8 | 2026-09-16T05:26:49Z | 0 | 63 | 20 | 997 | FAIL | | ||
| 104 | -| 9 | 2026-09-16T05:27:55Z | 0 | 63 | 19 | 997 | FAIL | | ||
| 105 | -| 10 | 2026-09-16T06:09:34Z | 0 | 0 | 19 | 1028 | FAIL | | ||
deleted
.quality/report-20260916T061248Z.md +0 -120 | deleted file mode 100644 | ||
| @@ -1,120 +0,0 @@ | ||
| 1 | -# Quality report — 2026-09-16T06:12:48Z | |
| 2 | - | |
| 3 | -- **Gate**: ❌ **FAIL** | |
| 4 | -- **Commit**: `d722711` on `main` | |
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | |
| 6 | -- **Run**: #11 (previous: 2026-09-16T06:09:34Z) | |
| 7 | - | |
| 8 | -## Gate violations | |
| 9 | - | |
| 10 | -- warning-level issues: 63 (max 0) | |
| 11 | -- code smells: 18 (max 0) | |
| 12 | - | |
| 13 | -## Lint issues (`qlty check`) | |
| 14 | - | |
| 15 | -| level | count | vs previous | | |
| 16 | -|---|---|---| | |
| 17 | -| warning | 63 | — | | |
| 18 | - | |
| 19 | -### Top rules | |
| 20 | - | |
| 21 | -| rule | count | | |
| 22 | -|---|---| | |
| 23 | -| golangci-lint:errcheck | 7 | | |
| 24 | -| osv-scanner:CVE-2026-32285 | 2 | | |
| 25 | -| osv-scanner:CVE-2026-24051 | 2 | | |
| 26 | -| osv-scanner:CVE-2026-39883 | 2 | | |
| 27 | -| osv-scanner:CVE-2026-29181 | 2 | | |
| 28 | -| osv-scanner:CVE-2026-39824 | 1 | | |
| 29 | -| osv-scanner:CVE-2026-56852 | 1 | | |
| 30 | -| osv-scanner:CVE-2025-47910 | 1 | | |
| 31 | -| osv-scanner:CVE-2025-47912 | 1 | | |
| 32 | -| osv-scanner:CVE-2025-58183 | 1 | | |
| 33 | -| osv-scanner:CVE-2025-58185 | 1 | | |
| 34 | -| osv-scanner:CVE-2025-58186 | 1 | | |
| 35 | -| osv-scanner:CVE-2025-58187 | 1 | | |
| 36 | -| osv-scanner:CVE-2025-58188 | 1 | | |
| 37 | -| osv-scanner:CVE-2025-58189 | 1 | | |
| 38 | - | |
| 39 | -### Most affected files | |
| 40 | - | |
| 41 | -| file | issues | | |
| 42 | -|---|---| | |
| 43 | -| go.mod | 56 | | |
| 44 | -| internal/engine/openai_compat.go | 2 | | |
| 45 | -| internal/fileedit/fileedit_test.go | 2 | | |
| 46 | -| internal/fileedit/textfile.go | 2 | | |
| 47 | -| internal/engine/engine.go | 1 | | |
| 48 | - | |
| 49 | -## Code smells (`qlty smells`) | |
| 50 | - | |
| 51 | -Total: **18** (vs previous: -1) | |
| 52 | - | |
| 53 | -| smell | file | line | detail | | |
| 54 | -|---|---|---|---| | |
| 55 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | |
| 56 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | |
| 57 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | |
| 58 | -| qlty:return-statements | internal/engine/explain.go | 24 | Function with many returns (count = 9): Explain | | |
| 59 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | |
| 60 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | |
| 61 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | |
| 62 | -| qlty:return-statements | internal/agent/agent.go | 39 | Function with many returns (count = 6): Run | | |
| 63 | -| qlty:nested-control-flow | internal/agent/agent.go | 213 | Deeply nested control flow (level = 5) | | |
| 64 | -| qlty:nested-control-flow | internal/agent/agent.go | 222 | Deeply nested control flow (level = 5) | | |
| 65 | -| qlty:nested-control-flow | internal/agent/agent.go | 294 | Deeply nested control flow (level = 5) | | |
| 66 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 126) | | |
| 67 | -| qlty:function-complexity | internal/agent/agent.go | 39 | Function with high complexity (count = 110): Run | | |
| 68 | -| qlty:return-statements | internal/config/config.go | 293 | Function with many returns (count = 13): validate | | |
| 69 | -| qlty:return-statements | internal/compact/compact.go | 129 | Function with many returns (count = 6): Compact | | |
| 70 | -| qlty:return-statements | internal/compact/compact.go | 211 | Function with many returns (count = 6): Valid | | |
| 71 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 52) | | |
| 72 | -| qlty:function-complexity | internal/compact/compact.go | 211 | Function with high complexity (count = 22): Valid | | |
| 73 | - | |
| 74 | -## Metrics (`qlty metrics`) | |
| 75 | - | |
| 76 | -| metric | total | vs previous | | |
| 77 | -|---|---|---| | |
| 78 | -| funcs | 365 | ±0 | | |
| 79 | -| classes | 70 | ±0 | | |
| 80 | -| fields | 282 | ±0 | | |
| 81 | -| cyclo | 1899 | +2 | | |
| 82 | -| complex | 1029 | +1 | | |
| 83 | -| lcom | 0 | ±0 | | |
| 84 | -| lines | 8366 | +21 | | |
| 85 | -| loc | 5549 | +12 | | |
| 86 | - | |
| 87 | -### Most complex files | |
| 88 | - | |
| 89 | -| file | complex | cyclo | loc | | |
| 90 | -|---|---|---|---| | |
| 91 | -| internal/agent/agent.go | 126 | 93 | 299 | | |
| 92 | -| internal/engine/engine.go | 91 | 121 | 347 | | |
| 93 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | |
| 94 | -| internal/compact/compact.go | 52 | 98 | 191 | | |
| 95 | -| internal/tui/turn.go | 42 | 88 | 343 | | |
| 96 | -| internal/tui/events.go | 41 | 129 | 239 | | |
| 97 | -| internal/acp/replay.go | 33 | 43 | 95 | | |
| 98 | -| internal/tools/files.go | 32 | 50 | 238 | | |
| 99 | -| internal/store/keeper.go | 31 | 60 | 131 | | |
| 100 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | |
| 101 | -| internal/store/store.go | 29 | 53 | 152 | | |
| 102 | -| internal/tools/tools.go | 28 | 47 | 191 | | |
| 103 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | |
| 104 | -| internal/skills/skills.go | 27 | 37 | 102 | | |
| 105 | -| internal/tui/render.go | 27 | 55 | 150 | | |
| 106 | - | |
| 107 | -## Trend | |
| 108 | - | |
| 109 | -| run | timestamp | error | warning | smells | complex | gate | | |
| 110 | -|---|---|---|---|---|---|---| | |
| 111 | -| 2 | 2026-09-15T22:33:07Z | 0 | 67 | 18 | 618 | FAIL | | |
| 112 | -| 3 | 2026-09-16T04:25:47Z | 0 | 69 | 20 | 770 | FAIL | | |
| 113 | -| 4 | 2026-09-16T04:26:38Z | 0 | 68 | 21 | 777 | FAIL | | |
| 114 | -| 5 | 2026-09-16T04:27:10Z | 0 | 67 | 20 | 777 | FAIL | | |
| 115 | -| 6 | 2026-09-16T04:31:40Z | 0 | 67 | 19 | 778 | FAIL | | |
| 116 | -| 7 | 2026-09-16T05:25:29Z | 0 | 69 | 22 | 999 | FAIL | | |
| 117 | -| 8 | 2026-09-16T05:26:49Z | 0 | 63 | 20 | 997 | FAIL | | |
| 118 | -| 9 | 2026-09-16T05:27:55Z | 0 | 63 | 19 | 997 | FAIL | | |
| 119 | -| 10 | 2026-09-16T06:09:34Z | 0 | 0 | 19 | 1028 | FAIL | | |
| 120 | -| 11 | 2026-09-16T06:12:48Z | 0 | 63 | 18 | 1029 | FAIL | | |
| deleted file mode 100644 | |||
| @@ -1,120 +0,0 @@ | |||
| 1 | -# Quality report — 2026-09-16T06:12:48Z | ||
| 2 | - | ||
| 3 | -- **Gate**: ❌ **FAIL** | ||
| 4 | -- **Commit**: `d722711` on `main` | ||
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | ||
| 6 | -- **Run**: #11 (previous: 2026-09-16T06:09:34Z) | ||
| 7 | - | ||
| 8 | -## Gate violations | ||
| 9 | - | ||
| 10 | -- warning-level issues: 63 (max 0) | ||
| 11 | -- code smells: 18 (max 0) | ||
| 12 | - | ||
| 13 | -## Lint issues (`qlty check`) | ||
| 14 | - | ||
| 15 | -| level | count | vs previous | | ||
| 16 | -|---|---|---| | ||
| 17 | -| warning | 63 | — | | ||
| 18 | - | ||
| 19 | -### Top rules | ||
| 20 | - | ||
| 21 | -| rule | count | | ||
| 22 | -|---|---| | ||
| 23 | -| golangci-lint:errcheck | 7 | | ||
| 24 | -| osv-scanner:CVE-2026-32285 | 2 | | ||
| 25 | -| osv-scanner:CVE-2026-24051 | 2 | | ||
| 26 | -| osv-scanner:CVE-2026-39883 | 2 | | ||
| 27 | -| osv-scanner:CVE-2026-29181 | 2 | | ||
| 28 | -| osv-scanner:CVE-2026-39824 | 1 | | ||
| 29 | -| osv-scanner:CVE-2026-56852 | 1 | | ||
| 30 | -| osv-scanner:CVE-2025-47910 | 1 | | ||
| 31 | -| osv-scanner:CVE-2025-47912 | 1 | | ||
| 32 | -| osv-scanner:CVE-2025-58183 | 1 | | ||
| 33 | -| osv-scanner:CVE-2025-58185 | 1 | | ||
| 34 | -| osv-scanner:CVE-2025-58186 | 1 | | ||
| 35 | -| osv-scanner:CVE-2025-58187 | 1 | | ||
| 36 | -| osv-scanner:CVE-2025-58188 | 1 | | ||
| 37 | -| osv-scanner:CVE-2025-58189 | 1 | | ||
| 38 | - | ||
| 39 | -### Most affected files | ||
| 40 | - | ||
| 41 | -| file | issues | | ||
| 42 | -|---|---| | ||
| 43 | -| go.mod | 56 | | ||
| 44 | -| internal/engine/openai_compat.go | 2 | | ||
| 45 | -| internal/fileedit/fileedit_test.go | 2 | | ||
| 46 | -| internal/fileedit/textfile.go | 2 | | ||
| 47 | -| internal/engine/engine.go | 1 | | ||
| 48 | - | ||
| 49 | -## Code smells (`qlty smells`) | ||
| 50 | - | ||
| 51 | -Total: **18** (vs previous: -1) | ||
| 52 | - | ||
| 53 | -| smell | file | line | detail | | ||
| 54 | -|---|---|---|---| | ||
| 55 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | ||
| 56 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | ||
| 57 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | ||
| 58 | -| qlty:return-statements | internal/engine/explain.go | 24 | Function with many returns (count = 9): Explain | | ||
| 59 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | ||
| 60 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | ||
| 61 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | ||
| 62 | -| qlty:return-statements | internal/agent/agent.go | 39 | Function with many returns (count = 6): Run | | ||
| 63 | -| qlty:nested-control-flow | internal/agent/agent.go | 213 | Deeply nested control flow (level = 5) | | ||
| 64 | -| qlty:nested-control-flow | internal/agent/agent.go | 222 | Deeply nested control flow (level = 5) | | ||
| 65 | -| qlty:nested-control-flow | internal/agent/agent.go | 294 | Deeply nested control flow (level = 5) | | ||
| 66 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 126) | | ||
| 67 | -| qlty:function-complexity | internal/agent/agent.go | 39 | Function with high complexity (count = 110): Run | | ||
| 68 | -| qlty:return-statements | internal/config/config.go | 293 | Function with many returns (count = 13): validate | | ||
| 69 | -| qlty:return-statements | internal/compact/compact.go | 129 | Function with many returns (count = 6): Compact | | ||
| 70 | -| qlty:return-statements | internal/compact/compact.go | 211 | Function with many returns (count = 6): Valid | | ||
| 71 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 52) | | ||
| 72 | -| qlty:function-complexity | internal/compact/compact.go | 211 | Function with high complexity (count = 22): Valid | | ||
| 73 | - | ||
| 74 | -## Metrics (`qlty metrics`) | ||
| 75 | - | ||
| 76 | -| metric | total | vs previous | | ||
| 77 | -|---|---|---| | ||
| 78 | -| funcs | 365 | ±0 | | ||
| 79 | -| classes | 70 | ±0 | | ||
| 80 | -| fields | 282 | ±0 | | ||
| 81 | -| cyclo | 1899 | +2 | | ||
| 82 | -| complex | 1029 | +1 | | ||
| 83 | -| lcom | 0 | ±0 | | ||
| 84 | -| lines | 8366 | +21 | | ||
| 85 | -| loc | 5549 | +12 | | ||
| 86 | - | ||
| 87 | -### Most complex files | ||
| 88 | - | ||
| 89 | -| file | complex | cyclo | loc | | ||
| 90 | -|---|---|---|---| | ||
| 91 | -| internal/agent/agent.go | 126 | 93 | 299 | | ||
| 92 | -| internal/engine/engine.go | 91 | 121 | 347 | | ||
| 93 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | ||
| 94 | -| internal/compact/compact.go | 52 | 98 | 191 | | ||
| 95 | -| internal/tui/turn.go | 42 | 88 | 343 | | ||
| 96 | -| internal/tui/events.go | 41 | 129 | 239 | | ||
| 97 | -| internal/acp/replay.go | 33 | 43 | 95 | | ||
| 98 | -| internal/tools/files.go | 32 | 50 | 238 | | ||
| 99 | -| internal/store/keeper.go | 31 | 60 | 131 | | ||
| 100 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | ||
| 101 | -| internal/store/store.go | 29 | 53 | 152 | | ||
| 102 | -| internal/tools/tools.go | 28 | 47 | 191 | | ||
| 103 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | ||
| 104 | -| internal/skills/skills.go | 27 | 37 | 102 | | ||
| 105 | -| internal/tui/render.go | 27 | 55 | 150 | | ||
| 106 | - | ||
| 107 | -## Trend | ||
| 108 | - | ||
| 109 | -| run | timestamp | error | warning | smells | complex | gate | | ||
| 110 | -|---|---|---|---|---|---|---| | ||
| 111 | -| 2 | 2026-09-15T22:33:07Z | 0 | 67 | 18 | 618 | FAIL | | ||
| 112 | -| 3 | 2026-09-16T04:25:47Z | 0 | 69 | 20 | 770 | FAIL | | ||
| 113 | -| 4 | 2026-09-16T04:26:38Z | 0 | 68 | 21 | 777 | FAIL | | ||
| 114 | -| 5 | 2026-09-16T04:27:10Z | 0 | 67 | 20 | 777 | FAIL | | ||
| 115 | -| 6 | 2026-09-16T04:31:40Z | 0 | 67 | 19 | 778 | FAIL | | ||
| 116 | -| 7 | 2026-09-16T05:25:29Z | 0 | 69 | 22 | 999 | FAIL | | ||
| 117 | -| 8 | 2026-09-16T05:26:49Z | 0 | 63 | 20 | 997 | FAIL | | ||
| 118 | -| 9 | 2026-09-16T05:27:55Z | 0 | 63 | 19 | 997 | FAIL | | ||
| 119 | -| 10 | 2026-09-16T06:09:34Z | 0 | 0 | 19 | 1028 | FAIL | | ||
| 120 | -| 11 | 2026-09-16T06:12:48Z | 0 | 63 | 18 | 1029 | FAIL | | ||
deleted
.quality/report-20260916T062823Z.md +0 -121 | deleted file mode 100644 | ||
| @@ -1,121 +0,0 @@ | ||
| 1 | -# Quality report — 2026-09-16T06:28:23Z | |
| 2 | - | |
| 3 | -- **Gate**: ❌ **FAIL** | |
| 4 | -- **Commit**: `d722711` on `main` | |
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | |
| 6 | -- **Run**: #12 (previous: 2026-09-16T06:12:48Z) | |
| 7 | - | |
| 8 | -## Gate violations | |
| 9 | - | |
| 10 | -- warning-level issues: 63 (max 0) | |
| 11 | -- code smells: 19 (max 0) | |
| 12 | - | |
| 13 | -## Lint issues (`qlty check`) | |
| 14 | - | |
| 15 | -| level | count | vs previous | | |
| 16 | -|---|---|---| | |
| 17 | -| warning | 63 | ±0 | | |
| 18 | - | |
| 19 | -### Top rules | |
| 20 | - | |
| 21 | -| rule | count | | |
| 22 | -|---|---| | |
| 23 | -| golangci-lint:errcheck | 7 | | |
| 24 | -| osv-scanner:CVE-2026-32285 | 2 | | |
| 25 | -| osv-scanner:CVE-2026-24051 | 2 | | |
| 26 | -| osv-scanner:CVE-2026-39883 | 2 | | |
| 27 | -| osv-scanner:CVE-2026-29181 | 2 | | |
| 28 | -| osv-scanner:CVE-2026-39824 | 1 | | |
| 29 | -| osv-scanner:CVE-2026-56852 | 1 | | |
| 30 | -| osv-scanner:CVE-2025-47910 | 1 | | |
| 31 | -| osv-scanner:CVE-2025-47912 | 1 | | |
| 32 | -| osv-scanner:CVE-2025-58183 | 1 | | |
| 33 | -| osv-scanner:CVE-2025-58185 | 1 | | |
| 34 | -| osv-scanner:CVE-2025-58186 | 1 | | |
| 35 | -| osv-scanner:CVE-2025-58187 | 1 | | |
| 36 | -| osv-scanner:CVE-2025-58188 | 1 | | |
| 37 | -| osv-scanner:CVE-2025-58189 | 1 | | |
| 38 | - | |
| 39 | -### Most affected files | |
| 40 | - | |
| 41 | -| file | issues | | |
| 42 | -|---|---| | |
| 43 | -| go.mod | 56 | | |
| 44 | -| internal/engine/openai_compat.go | 2 | | |
| 45 | -| internal/fileedit/fileedit_test.go | 2 | | |
| 46 | -| internal/fileedit/textfile.go | 2 | | |
| 47 | -| internal/engine/engine.go | 1 | | |
| 48 | - | |
| 49 | -## Code smells (`qlty smells`) | |
| 50 | - | |
| 51 | -Total: **19** (vs previous: +1) | |
| 52 | - | |
| 53 | -| smell | file | line | detail | | |
| 54 | -|---|---|---|---| | |
| 55 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | |
| 56 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | |
| 57 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | |
| 58 | -| qlty:return-statements | internal/agent/agent.go | 39 | Function with many returns (count = 6): Run | | |
| 59 | -| qlty:nested-control-flow | internal/agent/agent.go | 213 | Deeply nested control flow (level = 5) | | |
| 60 | -| qlty:nested-control-flow | internal/agent/agent.go | 222 | Deeply nested control flow (level = 5) | | |
| 61 | -| qlty:nested-control-flow | internal/agent/agent.go | 294 | Deeply nested control flow (level = 5) | | |
| 62 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 126) | | |
| 63 | -| qlty:function-complexity | internal/agent/agent.go | 39 | Function with high complexity (count = 110): Run | | |
| 64 | -| qlty:return-statements | internal/config/config.go | 293 | Function with many returns (count = 13): validate | | |
| 65 | -| qlty:file-complexity | internal/tui/events.go | 1 | High total complexity (count = 50) | | |
| 66 | -| qlty:return-statements | internal/compact/compact.go | 129 | Function with many returns (count = 6): Compact | | |
| 67 | -| qlty:return-statements | internal/compact/compact.go | 211 | Function with many returns (count = 6): Valid | | |
| 68 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 52) | | |
| 69 | -| qlty:function-complexity | internal/compact/compact.go | 211 | Function with high complexity (count = 22): Valid | | |
| 70 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | |
| 71 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | |
| 72 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | |
| 73 | -| qlty:return-statements | internal/engine/explain.go | 24 | Function with many returns (count = 9): Explain | | |
| 74 | - | |
| 75 | -## Metrics (`qlty metrics`) | |
| 76 | - | |
| 77 | -| metric | total | vs previous | | |
| 78 | -|---|---|---| | |
| 79 | -| funcs | 387 | +22 | | |
| 80 | -| classes | 73 | +3 | | |
| 81 | -| fields | 291 | +9 | | |
| 82 | -| cyclo | 1952 | +53 | | |
| 83 | -| complex | 1072 | +43 | | |
| 84 | -| lcom | 0 | ±0 | | |
| 85 | -| lines | 8660 | +294 | | |
| 86 | -| loc | 5735 | +186 | | |
| 87 | - | |
| 88 | -### Most complex files | |
| 89 | - | |
| 90 | -| file | complex | cyclo | loc | | |
| 91 | -|---|---|---|---| | |
| 92 | -| internal/agent/agent.go | 126 | 93 | 299 | | |
| 93 | -| internal/engine/engine.go | 91 | 121 | 347 | | |
| 94 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | |
| 95 | -| internal/compact/compact.go | 52 | 98 | 191 | | |
| 96 | -| internal/tui/events.go | 50 | 138 | 274 | | |
| 97 | -| internal/tui/draw.go | 42 | 98 | 175 | | |
| 98 | -| internal/tui/turn.go | 42 | 88 | 344 | | |
| 99 | -| internal/acp/replay.go | 33 | 43 | 95 | | |
| 100 | -| internal/tools/files.go | 32 | 50 | 238 | | |
| 101 | -| internal/store/keeper.go | 31 | 60 | 131 | | |
| 102 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | |
| 103 | -| internal/store/store.go | 29 | 53 | 152 | | |
| 104 | -| internal/tools/tools.go | 28 | 47 | 191 | | |
| 105 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | |
| 106 | -| internal/skills/skills.go | 27 | 37 | 102 | | |
| 107 | - | |
| 108 | -## Trend | |
| 109 | - | |
| 110 | -| run | timestamp | error | warning | smells | complex | gate | | |
| 111 | -|---|---|---|---|---|---|---| | |
| 112 | -| 3 | 2026-09-16T04:25:47Z | 0 | 69 | 20 | 770 | FAIL | | |
| 113 | -| 4 | 2026-09-16T04:26:38Z | 0 | 68 | 21 | 777 | FAIL | | |
| 114 | -| 5 | 2026-09-16T04:27:10Z | 0 | 67 | 20 | 777 | FAIL | | |
| 115 | -| 6 | 2026-09-16T04:31:40Z | 0 | 67 | 19 | 778 | FAIL | | |
| 116 | -| 7 | 2026-09-16T05:25:29Z | 0 | 69 | 22 | 999 | FAIL | | |
| 117 | -| 8 | 2026-09-16T05:26:49Z | 0 | 63 | 20 | 997 | FAIL | | |
| 118 | -| 9 | 2026-09-16T05:27:55Z | 0 | 63 | 19 | 997 | FAIL | | |
| 119 | -| 10 | 2026-09-16T06:09:34Z | 0 | 0 | 19 | 1028 | FAIL | | |
| 120 | -| 11 | 2026-09-16T06:12:48Z | 0 | 63 | 18 | 1029 | FAIL | | |
| 121 | -| 12 | 2026-09-16T06:28:23Z | 0 | 63 | 19 | 1072 | FAIL | | |
| deleted file mode 100644 | |||
| @@ -1,121 +0,0 @@ | |||
| 1 | -# Quality report — 2026-09-16T06:28:23Z | ||
| 2 | - | ||
| 3 | -- **Gate**: ❌ **FAIL** | ||
| 4 | -- **Commit**: `d722711` on `main` | ||
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | ||
| 6 | -- **Run**: #12 (previous: 2026-09-16T06:12:48Z) | ||
| 7 | - | ||
| 8 | -## Gate violations | ||
| 9 | - | ||
| 10 | -- warning-level issues: 63 (max 0) | ||
| 11 | -- code smells: 19 (max 0) | ||
| 12 | - | ||
| 13 | -## Lint issues (`qlty check`) | ||
| 14 | - | ||
| 15 | -| level | count | vs previous | | ||
| 16 | -|---|---|---| | ||
| 17 | -| warning | 63 | ±0 | | ||
| 18 | - | ||
| 19 | -### Top rules | ||
| 20 | - | ||
| 21 | -| rule | count | | ||
| 22 | -|---|---| | ||
| 23 | -| golangci-lint:errcheck | 7 | | ||
| 24 | -| osv-scanner:CVE-2026-32285 | 2 | | ||
| 25 | -| osv-scanner:CVE-2026-24051 | 2 | | ||
| 26 | -| osv-scanner:CVE-2026-39883 | 2 | | ||
| 27 | -| osv-scanner:CVE-2026-29181 | 2 | | ||
| 28 | -| osv-scanner:CVE-2026-39824 | 1 | | ||
| 29 | -| osv-scanner:CVE-2026-56852 | 1 | | ||
| 30 | -| osv-scanner:CVE-2025-47910 | 1 | | ||
| 31 | -| osv-scanner:CVE-2025-47912 | 1 | | ||
| 32 | -| osv-scanner:CVE-2025-58183 | 1 | | ||
| 33 | -| osv-scanner:CVE-2025-58185 | 1 | | ||
| 34 | -| osv-scanner:CVE-2025-58186 | 1 | | ||
| 35 | -| osv-scanner:CVE-2025-58187 | 1 | | ||
| 36 | -| osv-scanner:CVE-2025-58188 | 1 | | ||
| 37 | -| osv-scanner:CVE-2025-58189 | 1 | | ||
| 38 | - | ||
| 39 | -### Most affected files | ||
| 40 | - | ||
| 41 | -| file | issues | | ||
| 42 | -|---|---| | ||
| 43 | -| go.mod | 56 | | ||
| 44 | -| internal/engine/openai_compat.go | 2 | | ||
| 45 | -| internal/fileedit/fileedit_test.go | 2 | | ||
| 46 | -| internal/fileedit/textfile.go | 2 | | ||
| 47 | -| internal/engine/engine.go | 1 | | ||
| 48 | - | ||
| 49 | -## Code smells (`qlty smells`) | ||
| 50 | - | ||
| 51 | -Total: **19** (vs previous: +1) | ||
| 52 | - | ||
| 53 | -| smell | file | line | detail | | ||
| 54 | -|---|---|---|---| | ||
| 55 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | ||
| 56 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | ||
| 57 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | ||
| 58 | -| qlty:return-statements | internal/agent/agent.go | 39 | Function with many returns (count = 6): Run | | ||
| 59 | -| qlty:nested-control-flow | internal/agent/agent.go | 213 | Deeply nested control flow (level = 5) | | ||
| 60 | -| qlty:nested-control-flow | internal/agent/agent.go | 222 | Deeply nested control flow (level = 5) | | ||
| 61 | -| qlty:nested-control-flow | internal/agent/agent.go | 294 | Deeply nested control flow (level = 5) | | ||
| 62 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 126) | | ||
| 63 | -| qlty:function-complexity | internal/agent/agent.go | 39 | Function with high complexity (count = 110): Run | | ||
| 64 | -| qlty:return-statements | internal/config/config.go | 293 | Function with many returns (count = 13): validate | | ||
| 65 | -| qlty:file-complexity | internal/tui/events.go | 1 | High total complexity (count = 50) | | ||
| 66 | -| qlty:return-statements | internal/compact/compact.go | 129 | Function with many returns (count = 6): Compact | | ||
| 67 | -| qlty:return-statements | internal/compact/compact.go | 211 | Function with many returns (count = 6): Valid | | ||
| 68 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 52) | | ||
| 69 | -| qlty:function-complexity | internal/compact/compact.go | 211 | Function with high complexity (count = 22): Valid | | ||
| 70 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | ||
| 71 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | ||
| 72 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | ||
| 73 | -| qlty:return-statements | internal/engine/explain.go | 24 | Function with many returns (count = 9): Explain | | ||
| 74 | - | ||
| 75 | -## Metrics (`qlty metrics`) | ||
| 76 | - | ||
| 77 | -| metric | total | vs previous | | ||
| 78 | -|---|---|---| | ||
| 79 | -| funcs | 387 | +22 | | ||
| 80 | -| classes | 73 | +3 | | ||
| 81 | -| fields | 291 | +9 | | ||
| 82 | -| cyclo | 1952 | +53 | | ||
| 83 | -| complex | 1072 | +43 | | ||
| 84 | -| lcom | 0 | ±0 | | ||
| 85 | -| lines | 8660 | +294 | | ||
| 86 | -| loc | 5735 | +186 | | ||
| 87 | - | ||
| 88 | -### Most complex files | ||
| 89 | - | ||
| 90 | -| file | complex | cyclo | loc | | ||
| 91 | -|---|---|---|---| | ||
| 92 | -| internal/agent/agent.go | 126 | 93 | 299 | | ||
| 93 | -| internal/engine/engine.go | 91 | 121 | 347 | | ||
| 94 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | ||
| 95 | -| internal/compact/compact.go | 52 | 98 | 191 | | ||
| 96 | -| internal/tui/events.go | 50 | 138 | 274 | | ||
| 97 | -| internal/tui/draw.go | 42 | 98 | 175 | | ||
| 98 | -| internal/tui/turn.go | 42 | 88 | 344 | | ||
| 99 | -| internal/acp/replay.go | 33 | 43 | 95 | | ||
| 100 | -| internal/tools/files.go | 32 | 50 | 238 | | ||
| 101 | -| internal/store/keeper.go | 31 | 60 | 131 | | ||
| 102 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | ||
| 103 | -| internal/store/store.go | 29 | 53 | 152 | | ||
| 104 | -| internal/tools/tools.go | 28 | 47 | 191 | | ||
| 105 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | ||
| 106 | -| internal/skills/skills.go | 27 | 37 | 102 | | ||
| 107 | - | ||
| 108 | -## Trend | ||
| 109 | - | ||
| 110 | -| run | timestamp | error | warning | smells | complex | gate | | ||
| 111 | -|---|---|---|---|---|---|---| | ||
| 112 | -| 3 | 2026-09-16T04:25:47Z | 0 | 69 | 20 | 770 | FAIL | | ||
| 113 | -| 4 | 2026-09-16T04:26:38Z | 0 | 68 | 21 | 777 | FAIL | | ||
| 114 | -| 5 | 2026-09-16T04:27:10Z | 0 | 67 | 20 | 777 | FAIL | | ||
| 115 | -| 6 | 2026-09-16T04:31:40Z | 0 | 67 | 19 | 778 | FAIL | | ||
| 116 | -| 7 | 2026-09-16T05:25:29Z | 0 | 69 | 22 | 999 | FAIL | | ||
| 117 | -| 8 | 2026-09-16T05:26:49Z | 0 | 63 | 20 | 997 | FAIL | | ||
| 118 | -| 9 | 2026-09-16T05:27:55Z | 0 | 63 | 19 | 997 | FAIL | | ||
| 119 | -| 10 | 2026-09-16T06:09:34Z | 0 | 0 | 19 | 1028 | FAIL | | ||
| 120 | -| 11 | 2026-09-16T06:12:48Z | 0 | 63 | 18 | 1029 | FAIL | | ||
| 121 | -| 12 | 2026-09-16T06:28:23Z | 0 | 63 | 19 | 1072 | FAIL | | ||
deleted
.quality/report-20260916T062841Z.md +0 -121 | deleted file mode 100644 | ||
| @@ -1,121 +0,0 @@ | ||
| 1 | -# Quality report — 2026-09-16T06:28:41Z | |
| 2 | - | |
| 3 | -- **Gate**: ❌ **FAIL** | |
| 4 | -- **Commit**: `d722711` on `main` | |
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | |
| 6 | -- **Run**: #13 (previous: 2026-09-16T06:28:23Z) | |
| 7 | - | |
| 8 | -## Gate violations | |
| 9 | - | |
| 10 | -- warning-level issues: 63 (max 0) | |
| 11 | -- code smells: 19 (max 0) | |
| 12 | - | |
| 13 | -## Lint issues (`qlty check`) | |
| 14 | - | |
| 15 | -| level | count | vs previous | | |
| 16 | -|---|---|---| | |
| 17 | -| warning | 63 | ±0 | | |
| 18 | - | |
| 19 | -### Top rules | |
| 20 | - | |
| 21 | -| rule | count | | |
| 22 | -|---|---| | |
| 23 | -| golangci-lint:errcheck | 7 | | |
| 24 | -| osv-scanner:CVE-2026-32285 | 2 | | |
| 25 | -| osv-scanner:CVE-2026-24051 | 2 | | |
| 26 | -| osv-scanner:CVE-2026-39883 | 2 | | |
| 27 | -| osv-scanner:CVE-2026-29181 | 2 | | |
| 28 | -| osv-scanner:CVE-2026-39824 | 1 | | |
| 29 | -| osv-scanner:CVE-2026-56852 | 1 | | |
| 30 | -| osv-scanner:CVE-2025-47910 | 1 | | |
| 31 | -| osv-scanner:CVE-2025-47912 | 1 | | |
| 32 | -| osv-scanner:CVE-2025-58183 | 1 | | |
| 33 | -| osv-scanner:CVE-2025-58185 | 1 | | |
| 34 | -| osv-scanner:CVE-2025-58186 | 1 | | |
| 35 | -| osv-scanner:CVE-2025-58187 | 1 | | |
| 36 | -| osv-scanner:CVE-2025-58188 | 1 | | |
| 37 | -| osv-scanner:CVE-2025-58189 | 1 | | |
| 38 | - | |
| 39 | -### Most affected files | |
| 40 | - | |
| 41 | -| file | issues | | |
| 42 | -|---|---| | |
| 43 | -| go.mod | 56 | | |
| 44 | -| internal/engine/openai_compat.go | 2 | | |
| 45 | -| internal/fileedit/fileedit_test.go | 2 | | |
| 46 | -| internal/fileedit/textfile.go | 2 | | |
| 47 | -| internal/engine/engine.go | 1 | | |
| 48 | - | |
| 49 | -## Code smells (`qlty smells`) | |
| 50 | - | |
| 51 | -Total: **19** (vs previous: ±0) | |
| 52 | - | |
| 53 | -| smell | file | line | detail | | |
| 54 | -|---|---|---|---| | |
| 55 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | |
| 56 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | |
| 57 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | |
| 58 | -| qlty:return-statements | internal/agent/agent.go | 39 | Function with many returns (count = 6): Run | | |
| 59 | -| qlty:nested-control-flow | internal/agent/agent.go | 213 | Deeply nested control flow (level = 5) | | |
| 60 | -| qlty:nested-control-flow | internal/agent/agent.go | 222 | Deeply nested control flow (level = 5) | | |
| 61 | -| qlty:nested-control-flow | internal/agent/agent.go | 294 | Deeply nested control flow (level = 5) | | |
| 62 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 126) | | |
| 63 | -| qlty:function-complexity | internal/agent/agent.go | 39 | Function with high complexity (count = 110): Run | | |
| 64 | -| qlty:return-statements | internal/config/config.go | 293 | Function with many returns (count = 13): validate | | |
| 65 | -| qlty:file-complexity | internal/tui/events.go | 1 | High total complexity (count = 50) | | |
| 66 | -| qlty:return-statements | internal/compact/compact.go | 129 | Function with many returns (count = 6): Compact | | |
| 67 | -| qlty:return-statements | internal/compact/compact.go | 211 | Function with many returns (count = 6): Valid | | |
| 68 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 52) | | |
| 69 | -| qlty:function-complexity | internal/compact/compact.go | 211 | Function with high complexity (count = 22): Valid | | |
| 70 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | |
| 71 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | |
| 72 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | |
| 73 | -| qlty:return-statements | internal/engine/explain.go | 24 | Function with many returns (count = 9): Explain | | |
| 74 | - | |
| 75 | -## Metrics (`qlty metrics`) | |
| 76 | - | |
| 77 | -| metric | total | vs previous | | |
| 78 | -|---|---|---| | |
| 79 | -| funcs | 387 | ±0 | | |
| 80 | -| classes | 73 | ±0 | | |
| 81 | -| fields | 291 | ±0 | | |
| 82 | -| cyclo | 1952 | ±0 | | |
| 83 | -| complex | 1072 | ±0 | | |
| 84 | -| lcom | 0 | ±0 | | |
| 85 | -| lines | 8660 | ±0 | | |
| 86 | -| loc | 5735 | ±0 | | |
| 87 | - | |
| 88 | -### Most complex files | |
| 89 | - | |
| 90 | -| file | complex | cyclo | loc | | |
| 91 | -|---|---|---|---| | |
| 92 | -| internal/agent/agent.go | 126 | 93 | 299 | | |
| 93 | -| internal/engine/engine.go | 91 | 121 | 347 | | |
| 94 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | |
| 95 | -| internal/compact/compact.go | 52 | 98 | 191 | | |
| 96 | -| internal/tui/events.go | 50 | 138 | 274 | | |
| 97 | -| internal/tui/draw.go | 42 | 98 | 175 | | |
| 98 | -| internal/tui/turn.go | 42 | 88 | 344 | | |
| 99 | -| internal/acp/replay.go | 33 | 43 | 95 | | |
| 100 | -| internal/tools/files.go | 32 | 50 | 238 | | |
| 101 | -| internal/store/keeper.go | 31 | 60 | 131 | | |
| 102 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | |
| 103 | -| internal/store/store.go | 29 | 53 | 152 | | |
| 104 | -| internal/tools/tools.go | 28 | 47 | 191 | | |
| 105 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | |
| 106 | -| internal/skills/skills.go | 27 | 37 | 102 | | |
| 107 | - | |
| 108 | -## Trend | |
| 109 | - | |
| 110 | -| run | timestamp | error | warning | smells | complex | gate | | |
| 111 | -|---|---|---|---|---|---|---| | |
| 112 | -| 4 | 2026-09-16T04:26:38Z | 0 | 68 | 21 | 777 | FAIL | | |
| 113 | -| 5 | 2026-09-16T04:27:10Z | 0 | 67 | 20 | 777 | FAIL | | |
| 114 | -| 6 | 2026-09-16T04:31:40Z | 0 | 67 | 19 | 778 | FAIL | | |
| 115 | -| 7 | 2026-09-16T05:25:29Z | 0 | 69 | 22 | 999 | FAIL | | |
| 116 | -| 8 | 2026-09-16T05:26:49Z | 0 | 63 | 20 | 997 | FAIL | | |
| 117 | -| 9 | 2026-09-16T05:27:55Z | 0 | 63 | 19 | 997 | FAIL | | |
| 118 | -| 10 | 2026-09-16T06:09:34Z | 0 | 0 | 19 | 1028 | FAIL | | |
| 119 | -| 11 | 2026-09-16T06:12:48Z | 0 | 63 | 18 | 1029 | FAIL | | |
| 120 | -| 12 | 2026-09-16T06:28:23Z | 0 | 63 | 19 | 1072 | FAIL | | |
| 121 | -| 13 | 2026-09-16T06:28:41Z | 0 | 63 | 19 | 1072 | FAIL | | |
| deleted file mode 100644 | |||
| @@ -1,121 +0,0 @@ | |||
| 1 | -# Quality report — 2026-09-16T06:28:41Z | ||
| 2 | - | ||
| 3 | -- **Gate**: ❌ **FAIL** | ||
| 4 | -- **Commit**: `d722711` on `main` | ||
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | ||
| 6 | -- **Run**: #13 (previous: 2026-09-16T06:28:23Z) | ||
| 7 | - | ||
| 8 | -## Gate violations | ||
| 9 | - | ||
| 10 | -- warning-level issues: 63 (max 0) | ||
| 11 | -- code smells: 19 (max 0) | ||
| 12 | - | ||
| 13 | -## Lint issues (`qlty check`) | ||
| 14 | - | ||
| 15 | -| level | count | vs previous | | ||
| 16 | -|---|---|---| | ||
| 17 | -| warning | 63 | ±0 | | ||
| 18 | - | ||
| 19 | -### Top rules | ||
| 20 | - | ||
| 21 | -| rule | count | | ||
| 22 | -|---|---| | ||
| 23 | -| golangci-lint:errcheck | 7 | | ||
| 24 | -| osv-scanner:CVE-2026-32285 | 2 | | ||
| 25 | -| osv-scanner:CVE-2026-24051 | 2 | | ||
| 26 | -| osv-scanner:CVE-2026-39883 | 2 | | ||
| 27 | -| osv-scanner:CVE-2026-29181 | 2 | | ||
| 28 | -| osv-scanner:CVE-2026-39824 | 1 | | ||
| 29 | -| osv-scanner:CVE-2026-56852 | 1 | | ||
| 30 | -| osv-scanner:CVE-2025-47910 | 1 | | ||
| 31 | -| osv-scanner:CVE-2025-47912 | 1 | | ||
| 32 | -| osv-scanner:CVE-2025-58183 | 1 | | ||
| 33 | -| osv-scanner:CVE-2025-58185 | 1 | | ||
| 34 | -| osv-scanner:CVE-2025-58186 | 1 | | ||
| 35 | -| osv-scanner:CVE-2025-58187 | 1 | | ||
| 36 | -| osv-scanner:CVE-2025-58188 | 1 | | ||
| 37 | -| osv-scanner:CVE-2025-58189 | 1 | | ||
| 38 | - | ||
| 39 | -### Most affected files | ||
| 40 | - | ||
| 41 | -| file | issues | | ||
| 42 | -|---|---| | ||
| 43 | -| go.mod | 56 | | ||
| 44 | -| internal/engine/openai_compat.go | 2 | | ||
| 45 | -| internal/fileedit/fileedit_test.go | 2 | | ||
| 46 | -| internal/fileedit/textfile.go | 2 | | ||
| 47 | -| internal/engine/engine.go | 1 | | ||
| 48 | - | ||
| 49 | -## Code smells (`qlty smells`) | ||
| 50 | - | ||
| 51 | -Total: **19** (vs previous: ±0) | ||
| 52 | - | ||
| 53 | -| smell | file | line | detail | | ||
| 54 | -|---|---|---|---| | ||
| 55 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | ||
| 56 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | ||
| 57 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | ||
| 58 | -| qlty:return-statements | internal/agent/agent.go | 39 | Function with many returns (count = 6): Run | | ||
| 59 | -| qlty:nested-control-flow | internal/agent/agent.go | 213 | Deeply nested control flow (level = 5) | | ||
| 60 | -| qlty:nested-control-flow | internal/agent/agent.go | 222 | Deeply nested control flow (level = 5) | | ||
| 61 | -| qlty:nested-control-flow | internal/agent/agent.go | 294 | Deeply nested control flow (level = 5) | | ||
| 62 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 126) | | ||
| 63 | -| qlty:function-complexity | internal/agent/agent.go | 39 | Function with high complexity (count = 110): Run | | ||
| 64 | -| qlty:return-statements | internal/config/config.go | 293 | Function with many returns (count = 13): validate | | ||
| 65 | -| qlty:file-complexity | internal/tui/events.go | 1 | High total complexity (count = 50) | | ||
| 66 | -| qlty:return-statements | internal/compact/compact.go | 129 | Function with many returns (count = 6): Compact | | ||
| 67 | -| qlty:return-statements | internal/compact/compact.go | 211 | Function with many returns (count = 6): Valid | | ||
| 68 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 52) | | ||
| 69 | -| qlty:function-complexity | internal/compact/compact.go | 211 | Function with high complexity (count = 22): Valid | | ||
| 70 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | ||
| 71 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | ||
| 72 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | ||
| 73 | -| qlty:return-statements | internal/engine/explain.go | 24 | Function with many returns (count = 9): Explain | | ||
| 74 | - | ||
| 75 | -## Metrics (`qlty metrics`) | ||
| 76 | - | ||
| 77 | -| metric | total | vs previous | | ||
| 78 | -|---|---|---| | ||
| 79 | -| funcs | 387 | ±0 | | ||
| 80 | -| classes | 73 | ±0 | | ||
| 81 | -| fields | 291 | ±0 | | ||
| 82 | -| cyclo | 1952 | ±0 | | ||
| 83 | -| complex | 1072 | ±0 | | ||
| 84 | -| lcom | 0 | ±0 | | ||
| 85 | -| lines | 8660 | ±0 | | ||
| 86 | -| loc | 5735 | ±0 | | ||
| 87 | - | ||
| 88 | -### Most complex files | ||
| 89 | - | ||
| 90 | -| file | complex | cyclo | loc | | ||
| 91 | -|---|---|---|---| | ||
| 92 | -| internal/agent/agent.go | 126 | 93 | 299 | | ||
| 93 | -| internal/engine/engine.go | 91 | 121 | 347 | | ||
| 94 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | ||
| 95 | -| internal/compact/compact.go | 52 | 98 | 191 | | ||
| 96 | -| internal/tui/events.go | 50 | 138 | 274 | | ||
| 97 | -| internal/tui/draw.go | 42 | 98 | 175 | | ||
| 98 | -| internal/tui/turn.go | 42 | 88 | 344 | | ||
| 99 | -| internal/acp/replay.go | 33 | 43 | 95 | | ||
| 100 | -| internal/tools/files.go | 32 | 50 | 238 | | ||
| 101 | -| internal/store/keeper.go | 31 | 60 | 131 | | ||
| 102 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | ||
| 103 | -| internal/store/store.go | 29 | 53 | 152 | | ||
| 104 | -| internal/tools/tools.go | 28 | 47 | 191 | | ||
| 105 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | ||
| 106 | -| internal/skills/skills.go | 27 | 37 | 102 | | ||
| 107 | - | ||
| 108 | -## Trend | ||
| 109 | - | ||
| 110 | -| run | timestamp | error | warning | smells | complex | gate | | ||
| 111 | -|---|---|---|---|---|---|---| | ||
| 112 | -| 4 | 2026-09-16T04:26:38Z | 0 | 68 | 21 | 777 | FAIL | | ||
| 113 | -| 5 | 2026-09-16T04:27:10Z | 0 | 67 | 20 | 777 | FAIL | | ||
| 114 | -| 6 | 2026-09-16T04:31:40Z | 0 | 67 | 19 | 778 | FAIL | | ||
| 115 | -| 7 | 2026-09-16T05:25:29Z | 0 | 69 | 22 | 999 | FAIL | | ||
| 116 | -| 8 | 2026-09-16T05:26:49Z | 0 | 63 | 20 | 997 | FAIL | | ||
| 117 | -| 9 | 2026-09-16T05:27:55Z | 0 | 63 | 19 | 997 | FAIL | | ||
| 118 | -| 10 | 2026-09-16T06:09:34Z | 0 | 0 | 19 | 1028 | FAIL | | ||
| 119 | -| 11 | 2026-09-16T06:12:48Z | 0 | 63 | 18 | 1029 | FAIL | | ||
| 120 | -| 12 | 2026-09-16T06:28:23Z | 0 | 63 | 19 | 1072 | FAIL | | ||
| 121 | -| 13 | 2026-09-16T06:28:41Z | 0 | 63 | 19 | 1072 | FAIL | | ||
deleted
.quality/report-20260916T062858Z.md +0 -120 | deleted file mode 100644 | ||
| @@ -1,120 +0,0 @@ | ||
| 1 | -# Quality report — 2026-09-16T06:28:58Z | |
| 2 | - | |
| 3 | -- **Gate**: ❌ **FAIL** | |
| 4 | -- **Commit**: `d722711` on `main` | |
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | |
| 6 | -- **Run**: #14 (previous: 2026-09-16T06:28:41Z) | |
| 7 | - | |
| 8 | -## Gate violations | |
| 9 | - | |
| 10 | -- warning-level issues: 63 (max 0) | |
| 11 | -- code smells: 18 (max 0) | |
| 12 | - | |
| 13 | -## Lint issues (`qlty check`) | |
| 14 | - | |
| 15 | -| level | count | vs previous | | |
| 16 | -|---|---|---| | |
| 17 | -| warning | 63 | ±0 | | |
| 18 | - | |
| 19 | -### Top rules | |
| 20 | - | |
| 21 | -| rule | count | | |
| 22 | -|---|---| | |
| 23 | -| golangci-lint:errcheck | 7 | | |
| 24 | -| osv-scanner:CVE-2026-32285 | 2 | | |
| 25 | -| osv-scanner:CVE-2026-24051 | 2 | | |
| 26 | -| osv-scanner:CVE-2026-39883 | 2 | | |
| 27 | -| osv-scanner:CVE-2026-29181 | 2 | | |
| 28 | -| osv-scanner:CVE-2026-39824 | 1 | | |
| 29 | -| osv-scanner:CVE-2026-56852 | 1 | | |
| 30 | -| osv-scanner:CVE-2025-47910 | 1 | | |
| 31 | -| osv-scanner:CVE-2025-47912 | 1 | | |
| 32 | -| osv-scanner:CVE-2025-58183 | 1 | | |
| 33 | -| osv-scanner:CVE-2025-58185 | 1 | | |
| 34 | -| osv-scanner:CVE-2025-58186 | 1 | | |
| 35 | -| osv-scanner:CVE-2025-58187 | 1 | | |
| 36 | -| osv-scanner:CVE-2025-58188 | 1 | | |
| 37 | -| osv-scanner:CVE-2025-58189 | 1 | | |
| 38 | - | |
| 39 | -### Most affected files | |
| 40 | - | |
| 41 | -| file | issues | | |
| 42 | -|---|---| | |
| 43 | -| go.mod | 56 | | |
| 44 | -| internal/engine/openai_compat.go | 2 | | |
| 45 | -| internal/fileedit/fileedit_test.go | 2 | | |
| 46 | -| internal/fileedit/textfile.go | 2 | | |
| 47 | -| internal/engine/engine.go | 1 | | |
| 48 | - | |
| 49 | -## Code smells (`qlty smells`) | |
| 50 | - | |
| 51 | -Total: **18** (vs previous: -1) | |
| 52 | - | |
| 53 | -| smell | file | line | detail | | |
| 54 | -|---|---|---|---| | |
| 55 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | |
| 56 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | |
| 57 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | |
| 58 | -| qlty:return-statements | internal/agent/agent.go | 39 | Function with many returns (count = 6): Run | | |
| 59 | -| qlty:nested-control-flow | internal/agent/agent.go | 213 | Deeply nested control flow (level = 5) | | |
| 60 | -| qlty:nested-control-flow | internal/agent/agent.go | 222 | Deeply nested control flow (level = 5) | | |
| 61 | -| qlty:nested-control-flow | internal/agent/agent.go | 294 | Deeply nested control flow (level = 5) | | |
| 62 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 126) | | |
| 63 | -| qlty:function-complexity | internal/agent/agent.go | 39 | Function with high complexity (count = 110): Run | | |
| 64 | -| qlty:return-statements | internal/config/config.go | 293 | Function with many returns (count = 13): validate | | |
| 65 | -| qlty:return-statements | internal/compact/compact.go | 129 | Function with many returns (count = 6): Compact | | |
| 66 | -| qlty:return-statements | internal/compact/compact.go | 211 | Function with many returns (count = 6): Valid | | |
| 67 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 52) | | |
| 68 | -| qlty:function-complexity | internal/compact/compact.go | 211 | Function with high complexity (count = 22): Valid | | |
| 69 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | |
| 70 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | |
| 71 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | |
| 72 | -| qlty:return-statements | internal/engine/explain.go | 24 | Function with many returns (count = 9): Explain | | |
| 73 | - | |
| 74 | -## Metrics (`qlty metrics`) | |
| 75 | - | |
| 76 | -| metric | total | vs previous | | |
| 77 | -|---|---|---| | |
| 78 | -| funcs | 387 | ±0 | | |
| 79 | -| classes | 73 | ±0 | | |
| 80 | -| fields | 291 | ±0 | | |
| 81 | -| cyclo | 1952 | ±0 | | |
| 82 | -| complex | 1072 | ±0 | | |
| 83 | -| lcom | 0 | ±0 | | |
| 84 | -| lines | 8662 | +2 | | |
| 85 | -| loc | 5736 | +1 | | |
| 86 | - | |
| 87 | -### Most complex files | |
| 88 | - | |
| 89 | -| file | complex | cyclo | loc | | |
| 90 | -|---|---|---|---| | |
| 91 | -| internal/agent/agent.go | 126 | 93 | 299 | | |
| 92 | -| internal/engine/engine.go | 91 | 121 | 347 | | |
| 93 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | |
| 94 | -| internal/compact/compact.go | 52 | 98 | 191 | | |
| 95 | -| internal/tui/events.go | 44 | 129 | 246 | | |
| 96 | -| internal/tui/draw.go | 42 | 98 | 175 | | |
| 97 | -| internal/tui/turn.go | 42 | 88 | 344 | | |
| 98 | -| internal/acp/replay.go | 33 | 43 | 95 | | |
| 99 | -| internal/tools/files.go | 32 | 50 | 238 | | |
| 100 | -| internal/store/keeper.go | 31 | 60 | 131 | | |
| 101 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | |
| 102 | -| internal/store/store.go | 29 | 53 | 152 | | |
| 103 | -| internal/tools/tools.go | 28 | 47 | 191 | | |
| 104 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | |
| 105 | -| internal/skills/skills.go | 27 | 37 | 102 | | |
| 106 | - | |
| 107 | -## Trend | |
| 108 | - | |
| 109 | -| run | timestamp | error | warning | smells | complex | gate | | |
| 110 | -|---|---|---|---|---|---|---| | |
| 111 | -| 5 | 2026-09-16T04:27:10Z | 0 | 67 | 20 | 777 | FAIL | | |
| 112 | -| 6 | 2026-09-16T04:31:40Z | 0 | 67 | 19 | 778 | FAIL | | |
| 113 | -| 7 | 2026-09-16T05:25:29Z | 0 | 69 | 22 | 999 | FAIL | | |
| 114 | -| 8 | 2026-09-16T05:26:49Z | 0 | 63 | 20 | 997 | FAIL | | |
| 115 | -| 9 | 2026-09-16T05:27:55Z | 0 | 63 | 19 | 997 | FAIL | | |
| 116 | -| 10 | 2026-09-16T06:09:34Z | 0 | 0 | 19 | 1028 | FAIL | | |
| 117 | -| 11 | 2026-09-16T06:12:48Z | 0 | 63 | 18 | 1029 | FAIL | | |
| 118 | -| 12 | 2026-09-16T06:28:23Z | 0 | 63 | 19 | 1072 | FAIL | | |
| 119 | -| 13 | 2026-09-16T06:28:41Z | 0 | 63 | 19 | 1072 | FAIL | | |
| 120 | -| 14 | 2026-09-16T06:28:58Z | 0 | 63 | 18 | 1072 | FAIL | | |
| deleted file mode 100644 | |||
| @@ -1,120 +0,0 @@ | |||
| 1 | -# Quality report — 2026-09-16T06:28:58Z | ||
| 2 | - | ||
| 3 | -- **Gate**: ❌ **FAIL** | ||
| 4 | -- **Commit**: `d722711` on `main` | ||
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | ||
| 6 | -- **Run**: #14 (previous: 2026-09-16T06:28:41Z) | ||
| 7 | - | ||
| 8 | -## Gate violations | ||
| 9 | - | ||
| 10 | -- warning-level issues: 63 (max 0) | ||
| 11 | -- code smells: 18 (max 0) | ||
| 12 | - | ||
| 13 | -## Lint issues (`qlty check`) | ||
| 14 | - | ||
| 15 | -| level | count | vs previous | | ||
| 16 | -|---|---|---| | ||
| 17 | -| warning | 63 | ±0 | | ||
| 18 | - | ||
| 19 | -### Top rules | ||
| 20 | - | ||
| 21 | -| rule | count | | ||
| 22 | -|---|---| | ||
| 23 | -| golangci-lint:errcheck | 7 | | ||
| 24 | -| osv-scanner:CVE-2026-32285 | 2 | | ||
| 25 | -| osv-scanner:CVE-2026-24051 | 2 | | ||
| 26 | -| osv-scanner:CVE-2026-39883 | 2 | | ||
| 27 | -| osv-scanner:CVE-2026-29181 | 2 | | ||
| 28 | -| osv-scanner:CVE-2026-39824 | 1 | | ||
| 29 | -| osv-scanner:CVE-2026-56852 | 1 | | ||
| 30 | -| osv-scanner:CVE-2025-47910 | 1 | | ||
| 31 | -| osv-scanner:CVE-2025-47912 | 1 | | ||
| 32 | -| osv-scanner:CVE-2025-58183 | 1 | | ||
| 33 | -| osv-scanner:CVE-2025-58185 | 1 | | ||
| 34 | -| osv-scanner:CVE-2025-58186 | 1 | | ||
| 35 | -| osv-scanner:CVE-2025-58187 | 1 | | ||
| 36 | -| osv-scanner:CVE-2025-58188 | 1 | | ||
| 37 | -| osv-scanner:CVE-2025-58189 | 1 | | ||
| 38 | - | ||
| 39 | -### Most affected files | ||
| 40 | - | ||
| 41 | -| file | issues | | ||
| 42 | -|---|---| | ||
| 43 | -| go.mod | 56 | | ||
| 44 | -| internal/engine/openai_compat.go | 2 | | ||
| 45 | -| internal/fileedit/fileedit_test.go | 2 | | ||
| 46 | -| internal/fileedit/textfile.go | 2 | | ||
| 47 | -| internal/engine/engine.go | 1 | | ||
| 48 | - | ||
| 49 | -## Code smells (`qlty smells`) | ||
| 50 | - | ||
| 51 | -Total: **18** (vs previous: -1) | ||
| 52 | - | ||
| 53 | -| smell | file | line | detail | | ||
| 54 | -|---|---|---|---| | ||
| 55 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | ||
| 56 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | ||
| 57 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | ||
| 58 | -| qlty:return-statements | internal/agent/agent.go | 39 | Function with many returns (count = 6): Run | | ||
| 59 | -| qlty:nested-control-flow | internal/agent/agent.go | 213 | Deeply nested control flow (level = 5) | | ||
| 60 | -| qlty:nested-control-flow | internal/agent/agent.go | 222 | Deeply nested control flow (level = 5) | | ||
| 61 | -| qlty:nested-control-flow | internal/agent/agent.go | 294 | Deeply nested control flow (level = 5) | | ||
| 62 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 126) | | ||
| 63 | -| qlty:function-complexity | internal/agent/agent.go | 39 | Function with high complexity (count = 110): Run | | ||
| 64 | -| qlty:return-statements | internal/config/config.go | 293 | Function with many returns (count = 13): validate | | ||
| 65 | -| qlty:return-statements | internal/compact/compact.go | 129 | Function with many returns (count = 6): Compact | | ||
| 66 | -| qlty:return-statements | internal/compact/compact.go | 211 | Function with many returns (count = 6): Valid | | ||
| 67 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 52) | | ||
| 68 | -| qlty:function-complexity | internal/compact/compact.go | 211 | Function with high complexity (count = 22): Valid | | ||
| 69 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | ||
| 70 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | ||
| 71 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | ||
| 72 | -| qlty:return-statements | internal/engine/explain.go | 24 | Function with many returns (count = 9): Explain | | ||
| 73 | - | ||
| 74 | -## Metrics (`qlty metrics`) | ||
| 75 | - | ||
| 76 | -| metric | total | vs previous | | ||
| 77 | -|---|---|---| | ||
| 78 | -| funcs | 387 | ±0 | | ||
| 79 | -| classes | 73 | ±0 | | ||
| 80 | -| fields | 291 | ±0 | | ||
| 81 | -| cyclo | 1952 | ±0 | | ||
| 82 | -| complex | 1072 | ±0 | | ||
| 83 | -| lcom | 0 | ±0 | | ||
| 84 | -| lines | 8662 | +2 | | ||
| 85 | -| loc | 5736 | +1 | | ||
| 86 | - | ||
| 87 | -### Most complex files | ||
| 88 | - | ||
| 89 | -| file | complex | cyclo | loc | | ||
| 90 | -|---|---|---|---| | ||
| 91 | -| internal/agent/agent.go | 126 | 93 | 299 | | ||
| 92 | -| internal/engine/engine.go | 91 | 121 | 347 | | ||
| 93 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | ||
| 94 | -| internal/compact/compact.go | 52 | 98 | 191 | | ||
| 95 | -| internal/tui/events.go | 44 | 129 | 246 | | ||
| 96 | -| internal/tui/draw.go | 42 | 98 | 175 | | ||
| 97 | -| internal/tui/turn.go | 42 | 88 | 344 | | ||
| 98 | -| internal/acp/replay.go | 33 | 43 | 95 | | ||
| 99 | -| internal/tools/files.go | 32 | 50 | 238 | | ||
| 100 | -| internal/store/keeper.go | 31 | 60 | 131 | | ||
| 101 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | ||
| 102 | -| internal/store/store.go | 29 | 53 | 152 | | ||
| 103 | -| internal/tools/tools.go | 28 | 47 | 191 | | ||
| 104 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | ||
| 105 | -| internal/skills/skills.go | 27 | 37 | 102 | | ||
| 106 | - | ||
| 107 | -## Trend | ||
| 108 | - | ||
| 109 | -| run | timestamp | error | warning | smells | complex | gate | | ||
| 110 | -|---|---|---|---|---|---|---| | ||
| 111 | -| 5 | 2026-09-16T04:27:10Z | 0 | 67 | 20 | 777 | FAIL | | ||
| 112 | -| 6 | 2026-09-16T04:31:40Z | 0 | 67 | 19 | 778 | FAIL | | ||
| 113 | -| 7 | 2026-09-16T05:25:29Z | 0 | 69 | 22 | 999 | FAIL | | ||
| 114 | -| 8 | 2026-09-16T05:26:49Z | 0 | 63 | 20 | 997 | FAIL | | ||
| 115 | -| 9 | 2026-09-16T05:27:55Z | 0 | 63 | 19 | 997 | FAIL | | ||
| 116 | -| 10 | 2026-09-16T06:09:34Z | 0 | 0 | 19 | 1028 | FAIL | | ||
| 117 | -| 11 | 2026-09-16T06:12:48Z | 0 | 63 | 18 | 1029 | FAIL | | ||
| 118 | -| 12 | 2026-09-16T06:28:23Z | 0 | 63 | 19 | 1072 | FAIL | | ||
| 119 | -| 13 | 2026-09-16T06:28:41Z | 0 | 63 | 19 | 1072 | FAIL | | ||
| 120 | -| 14 | 2026-09-16T06:28:58Z | 0 | 63 | 18 | 1072 | FAIL | | ||
deleted
.quality/report-latest.md +0 -120 | deleted file mode 100644 | ||
| @@ -1,120 +0,0 @@ | ||
| 1 | -# Quality report — 2026-09-16T06:28:58Z | |
| 2 | - | |
| 3 | -- **Gate**: ❌ **FAIL** | |
| 4 | -- **Commit**: `d722711` on `main` | |
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | |
| 6 | -- **Run**: #14 (previous: 2026-09-16T06:28:41Z) | |
| 7 | - | |
| 8 | -## Gate violations | |
| 9 | - | |
| 10 | -- warning-level issues: 63 (max 0) | |
| 11 | -- code smells: 18 (max 0) | |
| 12 | - | |
| 13 | -## Lint issues (`qlty check`) | |
| 14 | - | |
| 15 | -| level | count | vs previous | | |
| 16 | -|---|---|---| | |
| 17 | -| warning | 63 | ±0 | | |
| 18 | - | |
| 19 | -### Top rules | |
| 20 | - | |
| 21 | -| rule | count | | |
| 22 | -|---|---| | |
| 23 | -| golangci-lint:errcheck | 7 | | |
| 24 | -| osv-scanner:CVE-2026-32285 | 2 | | |
| 25 | -| osv-scanner:CVE-2026-24051 | 2 | | |
| 26 | -| osv-scanner:CVE-2026-39883 | 2 | | |
| 27 | -| osv-scanner:CVE-2026-29181 | 2 | | |
| 28 | -| osv-scanner:CVE-2026-39824 | 1 | | |
| 29 | -| osv-scanner:CVE-2026-56852 | 1 | | |
| 30 | -| osv-scanner:CVE-2025-47910 | 1 | | |
| 31 | -| osv-scanner:CVE-2025-47912 | 1 | | |
| 32 | -| osv-scanner:CVE-2025-58183 | 1 | | |
| 33 | -| osv-scanner:CVE-2025-58185 | 1 | | |
| 34 | -| osv-scanner:CVE-2025-58186 | 1 | | |
| 35 | -| osv-scanner:CVE-2025-58187 | 1 | | |
| 36 | -| osv-scanner:CVE-2025-58188 | 1 | | |
| 37 | -| osv-scanner:CVE-2025-58189 | 1 | | |
| 38 | - | |
| 39 | -### Most affected files | |
| 40 | - | |
| 41 | -| file | issues | | |
| 42 | -|---|---| | |
| 43 | -| go.mod | 56 | | |
| 44 | -| internal/engine/openai_compat.go | 2 | | |
| 45 | -| internal/fileedit/fileedit_test.go | 2 | | |
| 46 | -| internal/fileedit/textfile.go | 2 | | |
| 47 | -| internal/engine/engine.go | 1 | | |
| 48 | - | |
| 49 | -## Code smells (`qlty smells`) | |
| 50 | - | |
| 51 | -Total: **18** (vs previous: -1) | |
| 52 | - | |
| 53 | -| smell | file | line | detail | | |
| 54 | -|---|---|---|---| | |
| 55 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | |
| 56 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | |
| 57 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | |
| 58 | -| qlty:return-statements | internal/agent/agent.go | 39 | Function with many returns (count = 6): Run | | |
| 59 | -| qlty:nested-control-flow | internal/agent/agent.go | 213 | Deeply nested control flow (level = 5) | | |
| 60 | -| qlty:nested-control-flow | internal/agent/agent.go | 222 | Deeply nested control flow (level = 5) | | |
| 61 | -| qlty:nested-control-flow | internal/agent/agent.go | 294 | Deeply nested control flow (level = 5) | | |
| 62 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 126) | | |
| 63 | -| qlty:function-complexity | internal/agent/agent.go | 39 | Function with high complexity (count = 110): Run | | |
| 64 | -| qlty:return-statements | internal/config/config.go | 293 | Function with many returns (count = 13): validate | | |
| 65 | -| qlty:return-statements | internal/compact/compact.go | 129 | Function with many returns (count = 6): Compact | | |
| 66 | -| qlty:return-statements | internal/compact/compact.go | 211 | Function with many returns (count = 6): Valid | | |
| 67 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 52) | | |
| 68 | -| qlty:function-complexity | internal/compact/compact.go | 211 | Function with high complexity (count = 22): Valid | | |
| 69 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | |
| 70 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | |
| 71 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | |
| 72 | -| qlty:return-statements | internal/engine/explain.go | 24 | Function with many returns (count = 9): Explain | | |
| 73 | - | |
| 74 | -## Metrics (`qlty metrics`) | |
| 75 | - | |
| 76 | -| metric | total | vs previous | | |
| 77 | -|---|---|---| | |
| 78 | -| funcs | 387 | ±0 | | |
| 79 | -| classes | 73 | ±0 | | |
| 80 | -| fields | 291 | ±0 | | |
| 81 | -| cyclo | 1952 | ±0 | | |
| 82 | -| complex | 1072 | ±0 | | |
| 83 | -| lcom | 0 | ±0 | | |
| 84 | -| lines | 8662 | +2 | | |
| 85 | -| loc | 5736 | +1 | | |
| 86 | - | |
| 87 | -### Most complex files | |
| 88 | - | |
| 89 | -| file | complex | cyclo | loc | | |
| 90 | -|---|---|---|---| | |
| 91 | -| internal/agent/agent.go | 126 | 93 | 299 | | |
| 92 | -| internal/engine/engine.go | 91 | 121 | 347 | | |
| 93 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | |
| 94 | -| internal/compact/compact.go | 52 | 98 | 191 | | |
| 95 | -| internal/tui/events.go | 44 | 129 | 246 | | |
| 96 | -| internal/tui/draw.go | 42 | 98 | 175 | | |
| 97 | -| internal/tui/turn.go | 42 | 88 | 344 | | |
| 98 | -| internal/acp/replay.go | 33 | 43 | 95 | | |
| 99 | -| internal/tools/files.go | 32 | 50 | 238 | | |
| 100 | -| internal/store/keeper.go | 31 | 60 | 131 | | |
| 101 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | |
| 102 | -| internal/store/store.go | 29 | 53 | 152 | | |
| 103 | -| internal/tools/tools.go | 28 | 47 | 191 | | |
| 104 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | |
| 105 | -| internal/skills/skills.go | 27 | 37 | 102 | | |
| 106 | - | |
| 107 | -## Trend | |
| 108 | - | |
| 109 | -| run | timestamp | error | warning | smells | complex | gate | | |
| 110 | -|---|---|---|---|---|---|---| | |
| 111 | -| 5 | 2026-09-16T04:27:10Z | 0 | 67 | 20 | 777 | FAIL | | |
| 112 | -| 6 | 2026-09-16T04:31:40Z | 0 | 67 | 19 | 778 | FAIL | | |
| 113 | -| 7 | 2026-09-16T05:25:29Z | 0 | 69 | 22 | 999 | FAIL | | |
| 114 | -| 8 | 2026-09-16T05:26:49Z | 0 | 63 | 20 | 997 | FAIL | | |
| 115 | -| 9 | 2026-09-16T05:27:55Z | 0 | 63 | 19 | 997 | FAIL | | |
| 116 | -| 10 | 2026-09-16T06:09:34Z | 0 | 0 | 19 | 1028 | FAIL | | |
| 117 | -| 11 | 2026-09-16T06:12:48Z | 0 | 63 | 18 | 1029 | FAIL | | |
| 118 | -| 12 | 2026-09-16T06:28:23Z | 0 | 63 | 19 | 1072 | FAIL | | |
| 119 | -| 13 | 2026-09-16T06:28:41Z | 0 | 63 | 19 | 1072 | FAIL | | |
| 120 | -| 14 | 2026-09-16T06:28:58Z | 0 | 63 | 18 | 1072 | FAIL | | |
| deleted file mode 100644 | |||
| @@ -1,120 +0,0 @@ | |||
| 1 | -# Quality report — 2026-09-16T06:28:58Z | ||
| 2 | - | ||
| 3 | -- **Gate**: ❌ **FAIL** | ||
| 4 | -- **Commit**: `d722711` on `main` | ||
| 5 | -- **qlty**: qlty 0.639.0 linux-arm64 (d9801f1 2026-07-23) | ||
| 6 | -- **Run**: #14 (previous: 2026-09-16T06:28:41Z) | ||
| 7 | - | ||
| 8 | -## Gate violations | ||
| 9 | - | ||
| 10 | -- warning-level issues: 63 (max 0) | ||
| 11 | -- code smells: 18 (max 0) | ||
| 12 | - | ||
| 13 | -## Lint issues (`qlty check`) | ||
| 14 | - | ||
| 15 | -| level | count | vs previous | | ||
| 16 | -|---|---|---| | ||
| 17 | -| warning | 63 | ±0 | | ||
| 18 | - | ||
| 19 | -### Top rules | ||
| 20 | - | ||
| 21 | -| rule | count | | ||
| 22 | -|---|---| | ||
| 23 | -| golangci-lint:errcheck | 7 | | ||
| 24 | -| osv-scanner:CVE-2026-32285 | 2 | | ||
| 25 | -| osv-scanner:CVE-2026-24051 | 2 | | ||
| 26 | -| osv-scanner:CVE-2026-39883 | 2 | | ||
| 27 | -| osv-scanner:CVE-2026-29181 | 2 | | ||
| 28 | -| osv-scanner:CVE-2026-39824 | 1 | | ||
| 29 | -| osv-scanner:CVE-2026-56852 | 1 | | ||
| 30 | -| osv-scanner:CVE-2025-47910 | 1 | | ||
| 31 | -| osv-scanner:CVE-2025-47912 | 1 | | ||
| 32 | -| osv-scanner:CVE-2025-58183 | 1 | | ||
| 33 | -| osv-scanner:CVE-2025-58185 | 1 | | ||
| 34 | -| osv-scanner:CVE-2025-58186 | 1 | | ||
| 35 | -| osv-scanner:CVE-2025-58187 | 1 | | ||
| 36 | -| osv-scanner:CVE-2025-58188 | 1 | | ||
| 37 | -| osv-scanner:CVE-2025-58189 | 1 | | ||
| 38 | - | ||
| 39 | -### Most affected files | ||
| 40 | - | ||
| 41 | -| file | issues | | ||
| 42 | -|---|---| | ||
| 43 | -| go.mod | 56 | | ||
| 44 | -| internal/engine/openai_compat.go | 2 | | ||
| 45 | -| internal/fileedit/fileedit_test.go | 2 | | ||
| 46 | -| internal/fileedit/textfile.go | 2 | | ||
| 47 | -| internal/engine/engine.go | 1 | | ||
| 48 | - | ||
| 49 | -## Code smells (`qlty smells`) | ||
| 50 | - | ||
| 51 | -Total: **18** (vs previous: -1) | ||
| 52 | - | ||
| 53 | -| smell | file | line | detail | | ||
| 54 | -|---|---|---|---| | ||
| 55 | -| qlty:return-statements | internal/fileedit/textfile.go | 94 | Function with many returns (count = 7): write | | ||
| 56 | -| qlty:file-complexity | internal/fileedit/diff.go | 1 | High total complexity (count = 89) | | ||
| 57 | -| qlty:function-complexity | internal/fileedit/diff.go | 136 | Function with high complexity (count = 20): middle | | ||
| 58 | -| qlty:return-statements | internal/agent/agent.go | 39 | Function with many returns (count = 6): Run | | ||
| 59 | -| qlty:nested-control-flow | internal/agent/agent.go | 213 | Deeply nested control flow (level = 5) | | ||
| 60 | -| qlty:nested-control-flow | internal/agent/agent.go | 222 | Deeply nested control flow (level = 5) | | ||
| 61 | -| qlty:nested-control-flow | internal/agent/agent.go | 294 | Deeply nested control flow (level = 5) | | ||
| 62 | -| qlty:file-complexity | internal/agent/agent.go | 1 | High total complexity (count = 126) | | ||
| 63 | -| qlty:function-complexity | internal/agent/agent.go | 39 | Function with high complexity (count = 110): Run | | ||
| 64 | -| qlty:return-statements | internal/config/config.go | 293 | Function with many returns (count = 13): validate | | ||
| 65 | -| qlty:return-statements | internal/compact/compact.go | 129 | Function with many returns (count = 6): Compact | | ||
| 66 | -| qlty:return-statements | internal/compact/compact.go | 211 | Function with many returns (count = 6): Valid | | ||
| 67 | -| qlty:file-complexity | internal/compact/compact.go | 1 | High total complexity (count = 52) | | ||
| 68 | -| qlty:function-complexity | internal/compact/compact.go | 211 | Function with high complexity (count = 22): Valid | | ||
| 69 | -| qlty:return-statements | internal/engine/engine.go | 226 | Function with many returns (count = 7): Generate | | ||
| 70 | -| qlty:file-complexity | internal/engine/engine.go | 1 | High total complexity (count = 91) | | ||
| 71 | -| qlty:function-complexity | internal/engine/engine.go | 226 | Function with high complexity (count = 18): Generate | | ||
| 72 | -| qlty:return-statements | internal/engine/explain.go | 24 | Function with many returns (count = 9): Explain | | ||
| 73 | - | ||
| 74 | -## Metrics (`qlty metrics`) | ||
| 75 | - | ||
| 76 | -| metric | total | vs previous | | ||
| 77 | -|---|---|---| | ||
| 78 | -| funcs | 387 | ±0 | | ||
| 79 | -| classes | 73 | ±0 | | ||
| 80 | -| fields | 291 | ±0 | | ||
| 81 | -| cyclo | 1952 | ±0 | | ||
| 82 | -| complex | 1072 | ±0 | | ||
| 83 | -| lcom | 0 | ±0 | | ||
| 84 | -| lines | 8662 | +2 | | ||
| 85 | -| loc | 5736 | +1 | | ||
| 86 | - | ||
| 87 | -### Most complex files | ||
| 88 | - | ||
| 89 | -| file | complex | cyclo | loc | | ||
| 90 | -|---|---|---|---| | ||
| 91 | -| internal/agent/agent.go | 126 | 93 | 299 | | ||
| 92 | -| internal/engine/engine.go | 91 | 121 | 347 | | ||
| 93 | -| internal/fileedit/diff.go | 89 | 177 | 271 | | ||
| 94 | -| internal/compact/compact.go | 52 | 98 | 191 | | ||
| 95 | -| internal/tui/events.go | 44 | 129 | 246 | | ||
| 96 | -| internal/tui/draw.go | 42 | 98 | 175 | | ||
| 97 | -| internal/tui/turn.go | 42 | 88 | 344 | | ||
| 98 | -| internal/acp/replay.go | 33 | 43 | 95 | | ||
| 99 | -| internal/tools/files.go | 32 | 50 | 238 | | ||
| 100 | -| internal/store/keeper.go | 31 | 60 | 131 | | ||
| 101 | -| internal/engine/openai_compat.go | 29 | 51 | 176 | | ||
| 102 | -| internal/store/store.go | 29 | 53 | 152 | | ||
| 103 | -| internal/tools/tools.go | 28 | 47 | 191 | | ||
| 104 | -| internal/fileedit/fileedit.go | 27 | 50 | 125 | | ||
| 105 | -| internal/skills/skills.go | 27 | 37 | 102 | | ||
| 106 | - | ||
| 107 | -## Trend | ||
| 108 | - | ||
| 109 | -| run | timestamp | error | warning | smells | complex | gate | | ||
| 110 | -|---|---|---|---|---|---|---| | ||
| 111 | -| 5 | 2026-09-16T04:27:10Z | 0 | 67 | 20 | 777 | FAIL | | ||
| 112 | -| 6 | 2026-09-16T04:31:40Z | 0 | 67 | 19 | 778 | FAIL | | ||
| 113 | -| 7 | 2026-09-16T05:25:29Z | 0 | 69 | 22 | 999 | FAIL | | ||
| 114 | -| 8 | 2026-09-16T05:26:49Z | 0 | 63 | 20 | 997 | FAIL | | ||
| 115 | -| 9 | 2026-09-16T05:27:55Z | 0 | 63 | 19 | 997 | FAIL | | ||
| 116 | -| 10 | 2026-09-16T06:09:34Z | 0 | 0 | 19 | 1028 | FAIL | | ||
| 117 | -| 11 | 2026-09-16T06:12:48Z | 0 | 63 | 18 | 1029 | FAIL | | ||
| 118 | -| 12 | 2026-09-16T06:28:23Z | 0 | 63 | 19 | 1072 | FAIL | | ||
| 119 | -| 13 | 2026-09-16T06:28:41Z | 0 | 63 | 19 | 1072 | FAIL | | ||
| 120 | -| 14 | 2026-09-16T06:28:58Z | 0 | 63 | 18 | 1072 | FAIL | | ||