Commit Graph

57 Commits

Author SHA1 Message Date
sylvain
719b36a066 chore(workflow): complete step 13 (retrospective), v1.3.0 done
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 19:58:54 +01:00
sylvain
e3796f64f5 chore(workflow): complete step 11 (release v1.3.0), skip step 12
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 19:56:08 +01:00
sylvain
4d22abbde3 docs(v1.3.0): update README, freeze CHANGELOG, bump version
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v1.3.0
2026-03-12 19:54:38 +01:00
sylvain
540927261e chore(workflow): complete step 9 (smoke test v1.3.0), start step 10
8/8 E2E tests passed, coverage 99%

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 19:52:54 +01:00
sylvain
d2686971ae chore(workflow): complete step 8 (audit v1.3.0), start step 9
audit_initial: reviewer 81, guardian 87
audit_final: 100/100 (2 rounds, 3 corrections)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 19:47:44 +01:00
sylvain
16344bbb3f fix(client): validate Retry-After header (cap, fallback, edge cases)
- Ajoute try/except autour du float() pour gérer les dates HTTP RFC 7231
- Cap à 30s pour éviter un blocage indéfini sur valeur énorme
- Plancher à _RETRY_DELAY pour Retry-After: 0 ou négatif (FINDING-R2)
- 4 nouveaux tests : date HTTP, valeur zéro, valeur énorme, health check partiel

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 19:44:39 +01:00
sylvain
15ed533d20 chore(workflow): complete step 7 v1.3.0, start step 8
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 19:19:05 +01:00
sylvain
1b33cd36f9 feat(cli,display): add --health check and repo description column
Add --health option to verify Gitea connectivity and display version.
Add Description column (truncated at 40 chars) with --no-desc to hide
it. Add get_version() method to GiteaClient.

fixes #14
fixes #15

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 19:18:03 +01:00
sylvain
2ef7ec175e test: add edge case tests for unicode, empty repos, malformed API
Add tests for unicode descriptions, repos with no commits and no
release, malformed JSON responses, HTML responses, control characters
in names, empty and very long descriptions.

fixes #13

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 19:16:06 +01:00
sylvain
b40dea32f4 fix(client,exporter): handle HTTP 429 retry and sanitize JSON
_get_with_retry now retries on HTTP 429 responses, respecting the
Retry-After header when present. exporter sanitizes control characters
(0x00-0x1F except \n \r \t) in text fields before JSON serialization.

fixes #11
fixes #12

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 19:15:25 +01:00
sylvain
9783389bfb chore(workflow): complete step 6 (plan v1.3.0), start step 7
3 phases: corrections/robustesse (#11,#12), tests edge (#13), features (#14,#15)
ADR-009 (retry 429), ADR-010 (sanitize JSON), ADR-011 (--health flag)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 19:07:57 +01:00
sylvain
7dab240dce chore(workflow): init v1.3.0 (minor track)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 18:59:59 +01:00
sylvain
be8e89114c chore(workflow): complete step 13 (retrospective), v1.2.0 done
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 04:21:33 +01:00
sylvain
da6baf3696 chore(workflow): complete step 11 (release v1.2.0), skip step 12
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 04:19:51 +01:00
sylvain
f12ec380c7 docs(v1.2.0): update README, freeze CHANGELOG, bump version
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
v1.2.0
2026-03-12 04:18:54 +01:00
sylvain
1a8115678c chore(workflow): complete step 9, merge step 10, start step 11
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 04:17:03 +01:00
sylvain
8b10ff5016 chore(workflow): complete step 8 (audit v1.2.0), start step 9
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 04:09:00 +01:00
sylvain
50768db31f fix(audit): sort milestones, sort JSON export, extract test helper
- Fix milestone section using unsorted repos list
- Apply --sort to --format json output
- Rename _sort_repos to sort_repos (now used by cli.py)
- Extract shared make_repo helper to tests/helpers.py
- Move exporter import to module level in cli.py

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 04:07:41 +01:00
sylvain
cf6f2dd3c6 chore(workflow): complete step 7 (dev v1.2.0), start step 8
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 03:59:33 +01:00
sylvain
4c66fbe98d feat(v1.2.0): retry API, dernier commit, tri, coloration, export JSON
- client.py: _get_with_retry (max 2 retries, backoff lineaire), get_latest_commit
- collector.py: champ last_commit_date dans RepoData
- display.py: colonne "Dernier commit", _sort_repos (name/issues/release/activity),
  _colorize_milestone_due (rouge/jaune/vert selon echeance)
- cli.py: options --sort/-s et --format/-f (table/json)
- exporter.py: nouveau module, repos_to_dicts + export_json
- 88 tests (35 nouveaux), ruff clean

fixes #8, fixes #7, fixes #10, fixes #9, fixes #6

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 03:58:45 +01:00
sylvain
19f300ccdb chore(workflow): complete step 6 (plan v1.2.0), start step 7
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 03:50:07 +01:00
sylvain
eb927132e3 chore(workflow): init v1.2.0 (minor)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 03:44:53 +01:00
sylvain
a913a458e9 docs(analyse): workflow execution debug analysis v1.1.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 04:54:51 +01:00
sylvain
881d3a5cb1 chore(workflow): complete step 13 (retrospective), v1.1.0 done
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 04:50:45 +01:00
sylvain
f03a2eb054 chore(workflow): complete step 13 (retrospective), v1.1.0 done
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-11 04:49:59 +01:00
sylvain
11c69b8958 chore(workflow): complete step 11 (release v1.1.0), skip step 12
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 04:47:42 +01:00
sylvain
03d09ac13b docs(v1.1.0): update README, freeze CHANGELOG, bump version
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v1.1.0
2026-03-11 04:46:38 +01:00
sylvain
79cbcd8e33 chore(workflow): complete step 9, merge step 10 into 11
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 04:45:04 +01:00
sylvain
f39158ed55 chore(workflow): complete step 8 (audit 100), start step 9
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 04:41:47 +01:00
sylvain
bb3bc761e3 test(collector): add filtering optimization and edge case tests
- test_filtered_repos_have_no_api_calls: prouve que get_latest_release et
  get_milestones ne sont pas appelés pour les repos exclus par le filtre include
- test_collect_all_include_empty_list: documente le contrat implicite où
  include=[] est équivalent à include=None (tous les repos inclus)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-11 04:40:40 +01:00
sylvain
1bc3b2fd36 chore(workflow): complete step 7, start step 8
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 04:36:56 +01:00
sylvain
844c9ccd08 chore(workflow): complete step 7, v1.1.0 dev done
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 04:36:11 +01:00
sylvain
2232260821 feat(cli): add --repo and --exclude filtering (fixes #5)
Add argparse-based CLI parsing with repeatable --repo/-r (include) and
--exclude/-x (exclude) options. Filtering is case-insensitive substring
matching, applied post-fetch in collect_all() per ADR-005.

- parse_args() separated from main() for testability
- main(argv=None) accepts argv for test injection
- collect_all() gains optional include/exclude parameters
- 14 new tests (8 filtering + 6 CLI parsing/integration)
- All 51 tests pass, backward compatible (no args = v1.0.0 behavior)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 04:35:42 +01:00
sylvain
0f8e34edf3 chore(workflow): complete step 6, start step 7
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 04:30:54 +01:00
sylvain
8e8271be9d docs(v1.1.0): version plan and ADR — repo filtering feature
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 04:30:07 +01:00
sylvain
85c3023b34 chore(workflow): init v1.1.0 (minor)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 04:18:41 +01:00
sylvain
22590d7250 docs(analyse): workflow analysis v1.0.0 — complete breakdown
13 steps, 11 agents, 19 MCP calls, chronology, metrics, recommendations.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 19:42:13 +01:00
sylvain
5c8e833d8b chore(workflow): complete step 13 (retrospective), v1.0.0 done
Metrics, analysis, MEMORY.md written. Milestone v1.0.0 closed on Gitea.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 19:31:45 +01:00
sylvain
cf88ba0ef5 chore(workflow): complete step 10, start step 11
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
v1.0.0
2026-03-10 19:29:00 +01:00
sylvain
8b4677a6f7 docs(v1.0.0): update README and create CHANGELOG
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 19:28:25 +01:00
sylvain
6ed666fb66 chore(workflow): complete step 9 (smoke test OK), start step 10
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 19:08:48 +01:00
sylvain
b15ba9eea8 fix(cli): add __main__.py for python -m gitea_dashboard
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 19:08:25 +01:00
sylvain
6fa8990cae chore(workflow): complete step 8 (audit 97/100), start step 9
Reviewer: 81→100, Guardian: 91→97, 5 findings corrected.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 19:03:09 +01:00
sylvain
01f88a0eca fix(audit): correct findings from review round 1
- client: add raise_for_status() in get_latest_release() for non-404 errors (FINDING-001)
- client: add timeout parameter (default 30s) passed to all session.get() calls (FINDING-004/SEC-002)
- cli: replace return with sys.exit(1) in all except blocks (FINDING-002)
- test_cli: remove duplicate test_exits_when_token_missing, assert GITEA_TOKEN in stderr (FINDING-006)
- test_cli: update connection error tests to expect SystemExit(1) after exit code fix
- test_cli: rework token masking test to inject token into exception message (FINDING-007)
- test_client: add test_raises_on_server_error for HTTP 500 path (FINDING-001)
- test_client: add tests for default and custom timeout values (FINDING-004)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 19:00:57 +01:00
sylvain
e05578676f chore(workflow): complete step 7, start step 8
35 tests pass, 4 modules implemented (client, collector, display, cli).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 18:55:22 +01:00
sylvain
4aa648fa8c feat(cli): add main entry point with error handling (fixes #4)
Read GITEA_TOKEN (required) and GITEA_URL (default) from env vars,
orchestrate client/collect/render pipeline, handle connection and
timeout errors gracefully. Never expose token in error messages.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 18:54:29 +01:00
sylvain
8fbdfcafd4 feat(display): add Rich dashboard rendering (fixes #3)
Render repos in a Rich table with [F]ork/[A]rchive/[M]irror indicators,
color-coded issue counts, relative release dates, and a milestones section.
Handles empty repo lists gracefully.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 18:54:25 +01:00
sylvain
b52bc72ce8 feat(collector): add RepoData dataclass and collect_all (fixes #2)
- RepoData dataclass with all repo fields
- collect_all enriches each repo with release and milestones
- Computes open_issues = open_issues_count - open_pr_counter
- 6 unit tests with mocked GiteaClient

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 18:51:17 +01:00
sylvain
4d66aea6ed feat(client): add GiteaClient with auth and pagination (fixes #1)
- GiteaClient with requests.Session and token auth header
- _get_paginated for automatic pagination (limit=50)
- get_repos, get_latest_release (None on 404), get_milestones
- 9 unit tests with mocked requests.Session
- Fix setuptools build backend in pyproject.toml

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 18:50:28 +01:00
sylvain
18ce3b953e docs(v1.0.0): plan de version, architecture, ADR-002/003
- Plan en 2 phases dev : client+collecteur puis affichage+CLI
- Architecture 4 modules avec interfaces definies
- ADR-002: 4 modules max, ADR-003: pas de parallelisation en v1

chore(workflow): complete step 6, start step 7

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 18:44:11 +01:00