Commit graph

275 commits

Author SHA1 Message Date
Pier-Jean Malandrino
d1054813ad
Merge branch 'release/0.4.0' into feature/edit-chunk-text 2026-04-10 20:26:46 +02:00
Pier-Jean Malandrino
c74a3277b8 feat(chunking): inline chunk text editing
Closes #89
2026-04-10 19:37:29 +02:00
Pier-Jean Malandrino
d742596c5d
Merge pull request #149 from scub-france/feature/dev-docker-compose
feat(infra): Docker Compose dev stack with OpenSearch
2026-04-10 19:28:36 +02:00
Pier-Jean Malandrino
8ab908d229 feat(infra): add Docker Compose dev stack with OpenSearch
Closes #148
2026-04-10 19:26:37 +02:00
Pier-Jean Malandrino
50e958de7a
Merge pull request #147 from scub-france/pjmalandrino-patch-1
Update README.md
2026-04-10 18:29:10 +02:00
Pier-Jean Malandrino
95baed784f
Update README.md 2026-04-10 18:28:44 +02:00
Pier-Jean Malandrino
e311454e86
Merge pull request #146 from scub-france/fix/mkdocs-strict-warnings
Some checks failed
Release Docker Images / Build & push — local (push) Has been cancelled
Release Docker Images / Build & push — remote (push) Has been cancelled
fix(docs): resolve mkdocs strict mode build failure
2026-04-10 15:19:55 +02:00
Pier-Jean Malandrino
f6030bb2f1 fix(docs): resolve mkdocs strict mode build failure (#145)
- Add all process docs to mkdocs.yml nav (15 missing pages)
- Replace relative links to files outside docs/ with absolute GitHub URLs
- Add docs/audit/ directory (templates + reports)
- Add validation config to allow unlisted audit reports as info-level
2026-04-10 15:11:29 +02:00
Pier-Jean Malandrino
dda2bbda12
Merge pull request #59 from scub-france/release/0.3.1
Release/0.3.1
2026-04-10 15:04:06 +02:00
Pier-Jean Malandrino
d8937ad916 fix: remove dead store and no-effect await flagged by CodeQL
- local_converter.py: remove redundant `_default_converter = None` in
  except block of `_ensure_default_converter` (variable was already None,
  re-raised immediately — dead store)
- test_analysis_service.py: replace bare `await task` with
  `await asyncio.gather(task)` to satisfy static analysis
2026-04-10 14:37:51 +02:00
Pier-Jean Malandrino
6d0c4dd192
Merge pull request #144 from scub-france/fix/decoupling-audit
fix(decoupling): eliminate cross-feature imports & typed health endpoint
2026-04-10 14:04:33 +02:00
Pier-Jean Malandrino
6e2b031bbe
Merge pull request #139 from scub-france/fix/clean-code-audit
fix(clean-code): English mode strings, SRP & getter rename
2026-04-10 13:56:51 +02:00
Pier-Jean Malandrino
3d199cb783 fix(clean-code): English mode strings, SRP extraction, rename getter
- Replace French mode strings (configurer/verifier/preparer) with English
  equivalents (configure/verify/prepare) in StudioPage.vue and tests
- Extract _build_conversion_options, _run_conversion, _finalize_analysis
  from _run_analysis_inner to respect Single Responsibility Principle
- Rename _get_default_converter to _ensure_default_converter to reflect
  its lazy-init side effect

Closes #136, closes #137, closes #138
2026-04-10 13:45:13 +02:00
Pier-Jean Malandrino
a82db25e59
Merge pull request #135 from scub-france/fix/ddd-audit
fix(domain): guard clauses & frozen value objects
2026-04-10 13:42:54 +02:00
Pier-Jean Malandrino
34d906d4b9
Merge pull request #131 from scub-france/fix/clean-architecture-audit
fix(arch): inject repositories and extract domain logic
2026-04-10 13:41:09 +02:00
Pier-Jean Malandrino
3a09c18c59 fix(decoupling): eliminate cross-feature imports and add typed health endpoint
Frontend decoupling:
- Create shared/appConfig.ts as reactive bridge (locale, maxFileSizeMb,
  maxPageCount) eliminating shared→features and feature→feature imports
- Give history feature its own Pinia store and API layer (was re-export
  of analysis store)
- Give chunking feature its own Pinia store and API layer (was importing
  from analysis)
- ChunkPanel receives analysis data via props instead of cross-feature
  store import
- document/store reads maxFileSizeMb from shared config instead of
  importing feature-flags store
- shared/i18n reads locale from shared config instead of importing
  settings store

Backend:
- Add HealthResponse Pydantic schema for /api/health endpoint

Closes #140, closes #141, closes #142, closes #143
2026-04-10 13:11:29 +02:00
Pier-Jean Malandrino
f9a1c56309 fix(domain): add guard clauses and frozen value objects
Add state-machine guard clauses to AnalysisJob transition methods
(mark_running, mark_completed, mark_failed, update_progress) to prevent
invalid status transitions. Make all domain value objects immutable with
frozen=True. Add 11 tests covering guard clause behavior.

Closes #132, closes #133
2026-04-10 12:04:44 +02:00
Pier-Jean Malandrino
9907b7f040 fix(arch): inject repositories and extract domain logic
- Add DocumentRepository and AnalysisRepository protocols in domain/ports.py (#128)
- Refactor persistence repos from module functions to SqliteDocumentRepository
  and SqliteAnalysisRepository classes
- Inject repos into AnalysisService and new DocumentService class via
  constructor, removing direct imports of persistence and infra.settings (#129)
- Move _merge_results, _classify_error, _extract_html_body to domain/services.py (#130)
- Update main.py composition root to build and wire all dependencies
- Switch api/documents.py to Depends pattern matching api/analyses.py
- Update all tests to use injected mocks instead of module-level patches

Closes #128, closes #129, closes #130
2026-04-10 11:44:33 +02:00
Pier-Jean Malandrino
19fa3e31a8 fix(ci): download only required artifacts in release summary
The Release summary job was downloading ALL artifacts (~780 MB)
including Docker images it never uses. The 648 MB docker-image-local
consistently timed out after 5 retries. Now downloads only the 4
small artifacts actually needed (~2 KB total).
2026-04-10 09:58:33 +02:00
Pier-Jean Malandrino
ce6661ddcf fix(ci): pin GitHub Actions to Node 24-compatible versions
checkout v4 → v4.3.1, upload-artifact v4 → v4.6.2,
download-artifact v4 → v4.3.0 — fixes artifact download failures
caused by Node.js 20 deprecation on GitHub runners.
2026-04-10 09:41:25 +02:00
Pier-Jean Malandrino
8190b2020e fix(ci): demote flaky upload e2e test from @critical to @ui 2026-04-10 09:05:15 +02:00
Pier-Jean Malandrino
527bf0b6cd revert: restore @critical tag for e2e UI tests in release-gate 2026-04-10 08:40:51 +02:00
Pier-Jean Malandrino
bd47a580da
Merge pull request #127 from scub-france/fix/batch-progress-and-version
fix(ci): use @ui tag instead of @critical for e2e UI tests
2026-04-09 20:38:02 +02:00
Pier-Jean Malandrino
81d4c445e1 fix(ci): use @ui tag instead of @critical for e2e UI tests 2026-04-09 17:23:59 +02:00
Pier-Jean Malandrino
93f37282a0
Merge pull request #126 from scub-france/fix/batch-progress-and-version
fix: batch progress, segmented UI, version source, about section
2026-04-09 16:37:37 +02:00
Pier-Jean Malandrino
86fb98a7c7 chore: bump version to 0.3.1 and update CHANGELOG 2026-04-09 15:52:09 +02:00
Pier-Jean Malandrino
163a6f289a feat: add i18n keys for batch notice and about section (FR + EN) 2026-04-09 15:52:03 +02:00
Pier-Jean Malandrino
abf3325923 feat: single source of truth for app version from health check
Read version from the backend /api/health endpoint instead of
hardcoding from package.json at build time. Add About section
in Settings with link to the DZone design article.
2026-04-09 15:51:59 +02:00
Pier-Jean Malandrino
f487b752dc feat: informational notice when chunking is unavailable in batch mode
Show an info banner in the Prepare panel explaining that batched
analyses do not generate the internal structure required for chunking.
2026-04-09 15:51:52 +02:00
Pier-Jean Malandrino
f6992d91bc feat: segmented batch progress bar with ring indicator
Replace the basic progress bar with a ring percentage indicator,
segmented batch bar with pulse animation, and an inline mini
progress bar in the top banner visible from any tab.
2026-04-09 15:51:46 +02:00
Pier-Jean Malandrino
26fd46967c fix: forward BATCH_PAGE_SIZE env var in docker-compose
The variable was defined in settings but never passed to the container,
making batch mode silently disabled in Docker deployments.
2026-04-09 15:51:41 +02:00
Pier-Jean Malandrino
d810fda333 fix: preserve batch progress on analysis completion
Re-read the job from DB before mark_completed so that
progress_current/progress_total written during batched conversion
are not overwritten by the stale in-memory object.

Add regression unit test and e2e assertion on final progress values.
2026-04-09 15:51:36 +02:00
Pier-Jean Malandrino
0e5e088438 fix(ci): fix Trivy action version (v0.35.0) 2026-04-09 13:36:49 +02:00
Pier-Jean Malandrino
2aa56d8ca2 fix(ci): fix audit-checks crash (set -e + grep exit code + ANSI in output) 2026-04-09 13:25:15 +02:00
Pier-Jean Malandrino
3c9d09c4e2 ci: remove duplicate push trigger from release-gate 2026-04-09 13:22:25 +02:00
Pier-Jean Malandrino
941028e705 ci: add release-gate pipeline, fix CI duplication, add OSS playbook docs
- Add release-gate.yml: 11-job pipeline (lint, tests, Docker build/smoke,
  Trivy scan, dep audit, audit checks, e2e API+UI, PR summary comment)
- Fix CI double-trigger on release branches (push + PR)
- Add CODE_OF_CONDUCT.md, SECURITY.md, PR template
- Add docs: git-workflow, architecture (ADR), release, operations, community
- Add profiles/fastapi-vue for automated audit checks
- Add docs/PROCESSES.md: index of 19 available processes
2026-04-09 13:20:43 +02:00
Pier-Jean Malandrino
6d3453dc7f
Merge pull request #125 from scub-france/feature/karate-ui-e2e-tests
feat: add Karate UI e2e tests with data-e2e selectors
2026-04-09 08:34:28 +02:00
Pier-Jean Malandrino
fdbab2f49e feat: add Karate UI e2e tests with data-e2e selectors (#124)
- Add e2e/ui/ as peer project to e2e/api/ (own pom.xml, runner, config)
- 5 critical UI journeys: upload, delete, analysis, batch-progress, rechunk
- 4 local-only tests: sidebar, i18n, error-states, pipeline-options
- 1 full happy path workflow covering all modes
- Add data-e2e attributes on all tested Vue components (decoupled from CSS)
- Add CONVENTIONS.md with 7 golden rules for writing Karate UI tests
- Update CI with dedicated e2e-ui job (Chrome headless, --no-sandbox)
- Update docs/contributing.md with UI test instructions

Closes #124
2026-04-08 17:53:52 +02:00
Pier-Jean Malandrino
9696526961
Merge pull request #123 from scub-france/fix/ci-warnings
fix: resolve CI warnings (Node.js 20 deprecation + ESLint formatting)
2026-04-08 15:27:46 +02:00
Pier-Jean Malandrino
babd710d90 fix: resolve CI warnings (Node.js 20 deprecation + ESLint formatting)
Force Node.js 24 in all GitHub Actions workflows to suppress the
upcoming Node.js 20 deprecation warnings. Disable vue/html-indent and
vue/html-closing-bracket-newline ESLint rules that conflict with
Prettier formatting.

Closes #122
2026-04-08 14:54:56 +02:00
Pier-Jean Malandrino
145d4bc180 fix: forward RATE_LIMIT_RPM and MAX_FILE_SIZE_MB to backend container
These env vars were set in the CI workflow step but never passed through
docker-compose to the container, so the backend always used defaults
(100 RPM), causing 429 errors in E2E tests.
2026-04-08 14:18:22 +02:00
Pier-Jean Malandrino
06bfe9b2ba fix: use nginx port 3000 for CI health check and e2e tests
The backend container only exposes port 8000 internally (expose, not
ports). The health check and Karate tests must go through the nginx
proxy on port 3000, the only port published to the host.
2026-04-08 14:11:19 +02:00
Pier-Jean Malandrino
80fb16c85e
Merge pull request #121 from scub-france/fix/ci-e2e-fpdf2
fix: add missing fpdf2 dependency in CI e2e job
2026-04-08 14:00:11 +02:00
Pier-Jean Malandrino
db21d73202 fix: add missing fpdf2 dependency in CI e2e job
The generate-test-data.py script imports fpdf (from fpdf2) but only
pypdfium2 was installed in the CI workflow.
2026-04-08 13:58:11 +02:00
Pier-Jean Malandrino
9fadbf62af
Merge pull request #120 from scub-france/feature/e2e-karate
feat: E2E API tests with Karate V2
2026-04-08 13:50:15 +02:00
Pier-Jean Malandrino
cfc5bb5c35 feat: add E2E API tests with Karate V2
Set up a full E2E test suite (39 scenarios) using Karate against
the real API stack. Hybrid architecture: domain-based features +
cross-domain workflows, with data-driven testing and callable helpers.

Structure:
- e2e/pom.xml: Maven + karate-core 1.5
- 3 helpers (upload, analyze+poll, cleanup)
- 3 JSON schemas (health, document, analysis)
- 12 feature files across health, documents, analyses, workflows
- Tags: @smoke (2), @regression (35), @e2e (2)
- generate-test-data.py: fpdf2-based PDF generation (no binaries)

Also adds:
- RATE_LIMIT_RPM env var to make rate limiter configurable (0=disabled)
- CI job e2e with needs: [backend, frontend]
- e2e/ in .dockerignore

Closes #119
2026-04-08 13:47:03 +02:00
Pier-Jean Malandrino
ce639d934b
Merge pull request #118 from scub-france/feature/configurable-max-file-size
feat: make document max size configurable via MAX_FILE_SIZE_MB
2026-04-08 10:29:58 +02:00
Pier-Jean Malandrino
704ba550d4 feat: make document max size configurable via MAX_FILE_SIZE_MB env var
Replace hardcoded 5 MB upload limit with a configurable setting.
Backend exposes the value via /api/health, frontend reads it
dynamically for validation and UI messages.

Closes #48
2026-04-08 10:27:38 +02:00
Pier-Jean Malandrino
d62af058ed
Merge pull request #116 from scub-france/ci/auto-close-issues
ci: auto-close issues on merge into release/* branches
2026-04-08 10:21:57 +02:00
Pier-Jean Malandrino
1f85d5b9cb ci: auto-close issues on merge into release/* branches
GitHub only auto-closes issues when PRs target the default branch.
This workflow scans commit messages for Closes/Fixes patterns on
push to release/** and closes the referenced issues via gh CLI.

Closes #115
2026-04-08 10:18:49 +02:00