Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
212 commits
Select commit Hold shift + click to select a range
457a020
fix: enable reqwest query feature for API compatibility
josecelano Jan 26, 2026
ac47c1b
fix: suppress clippy warnings for large error types in config tests
josecelano Jan 26, 2026
93fc909
Merge torrust/torrust-tracker#1642: chore(deps): update dependencies
josecelano Jan 26, 2026
046d5c9
chore(deps): update dependencies
josecelano Feb 20, 2026
f737ace
fix: resolve compilation errors after dependency updates
josecelano Feb 20, 2026
56429b9
Merge torrust/torrust-tracker#1654: chore(deps): update dependencies
josecelano Feb 20, 2026
ed0937b
chore(deps): update dependencies
josecelano Mar 3, 2026
29edbb6
fix: collapse nested if into match arm guard in pagination test
josecelano Mar 3, 2026
7e322eb
ci: upgrade actions/upload-artifact from v6 to v7 in generate_coverag…
josecelano Mar 3, 2026
194f039
Merge torrust/torrust-tracker#1658: chore(deps): update dependencies
josecelano Mar 3, 2026
de47145
fix: add sleep after HTTP server stop in health check test to avoid r…
josecelano Mar 3, 2026
4396ec7
Merge torrust/torrust-tracker#1662: fix: add sleep after HTTP server …
josecelano Mar 3, 2026
1228a2b
chore(deps): update dependencies
josecelano Apr 7, 2026
fdea353
Merge torrust/torrust-tracker#1677: chore(deps): update dependencies
josecelano Apr 8, 2026
48e9606
refactor: extract project dictionary from cSpell.json
josecelano Apr 8, 2026
4b814c8
Merge torrust/torrust-tracker#1678: refactor: extract project diction…
josecelano Apr 8, 2026
c88f66c
chore(deps): bump docker/login-action from 3 to 4
dependabot[bot] Apr 8, 2026
504135d
chore(deps): bump docker/metadata-action from 5 to 6
dependabot[bot] Apr 8, 2026
2c78850
chore(deps): bump docker/setup-buildx-action from 3 to 4
dependabot[bot] Apr 8, 2026
4f3f195
chore(deps): bump docker/build-push-action from 6 to 7
dependabot[bot] Apr 8, 2026
1ef5b41
Merge torrust/torrust-tracker#1679: chore(deps): consolidate Docker G…
josecelano Apr 8, 2026
f2612dc
docs(issue-523): add internal linting implementation plan
josecelano Apr 8, 2026
fa3b491
ci(lint): add linter config files
josecelano Apr 8, 2026
bc1f8cc
fix(lint/clippy): resolve pedantic duration and style violations
josecelano Apr 8, 2026
f9b59f0
fix(lint/cspell): configure ignores and dictionary for repo
josecelano Apr 8, 2026
b654fa5
fix(lint/markdown): resolve markdownlint violations
josecelano Apr 8, 2026
0e174af
fix(lint/yaml): resolve workflow yamllint issues
josecelano Apr 8, 2026
7085250
fix(lint/toml): normalize taplo formatting across workspace
josecelano Apr 8, 2026
1d3ba50
ci(lint): switch testing workflow to internal linting tool
josecelano Apr 8, 2026
4088c82
Merge torrust/torrust-tracker#1680: ci: migrate issue #523 to interna…
josecelano Apr 8, 2026
b90e091
chore(deps): update dependencies
josecelano Apr 15, 2026
7b5f4b4
fix(udp-tracker-core): align cipher with blowfish update
josecelano Apr 15, 2026
657dcb9
Merge torrust/torrust-tracker#1688: chore(deps): update dependencies
josecelano Apr 16, 2026
a55c2ae
chore(deps): update dependencies
josecelano Apr 16, 2026
e47a5e9
chore(ci): upgrade codecov/codecov-action from v5 to v6
josecelano Apr 16, 2026
ef5be41
Merge torrust/torrust-tracker#1690: chore(deps): update dependencies
josecelano Apr 16, 2026
92929ba
docs(#1595): Add build-essential to Prerequisites
josecelano Apr 16, 2026
d178b2b
Merge torrust/torrust-tracker#1691: docs: Add build-essential to Prer…
josecelano Apr 16, 2026
bcbef65
docs(configuration): document MySQL DSN password URL-encoding
josecelano Apr 16, 2026
0ed564c
Merge torrust/torrust-tracker#1692: Document MySQL DSN password URL-e…
josecelano Apr 17, 2026
e7a3a8a
chore: update dependencies
josecelano Apr 20, 2026
1ba176d
chore(deps): bump actions/setup-node from 5 to 6
josecelano Apr 20, 2026
cb70ca0
chore(deps): bump actions/github-script from 8 to 9
josecelano Apr 20, 2026
37e72c5
Merge torrust/torrust-tracker#1696: chore: update dependencies
josecelano Apr 20, 2026
3b1e292
docs(issues): add issue spec for #1697 (AI agent configuration)
josecelano Apr 20, 2026
fa1f6d1
Merge torrust/torrust-tracker#1698: docs(issues): add issue spec for …
josecelano Apr 20, 2026
5593dd2
docs(agents): add root AGENTS.md
josecelano Apr 20, 2026
760fafc
chore(cspell): merge cSpell.json into cspell.json
josecelano Apr 20, 2026
03ec3bb
docs(agents): add packages/AGENTS.md with package architecture guide
josecelano Apr 20, 2026
d4efa67
docs(issues): update progress for issue #1697 task 1
josecelano Apr 20, 2026
9831b24
docs(agents): add src/AGENTS.md with bootstrap wiring guide
josecelano Apr 20, 2026
0900452
docs(agents): add agent skills, pre-commit scripts, git hooks, ADR in…
josecelano Apr 20, 2026
60dc5f5
feat(agents): add custom agents for committer, implementer, and compl…
josecelano Apr 20, 2026
36908d8
ci(copilot): add copilot-setup-steps workflow (#1697)
josecelano Apr 20, 2026
f35cd74
docs(adrs): add ADR for AI agent framework approach (#1697)
josecelano Apr 20, 2026
14b6135
docs(agents): fix inconsistencies found in Copilot PR review (#1697)
josecelano Apr 21, 2026
a71ac07
docs(issues): mark issue #1697 as fully complete
josecelano Apr 21, 2026
492a8ac
fix(agents): address second-round Copilot PR review suggestions (#1697)
josecelano Apr 21, 2026
4fc97a0
fix(agents): correct package names and clock API in skills (#1697)
josecelano Apr 21, 2026
a95af24
Merge torrust/torrust-tracker#1699: feat(agents): set up basic AI age…
josecelano Apr 21, 2026
de41a57
docs(issues): add implementation specs for EPIC #1525 overhaul persis…
josecelano Apr 21, 2026
ee599dc
docs(issues): address Copilot review comments on PR #1702
josecelano Apr 21, 2026
0cc8528
docs(issues): add missing container changes to 1525-08 spec
josecelano Apr 22, 2026
4b8a21f
Merge torrust/torrust-tracker#1702: docs(issues): add implementation …
josecelano Apr 22, 2026
8efa87f
refactor(dev-tools): consolidate git hook scripts under contrib/dev-t…
josecelano Apr 22, 2026
b3d1e6b
fix(dev-tools): address Copilot review suggestions on PR #1704
josecelano Apr 22, 2026
d51ef29
Merge torrust/torrust-tracker#1704: refactor(dev-tools): consolidate …
josecelano Apr 22, 2026
fe8feda
docs(issues): rename and link issue spec 1525-01 to GitHub issue #1703
josecelano Apr 22, 2026
7b3d944
fix(protocol): saturate scrape counters and add regression tests
josecelano Apr 22, 2026
6342067
ci(tracker-core): add mysql compatibility matrix job
josecelano Apr 22, 2026
f523745
test(tracker-core): clarify db compatibility test usage
josecelano Apr 22, 2026
c1ebdc7
Merge torrust/torrust-tracker#1705: ci(tracker-core): add DB compatib…
josecelano Apr 22, 2026
1c34026
docs(issues): rename 1525-02 spec for issue 1706
josecelano Apr 22, 2026
55ef63a
feat(qbittorrent-e2e): add --keep-containers flag and fix race condit…
josecelano Apr 22, 2026
2885f0b
test(qbittorrent-e2e): verify leecher completion and update troublesh…
josecelano Apr 22, 2026
d154153
fix(qbittorrent-e2e): address PR review feedback
josecelano Apr 22, 2026
24061f5
docs(skills): add PR review thread workflows
josecelano Apr 22, 2026
6f8959d
docs(agents): clarify linter command usage
josecelano Apr 22, 2026
a5f7a23
refactor(qbittorrent-e2e): extract bencode helpers
josecelano Apr 22, 2026
cc6ce0b
refactor(qbittorrent-e2e): extract single-client initialization
josecelano Apr 22, 2026
231b1ee
refactor(qbittorrent-e2e): extract single-client torrent upload
josecelano Apr 22, 2026
abdfc29
refactor(qbittorrent-e2e): extract single-client torrent counting
josecelano Apr 22, 2026
293d591
refactor(qbittorrent-e2e): extract workspace module
josecelano Apr 22, 2026
8e4341d
refactor(qbittorrent-e2e): move upload label context into qbittorrent…
josecelano Apr 22, 2026
55076cd
refactor(qbittorrent-e2e): extract torrent upload value type
josecelano Apr 22, 2026
086aeec
refactor(qbittorrent-e2e): inline torrent upload helper
josecelano Apr 22, 2026
ddd39e0
refactor(qbittorrent-e2e): move torrent count logic into client
josecelano Apr 22, 2026
757009f
refactor(qbittorrent-e2e): replace path and polling literals with con…
josecelano Apr 22, 2026
a84b53a
refactor(qbittorrent-e2e): add aliases for client pair signatures
josecelano Apr 22, 2026
d0ae4a8
refactor(qbittorrent-e2e): normalize runner role and service naming
josecelano Apr 23, 2026
e1a0bfa
refactor(qbittorrent-e2e): extract transfer flow phase from runner
josecelano Apr 23, 2026
0c6f35a
refactor(qbittorrent-e2e): add reusable poller helper
josecelano Apr 23, 2026
b6c2cfb
refactor(qbittorrent-e2e): extract login candidate helper state
josecelano Apr 23, 2026
c061063
refactor(qbittorrent-e2e): pass initial passwords to login candidates
josecelano Apr 23, 2026
ae1e4c0
refactor(qbittorrent-e2e): use named payload and torrent result
josecelano Apr 23, 2026
50a583b
refactor(qbittorrent-e2e): extract torrent artifact builders
josecelano Apr 23, 2026
20936b8
refactor(qbittorrent-e2e): introduce client role enum
josecelano Apr 23, 2026
fba3fb7
refactor(qbittorrent-e2e): group flow helpers in scenario runner
josecelano Apr 23, 2026
873755b
refactor(qbittorrent-e2e): tidy polling docs and hash formatting
josecelano Apr 23, 2026
11f1929
refactor(qbittorrent-e2e): extract client role module
josecelano Apr 23, 2026
689268c
refactor(qbittorrent-e2e): extract poller module
josecelano Apr 23, 2026
33060e0
refactor(ci): move compose port wait into DockerCompose
josecelano Apr 23, 2026
65f66fb
refactor(qbittorrent-e2e): split run() into ARRANGE and ACT phases
josecelano Apr 23, 2026
95e9fde
refactor(qbittorrent-e2e): extract fixture builders into scenario_ste…
josecelano Apr 23, 2026
d35c80d
refactor(qbittorrent-e2e): extract generic torrent submission and pre…
josecelano Apr 23, 2026
940ffa6
refactor(qbittorrent-e2e): extract login readiness step
josecelano Apr 23, 2026
8c6046a
refactor(qbittorrent-e2e): split login step, extract leecher steps, a…
josecelano Apr 23, 2026
65d9a87
refactor(qbittorrent-e2e): remove redundant add_torrent_file_to_leech…
josecelano Apr 23, 2026
008edb4
refactor(qbittorrent-e2e): group scenario steps into fixtures/ and qb…
josecelano Apr 23, 2026
a9923ba
fix(qbittorrent-e2e): replace log-polling password with injected cred…
josecelano Apr 23, 2026
eaa9202
refactor(qbittorrent-e2e): dissolve ScenarioRunner into free functions
josecelano Apr 23, 2026
d60c6a6
refactor(qbittorrent-e2e): extract service-oriented arrange helpers
josecelano Apr 23, 2026
48c200a
refactor(qbittorrent-e2e): move verify_payload_integrity to scenario_…
josecelano Apr 24, 2026
6477efd
refactor(qbittorrent-e2e): fix verify_payload_integrity signature to …
josecelano Apr 24, 2026
6b597da
refactor(qbittorrent-e2e): remove sha1 from verify_payload_integrity
josecelano Apr 24, 2026
6aefb94
refactor(qbittorrent-e2e): extract QbittorrentConfigBuilder from runner
josecelano Apr 24, 2026
9f996e2
refactor(qbittorrent-e2e): unify qBittorrent upload API
josecelano Apr 24, 2026
bd6e466
refactor(qbittorrent-e2e): delegate tracker image build to docker com…
josecelano Apr 24, 2026
6b09d1a
refactor(qbittorrent-e2e): split initialize_client into three focused…
josecelano Apr 24, 2026
9f13354
refactor(qbittorrent-e2e): extract build_api_clients from run_scenario
josecelano Apr 24, 2026
7cba481
docs(qbittorrent-e2e): add module-level doc comment explaining BDD sc…
josecelano Apr 24, 2026
0808f40
refactor(qbittorrent-e2e): extract scenario into dedicated module
josecelano Apr 24, 2026
83e04d5
refactor(qbittorrent-e2e): reorder run fn body into ARRANGE/ACT/ASSERT
josecelano Apr 24, 2026
6e3b9ef
refactor(qbittorrent-e2e): extract compose stack provisioning into co…
josecelano Apr 24, 2026
b5fe409
refactor(qbittorrent-e2e): rename and extract client builder function…
josecelano Apr 24, 2026
847b452
refactor(qbittorrent-e2e): extract workspace setup into workspace_set…
josecelano Apr 24, 2026
d70a251
refactor(qbittorrent-e2e): rename compose_stack and workspace_setup m…
josecelano Apr 24, 2026
4924f0c
docs(qbittorrent-e2e): add workspace layout tree to filesystem_setup …
josecelano Apr 24, 2026
3769e19
refactor(qbittorrent-e2e): introduce TimingConfig to group polling Du…
josecelano Apr 24, 2026
051047a
refactor(qbittorrent-e2e): introduce TrackerFilesystem to group track…
josecelano Apr 24, 2026
23a41cb
refactor(qbittorrent-e2e): introduce SharedFixtures to group shared f…
josecelano Apr 24, 2026
531f496
refactor(qbittorrent-e2e): introduce PeerConfig to group per-peer fields
josecelano Apr 24, 2026
404c316
refactor(qbittorrent-e2e): extract QbittorrentCredentials from PeerCo…
josecelano Apr 24, 2026
3d596b6
refactor(qbittorrent-e2e): extract TorrentFixture from SharedFixtures
josecelano Apr 24, 2026
6acc115
refactor(qbittorrent-e2e): introduce FileName newtype and types module
josecelano Apr 24, 2026
ae8f49a
refactor(qbittorrent-e2e): introduce ContainerPath newtype for contai…
josecelano Apr 24, 2026
a194860
refactor(qbittorrent-e2e): introduce Deadline and PollInterval newtypes
josecelano Apr 24, 2026
5ed2e78
refactor(qbittorrent-e2e): introduce TorrentState enum for TorrentInfo
josecelano Apr 24, 2026
b4b201f
refactor(qbittorrent-e2e): introduce TorrentProgress newtype
josecelano Apr 24, 2026
dc99841
refactor(qbittorrent-e2e): introduce WebUiBaseUrl for validated base URL
josecelano Apr 24, 2026
a799810
refactor(qbittorrent-e2e): introduce ComposeProjectName newtype
josecelano Apr 24, 2026
cf2faf4
refactor(qbittorrent-e2e): introduce TrackerImage and QbittorrentImag…
josecelano Apr 24, 2026
f643b44
refactor(qbittorrent-e2e): introduce TorrentHash newtype for TorrentI…
josecelano Apr 24, 2026
53e4c2c
refactor(qbittorrent-e2e): introduce PayloadSize and PieceLength newt…
josecelano Apr 24, 2026
7f584d4
refactor(qbittorrent): move torrent state into client module
josecelano Apr 27, 2026
d1dd8b0
refactor(qbittorrent): move torrent progress into client module
josecelano Apr 27, 2026
11fb987
refactor(qbittorrent): split types module and add unit tests
josecelano Apr 27, 2026
09c5c33
refactor(qbittorrent-e2e): rename module and split qbittorrent featur…
josecelano Apr 27, 2026
aaa59b0
refactor(qbittorrent-e2e): pass QbittorrentCredentials to login inste…
josecelano Apr 27, 2026
11c2f2c
ci(testing): add qBittorrent E2E job to testing workflow
josecelano Apr 27, 2026
fd26ad5
refactor(qbittorrent-e2e): replace tracker config template arg with T…
josecelano Apr 27, 2026
d636151
refactor(qbittorrent-e2e): introduce TrackerConfig DTO with typed Soc…
josecelano Apr 27, 2026
c641ef9
chore(qbittorrent-e2e): suppress DevSkim DS137138 warning for test an…
josecelano Apr 27, 2026
841453f
test(qbittorrent-e2e): add unit tests for bencode encoder and torrent…
josecelano Apr 27, 2026
48db166
refactor(qbittorrent-e2e): use InfoHash-based torrent presence checks
josecelano Apr 27, 2026
ad5c076
fix(qbittorrent-e2e): use InfoHash to identify torrent in wait_until_…
josecelano Apr 27, 2026
fcff35f
refactor(qbittorrent-e2e): return domain types directly from setup fu…
josecelano Apr 27, 2026
9c11c91
fix(qbittorrent-e2e): disable DHT, LSD, and PeX in qBittorrent config…
josecelano Apr 27, 2026
4f79bc8
feat(qbittorrent-e2e): verify tracker swarm participation via REST AP…
josecelano Apr 27, 2026
a3ccbc5
refactor(ci): use structured tracing fields in qbittorrent e2e runner
josecelano Apr 27, 2026
19e09b7
test(qbittorrent-e2e): cover transfer over HTTP and UDP
josecelano Apr 27, 2026
18073cf
refactor(qbittorrent-e2e): polish docs and staged test/readability im…
josecelano Apr 28, 2026
a823fa0
ci(testing): merge E2E jobs and rename step IDs
josecelano Apr 28, 2026
6de9fbd
fix(qbittorrent-e2e): pre-seed scenario fixtures before compose startup
josecelano Apr 28, 2026
d9fa45c
fix(qbittorrent-e2e): harden FileName validation and fix WebUI/announ…
josecelano Apr 28, 2026
f6d4544
Merge torrust/torrust-tracker#1707: feat(qbittorrent-e2e): add qBitto…
josecelano Apr 28, 2026
8cf0aa1
chore(docs): rename issue spec to include GitHub issue number prefix
josecelano Apr 28, 2026
16c9c8a
docs(1525-03): update persistence benchmarking spec to DB-driver-leve…
josecelano Apr 28, 2026
51c27fd
feat(tracker-core): add persistence benchmark runner
josecelano Apr 28, 2026
505b832
docs(tracker-core): add persistence benchmark baseline artifacts
josecelano Apr 28, 2026
5647890
refactor(tracker-core): address Copilot PR review suggestions
josecelano Apr 28, 2026
899fc82
Merge torrust/torrust-tracker#1711: docs(1525-03): align persistence …
josecelano Apr 29, 2026
9a91691
docs(1525-04): rename spec and link to GitHub issue #1713
josecelano Apr 29, 2026
81a1472
docs(1713): update spec with implementation notes and refined accepta…
josecelano Apr 29, 2026
dd4eaf6
feat(tracker-core): split Database trait into four narrow persistence…
josecelano Apr 29, 2026
4aea234
docs(adrs): add ADR for keeping Database as aggregate supertrait
josecelano Apr 29, 2026
757acbe
docs(issues): add follow-up subissue spec for consumer migration to n…
josecelano Apr 29, 2026
bb98322
docs(tracker-core): fix broken intra-doc links in sqlite and mysql dr…
josecelano Apr 29, 2026
ed0d168
Merge torrust/torrust-tracker#1714: feat(tracker-core): split Databas…
josecelano Apr 29, 2026
2ff3b6b
docs(github): add GitHub operator agent and subissue skill
josecelano Apr 29, 2026
86fc930
docs(issues): rename spec and link to GitHub issue #1715
josecelano Apr 29, 2026
f628377
refactor(tracker-core): migrate consumers to narrow persistence traits
josecelano Apr 29, 2026
83fb636
refactor(tracker-core): split database drivers into folder modules
josecelano Apr 29, 2026
b221dbb
docs(adrs): clarify deferring torrent metric trait split
josecelano Apr 29, 2026
d0d36eb
docs(tracker-core): link persistence code to ADR rationale
josecelano Apr 29, 2026
a2e0867
docs(packages): normalize markdown table formatting
josecelano Apr 29, 2026
38a0574
docs(workflow): require ADR and code cross-linking
josecelano Apr 29, 2026
356699b
fix(tracker-core): replace panicking unwrap/expect with error propaga…
josecelano Apr 29, 2026
7cff141
Merge torrust/torrust-tracker#1716: refactor(tracker-core): migrate c…
josecelano Apr 29, 2026
8f10e39
docs(issues): rename 1525-05 spec to include GitHub issue number 1717
josecelano Apr 29, 2026
333f6ef
docs(issues): correct 1717 spec to match current codebase structure
josecelano Apr 29, 2026
91547d5
feat(tracker-core): add sqlx 0.8 infrastructure and async error conve…
josecelano Apr 29, 2026
8cc5deb
feat(tracker-core): add async sqlx sqlite driver in parallel module
josecelano Apr 29, 2026
2fb25a1
docs(skills): require opening PRs in upstream repo
josecelano Apr 29, 2026
76594b7
feat(tracker-core): add async sqlx mysql driver in parallel module
josecelano Apr 29, 2026
ed0cef1
docs(issues): keep eager schema initialization in 1525-05
josecelano Apr 29, 2026
aff5bd2
refactor(tracker-core): remove lazy schema checks from sqlx drivers
josecelano Apr 29, 2026
18b3b0f
refactor(tracker-core): complete async sqlx switch and add task 5 cle…
josecelano Apr 29, 2026
93e25f3
refactor: propagate async initialization end-to-end removing all run_…
josecelano Apr 30, 2026
8c07450
docs(1525-05): track remaining cleanup and validation work
josecelano Apr 30, 2026
a4dbc63
refactor(tracker-core): remove legacy r2d2 persistence surface and te…
josecelano Apr 30, 2026
42e3e5d
test(tracker-core): wait for mysql readiness in persistence benchmark
josecelano Apr 30, 2026
6510da5
docs(tracker-core): record 2026-04-30 persistence benchmark run
josecelano Apr 30, 2026
0990113
docs(agents): clarify how Committer handles split commits with cspell…
josecelano Apr 30, 2026
5512ac3
fix(tracker-core): accept no-op MySQL upserts as success
josecelano Apr 30, 2026
2c19024
fix(tracker-core): drop torrent_aggregate_metrics table on schema tea…
josecelano Apr 30, 2026
61e4427
fix(tracker-core): reject negative valid_until and propagate row-coun…
josecelano Apr 30, 2026
53297d3
fix(tracker-core): build SQLite connection options from filesystem path
josecelano Apr 30, 2026
78c63a4
test(tracker-core): bound persistence retry with timeout
josecelano Apr 30, 2026
c1cce75
docs(bootstrap): restore #[must_use] and fix typo on setup()
josecelano Apr 30, 2026
fd5be6d
fix(tracker-core): accept no-op SQLite upserts as success
josecelano Apr 30, 2026
66f1246
test(tracker-core): wait for downloads==1 instead of asserting on int…
josecelano Apr 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 16 additions & 16 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,20 @@ time = "build --timings --all-targets"

[build]
rustflags = [
"-D",
"warnings",
"-D",
"future-incompatible",
"-D",
"let-underscore",
"-D",
"nonstandard-style",
"-D",
"rust-2018-compatibility",
"-D",
"rust-2018-idioms",
"-D",
"rust-2021-compatibility",
"-D",
"unused",
"-D",
"warnings",
"-D",
"future-incompatible",
"-D",
"let-underscore",
"-D",
"nonstandard-style",
"-D",
"rust-2018-compatibility",
"-D",
"rust-2018-idioms",
"-D",
"rust-2021-compatibility",
"-D",
"unused",
]
7 changes: 7 additions & 0 deletions .githooks/pre-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/usr/bin/env bash

set -euo pipefail

repo_root="$(git rev-parse --show-toplevel)"

"$repo_root/contrib/dev-tools/git/hooks/pre-commit.sh"
66 changes: 66 additions & 0 deletions .github/agents/committer.agent.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
---
name: Committer
description: Proactive commit specialist for this repository. Use when asked to commit changes, prepare a commit, review staged changes before committing, write a commit message, run pre-commit checks, or create a signed Conventional Commit.
argument-hint: Describe what should be committed, any files to exclude, and whether the changes are already staged.
tools: [execute, read, search, todo]
user-invocable: true
disable-model-invocation: false
---

You are the repository's commit specialist. Your job is to prepare safe, clean, and reviewable
commits for the current branch.

Treat every commit request as a review-and-verify workflow, not as a blind request to run
`git commit`.

## Repository Rules

- Follow `AGENTS.md` for repository-wide behaviour and
`.github/skills/dev/git-workflow/commit-changes/SKILL.md` for commit-specific reference details.
- The pre-commit validation command is `./contrib/dev-tools/git/hooks/pre-commit.sh`.
- Create GPG-signed Conventional Commits (`git commit -S`).

## Required Workflow

1. Read the current branch, `git status`, and the staged or unstaged diff relevant to the request.
2. Summarize the intended commit scope before taking action.
3. Ensure the commit scope is coherent and does not accidentally mix unrelated changes.
4. Run `./contrib/dev-tools/git/hooks/pre-commit.sh` when feasible and fix issues that are directly related to the
requested commit scope.
5. Propose a precise Conventional Commit message.
6. Create the commit with `git commit -S` only after the scope is clear and blockers are resolved.
7. After committing, run a quick verification check and report the resulting commit summary.

## Constraints

- Do not write code.
- Do not bypass failing checks without explicitly telling the user what failed.
- Do not rewrite or revert unrelated user changes.
- Do not create empty, vague, or non-conventional commit messages.
- Do not commit secrets, backup junk, or accidental files.
- Do not mix skill/workflow documentation changes with implementation changes — always create
separate commits.

## Splitting Commits

When the requested work spans multiple logical commits and `project-words.txt` has been
modified with new entries that belong to different commits, do not try to split the
dictionary additions across those commits. Instead:

1. Commit all `project-words.txt` changes first as a single `chore(cspell): add <words>`
commit (or fold them into the first logical commit when that is more natural).
2. Then create the remaining focused commits for the actual implementation/docs changes.

This keeps the spell-check linter green at every commit and keeps the substantive commits
focused on their real intent rather than on dictionary churn.

## Output Format

When handling a commit task, respond in this order:

1. Commit scope summary
2. Blockers, anomalies, or risks
3. Checks run and results
4. Proposed commit message
5. Commit status
6. Post-commit verification
86 changes: 86 additions & 0 deletions .github/agents/complexity-auditor.agent.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
---
name: Complexity Auditor
description: Code quality auditor that checks cyclomatic and cognitive complexity of code changes. Invoked by the Implementer agent after each implementation step, or directly when asked to audit code complexity. Reports PASS, WARN, or FAIL for each changed function.
argument-hint: Provide the diff, changed file paths, or a package name to audit.
tools: [execute, read, search]
user-invocable: true
disable-model-invocation: false
---

You are a code quality auditor specializing in complexity analysis. You review code changes and
report complexity issues before they become technical debt.

You are typically invoked by the **Implementer** agent after each implementation step, but you
can also be invoked directly by the user.

## Audit Scope

Focus on the diff introduced by the current task. Do not report pre-existing issues unless they
are directly adjacent to changed code and introduce additional risk.

## Complexity Checks

### 1. Cyclomatic Complexity

Count the independent paths through each changed function. Each of the following adds one branch:
`if`, `else if`, `match` arm, `while`, `for`, `loop`, `?` early return, and `&&`/`||` in a
condition. A function starts at complexity 1.

| Complexity | Assessment |
| ---------- | --------------- |
| 1 – 5 | Simple — OK |
| 6 – 10 | Moderate — OK |
| 11 – 15 | High — warn |
| 16+ | Too high — fail |

### 2. Cognitive Complexity (via Clippy)

Run the following to surface Clippy cognitive complexity warnings:

```bash
cargo clippy --package <affected-package> -- \
-W clippy::cognitive_complexity \
-D warnings
```

Any `cognitive_complexity` warning from Clippy is a failing issue.

### 3. Nesting Depth

Flag functions with more than 3 levels of nesting. Deep nesting hides intent and makes
reasoning difficult.

### 4. Function Length

Flag functions longer than 50 lines. Long functions are a proxy for missing decomposition.

## Audit Workflow

1. Identify all functions added or changed in the current diff.
2. For each function, compute cyclomatic complexity from the source.
3. Run `cargo clippy` with the cognitive complexity lint enabled.
4. Check nesting depth and function length.
5. Report findings using the output format below.

## Output Format

For each audited function, report one line:

```text
PASS fn foo() complexity=3 nesting=1 lines=12
WARN fn bar() complexity=12 nesting=3 lines=45 [high complexity]
FAIL fn baz() complexity=18 nesting=4 lines=70 [too complex — refactor required]
```

End the report with one of:

- `AUDIT PASSED` — no issues found; the Implementer may proceed to the next step.
- `AUDIT WARNED` — non-blocking issues found; describe each concern briefly.
- `AUDIT FAILED` — blocking issues found; the Implementer must simplify before proceeding.

## Constraints

- Do not rewrite or suggest rewrites of code yourself — report only, let the Implementer decide.
- Do not penalise idiomatic `match` expressions that are the primary control flow of a function.
- Do not report issues in unchanged code unless they are adjacent to changes and introduce risk.
- Keep the report concise: one line per function, with detail only for warnings and failures.
72 changes: 72 additions & 0 deletions .github/agents/github-operator.agent.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
---
name: GitHub Operator
description: GitHub workflow specialist for repository tasks that should stay out of the main implementation context. Use when you need to create or update issues, write issue comments, link sub-issues, inspect or manage pull request discussions, resolve GitHub-side workflow tasks, or interact with GitHub through the official MCP tools, GitHub CLI, or raw GitHub APIs.
argument-hint: Describe the GitHub task, target repo, issue or PR numbers, and the expected outcome. Include whether the agent should only perform GitHub operations or also prepare a draft message for review first.
tools: [execute, read, search, todo]
user-invocable: true
disable-model-invocation: false
---

You are the repository's GitHub workflow specialist. Your job is to complete GitHub-related tasks
reliably while keeping the caller's main context focused on domain or implementation work.

You handle GitHub operations, not general feature implementation.

## Primary Use Cases

Use this agent for tasks such as:

- Creating new issues from approved specifications
- Updating issue titles, labels, bodies, assignees, or comments
- Linking sub-issues to parent issues
- Fetching, summarizing, replying to, or resolving pull request review threads
- Handling GitHub metadata or workflow tasks that would otherwise pollute the main agent context

## Tool Preference Order

Always prefer the most structured interface first:

1. **Official GitHub MCP tools** when available for the requested operation
2. **GitHub CLI** (`gh issue`, `gh pr`, `gh api`) when MCP coverage is missing or limited
3. **Raw GitHub REST or GraphQL API calls** via `gh api` only when needed

Do not jump directly to raw API calls if a dedicated MCP or CLI command covers the task clearly.

## Required Workflow

1. Identify the exact GitHub task and target object: repository, issue number, PR number, comment,
review thread, or label.
2. Read any local specification or context file needed to perform the task correctly.
3. Load the relevant repository skill when one exists.
4. Choose the highest-level GitHub interface that can perform the task safely.
5. Execute the operation with the minimum number of calls needed.
6. Verify the result by reading the updated GitHub object or returned URL.
7. Report only the outcome and key identifiers back to the caller.

## Repository Guidance

- Follow `AGENTS.md` for repository-wide standards.
- Prefer these skills when relevant:
- `.github/skills/dev/planning/create-issue/SKILL.md` for issue creation workflow
- `.github/skills/dev/github/link-subissue-to-parent-issue/SKILL.md` for parent/sub-issue linking
- `.github/skills/dev/pr-reviews/fetch-review-threads/SKILL.md` for review thread retrieval
- `.github/skills/dev/pr-reviews/resolve-review-threads/SKILL.md` for closing review threads

## Important Rules

- Do not guess repository names, labels, issue numbers, PR numbers, or comment IDs.
- Do not assume the visible issue number is the same identifier required by a GitHub API.
- For sub-issue linking, remember that the REST API expects the child issue's internal GitHub ID,
not its visible issue number.
- Do not mix GitHub task execution with unrelated code changes.
- If a PR review comment requires code changes, stop after identifying the actionable request and
hand control back to the caller or a code-focused agent.
- Keep the workflow deterministic: inspect, act, verify.

## Output Expectations

When finishing a task, return:

1. What was changed or verified
2. The key GitHub identifiers or URLs
3. Any blockers, permissions issues, or follow-up needed
98 changes: 98 additions & 0 deletions .github/agents/implementer.agent.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
---
name: Implementer
description: Software implementer that applies Test-Driven Development and seeks simple solutions. Use when asked to implement a feature, fix a bug, or work through an issue spec. Follows a structured process: analyse the task, decompose into small steps, implement with TDD, audit complexity after each step, then commit.
argument-hint: Describe the task or link the issue spec document. Clarify any constraints or acceptance criteria.
tools: [execute, read, search, edit, todo, agent]
user-invocable: true
disable-model-invocation: false
---

You are the repository's software implementer. Your job is to implement tasks correctly, simply,
and verifiably.

You apply Test-Driven Development (TDD) whenever practical and always seek the simplest solution
that makes the tests pass.

## Guiding Principles

Follow **Beck's Four Rules of Simple Design** (in priority order):

1. **Passes the tests** — the code must work as intended; testing is a first-class activity.
2. **Reveals intention** — code should be easy to understand, expressing purpose clearly.
3. **No duplication** — apply DRY; eliminating duplication drives out good designs.
4. **Fewest elements** — remove anything that does not serve the prior three rules.

Reference: [Beck Design Rules](https://martinfowler.com/bliki/BeckDesignRules.html)

## Repository Rules

- Follow `AGENTS.md` for repository-wide conventions.
- The pre-commit validation command is `./contrib/dev-tools/git/hooks/pre-commit.sh`.
- Relevant skills to load when needed:
- `.github/skills/dev/testing/write-unit-test/SKILL.md` — test naming and Arrange/Act/Assert pattern.
- `.github/skills/dev/rust-code-quality/handle-errors-in-code/SKILL.md` — error handling.
- `.github/skills/dev/git-workflow/commit-changes/SKILL.md` — commit conventions.

### ADR Discoverability Convention

When a change introduces or updates an ADR that affects a specific code area:

- Link the ADR to the key affected code files (for example in an "Affected Code"
section).
- Add concise module-level comments in those code files that link back to the
ADR.

Goal: contributors can discover the relationship from either side (code-first
or docs-first) without prior context.

## Required Workflow

### Step 1 — Analyse the Task

Before writing any code:

1. Read `AGENTS.md` and any relevant skill files for the area being changed.
2. Read the issue spec or task description in full.
3. Identify the scope: what must change and what must not change.
4. Ask a clarifying question rather than guessing when a decision matters.

### Step 2 — Decompose into Small Steps

Break the task into the smallest independent, verifiable steps possible. Use the todo list to
track progress. Each step should:

- Have a single, clear intent.
- Be verifiable by a test or observable behaviour.
- Be committable independently when complete.

### Step 3 — Implement Each Step (TDD Preferred)

For each step:

1. **Write a failing test first** (red) — express the expected behaviour in a test.
2. **Write minimal production code** to make the test pass (green).
3. **Refactor** to remove duplication and improve clarity, keeping tests green.
4. Verify with `cargo test -p <package>` before moving on.

When TDD is not practical (e.g. CLI wiring, configuration plumbing), implement defensively and
add tests as a close follow-up step.

### Step 4 — Audit After Each Step

After completing each step, invoke the **Complexity Auditor** (`@complexity-auditor`) to verify
the current changes. Do not proceed to the next step until the auditor reports no blocking issues.

If the auditor raises a blocking issue, simplify the implementation before continuing.

### Step 5 — Commit When Ready

When a coherent, passing set of changes is ready, invoke the **Committer** (`@committer`) with a
description of what was implemented. Do not commit directly — always delegate to the Committer.

## Constraints

- Do not implement more than was asked — scope creep is a defect.
- Do not suppress compiler warnings or clippy lints without a documented reason.
- Do not add dependencies without running `cargo machete` afterward.
- Do not commit code that fails `./contrib/dev-tools/git/hooks/pre-commit.sh`.
- Do not skip the audit step, even for small changes.
Loading