Commit Graph

71 Commits

Author SHA1 Message Date
sylvain
b43a1359e6 chore(workflow): complete step 13 (retrospective), v1.4.0 done
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 04:24:22 +01:00
sylvain
0e3dff86fa chore(workflow): complete step 11 (release v1.4.0), skip step 12
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 04:22:35 +01:00
sylvain
5d3040a6ec docs(v1.4.0): update README, freeze CHANGELOG, bump version
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v1.4.0
2026-03-13 04:20:36 +01:00
sylvain
84c8809f94 chore(workflow): complete step 9 (smoke test v1.4.0), start step 10+11
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 04:18:37 +01:00
sylvain
5eaccb8601 chore(workflow): complete step 8 (audit v1.4.0), start step 9
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 04:02:19 +01:00
sylvain
e02e211d86 fix(audit): correct v1.4.0 findings (6 items)
- FINDING-001: add activity column rendering in render_dashboard loop
- FINDING-002: map YAML 'token' key to 'auth' in _resolve_config
- FINDING-003/SEC-001: reject tokens containing unresolved ${...} refs
- FINDING-004: add tests for activity column rendering
- FINDING-006: strengthen test_main_columns_help assertions
- SEC-002: enrich timeout warning with collected items count

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 03:58:38 +01:00
sylvain
6f2f02409e chore(workflow): complete step 7 (dev v1.4.0), start step 8
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 03:52:02 +01:00
sylvain
60c6aaede3 feat(dashboard): add milestone view and configurable columns
fixes #16, fixes #19

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 03:50:45 +01:00
sylvain
ebf72c9a56 test(v1.4.0-p2): add failing tests for milestones and columns
RED phase: 5 tests in test_collector.py (collect_milestones),
10 tests in test_display.py (render_milestones, parse_columns),
2 tests in test_exporter.py (milestones JSON), 7 tests in
test_cli.py (--milestones, --columns).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 03:46:09 +01:00
sylvain
fdd806abcd feat(config): add YAML config and graceful pagination timeout
fixes #17, fixes #18

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 03:43:48 +01:00
sylvain
94de64e09a test(v1.4.0-p1): add failing tests for timeout and YAML config
RED phase: 4 new tests in test_client.py for graceful timeout on
pagination, 12 new tests in test_config.py for YAML config module
(import fails, module not created yet).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 03:40:27 +01:00
sylvain
670222e2fd chore(workflow): complete step 6 (plan v1.4.0), start step 7
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 03:35:50 +01:00
sylvain
a1f613f3d8 docs(v1.4.0): version plan and ADR
Plan 2 phases : bugfix timeout + config YAML, puis vue milestones + colonnes.
ADR-012 a ADR-015 couvrant degradation gracieuse, config.py, MilestoneData,
et colonnes configurables.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 03:34:55 +01:00
sylvain
98223e4995 chore(workflow): init v1.4.0 (minor)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 03:28:09 +01:00
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