-
Notifications
You must be signed in to change notification settings - Fork 1
docs: set up documentation site, release CI, and sandbox hardening #298
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 4 commits
f470c4f
5d46e76
be0048f
da9de39
f0e0805
312073a
3682b0b
7c3e8ab
e128f25
ae56715
7e8f2f2
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -51,6 +51,8 @@ jobs: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| contents: read | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| packages: write | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| id-token: write | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| outputs: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| digest: ${{ steps.push.outputs.digest }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| steps: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -103,7 +105,7 @@ jobs: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| format: table | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| exit-code: "1" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| severity: CRITICAL | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| trivyignores: .trivyignore.yaml | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| trivyignores: .github/.trivyignore.yaml | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Trivy scan (high — warn only) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| uses: aquasecurity/trivy-action@57a97c7e7821a5776cebc9bb87c984fa69cba8f1 # v0.35.0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -113,15 +115,15 @@ jobs: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| format: table | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| exit-code: "0" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| severity: HIGH | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| trivyignores: .trivyignore.yaml | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| trivyignores: .github/.trivyignore.yaml | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Grype scan | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| uses: anchore/scan-action@7037fa011853d5a11690026fb85feee79f4c946c # v7.3.2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| image: ${{ steps.scan-ref.outputs.ref }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fail-build: true | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| severity-cutoff: critical | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| config: .grype.yaml | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| config: .github/.grype.yaml | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Push only after scans pass — prevents publishing vulnerable images. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # NOTE: This is a separate build invocation from the scan step. GHA cache | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -162,6 +164,8 @@ jobs: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| contents: read | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| packages: write | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| id-token: write | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| outputs: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| digest: ${{ steps.push.outputs.digest }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| steps: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -214,7 +218,7 @@ jobs: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| format: table | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| exit-code: "1" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| severity: CRITICAL | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| trivyignores: .trivyignore.yaml | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| trivyignores: .github/.trivyignore.yaml | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Trivy scan (high — warn only) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| uses: aquasecurity/trivy-action@57a97c7e7821a5776cebc9bb87c984fa69cba8f1 # v0.35.0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -224,15 +228,15 @@ jobs: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| format: table | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| exit-code: "0" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| severity: HIGH | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| trivyignores: .trivyignore.yaml | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| trivyignores: .github/.trivyignore.yaml | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Grype scan | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| uses: anchore/scan-action@7037fa011853d5a11690026fb85feee79f4c946c # v7.3.2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| image: ${{ steps.scan-ref.outputs.ref }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fail-build: true | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| severity-cutoff: critical | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| config: .grype.yaml | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| config: .github/.grype.yaml | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Push only after scans pass — prevents publishing vulnerable images. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # NOTE: Separate build invocation; GHA cache ensures deterministic layers, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -263,3 +267,50 @@ jobs: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| exit 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fi | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| cosign sign --yes ghcr.io/aureliolo/synthorg-web@${DIGEST} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Append container image references to the GitHub Release (version tags only) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| update-release: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| name: Update Release Notes | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if: startsWith(github.ref, 'refs/tags/v') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| needs: [version, build-backend, build-web] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| runs-on: ubuntu-latest | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| permissions: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| contents: write | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| steps: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Append container images to release | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| env: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| GH_REPO: ${{ github.repository }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| TAG: ${{ github.ref_name }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| VERSION: ${{ needs.version.outputs.app_version }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| BACKEND_DIGEST: ${{ needs.build-backend.outputs.digest }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| WEB_DIGEST: ${{ needs.build-web.outputs.digest }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| run: | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| EXISTING=$(gh release view "$TAG" --json body -q .body) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| IMAGES=$(cat <<'BLOCK' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ## Container Images | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| | Image | Pull | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |-------|------| | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| | Backend | `docker pull ghcr.io/aureliolo/synthorg-backend:VERSION_PH` | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| | Web | `docker pull ghcr.io/aureliolo/synthorg-web:VERSION_PH` | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| **Digests** (for pinning): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - Backend: `ghcr.io/aureliolo/synthorg-backend@BACKEND_DIGEST_PH` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - Web: `ghcr.io/aureliolo/synthorg-web@WEB_DIGEST_PH` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| All images are signed with [cosign](https://github.com/sigstore/cosign). Verify with: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ```bash | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| cosign verify ghcr.io/aureliolo/synthorg-backend:VERSION_PH \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| --certificate-identity-regexp='github\.com/Aureliolo/synthorg' \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| --certificate-oidc-issuer='https://token.actions.githubusercontent.com' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
coderabbitai[bot] marked this conversation as resolved.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
greptile-apps[bot] marked this conversation as resolved.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| BLOCK | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Dedent (remove leading 10-space YAML indentation) and substitute placeholders | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| IMAGES=$(echo "$IMAGES" | sed 's/^ //') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| IMAGES=${IMAGES//VERSION_PH/$VERSION} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| IMAGES=${IMAGES//BACKEND_DIGEST_PH/$BACKEND_DIGEST} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| IMAGES=${IMAGES//WEB_DIGEST_PH/$WEB_DIGEST} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| gh release edit "$TAG" --notes "${EXISTING}${IMAGES}" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
greptile-apps[bot] marked this conversation as resolved.
Outdated
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| gh release edit "$TAG" --notes "${EXISTING}${IMAGES}" | |
| # Replace existing "## Container Images" section if present, otherwise append it | |
| NEW_BODY=$(awk -v new="$IMAGES" ' | |
| BEGIN { | |
| printed = 0; | |
| in_block = 0; | |
| } | |
| /^## Container Images[[:space:]]*$/ { | |
| if (!printed) { | |
| print new; | |
| printed = 1; | |
| } | |
| in_block = 1; | |
| next; | |
| } | |
| in_block && /^## / { | |
| in_block = 0; | |
| } | |
| !in_block { | |
| print; | |
| } | |
| END { | |
| if (!printed) { | |
| printf "%s", new; | |
| } | |
| } | |
| ' <<< "$EXISTING") | |
| gh release edit "$TAG" --notes "$NEW_BODY" |
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,86 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||
| name: GitHub Pages | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
| on: | ||||||||||||||||||||||||||||||||||||||||||||||||||
| push: | ||||||||||||||||||||||||||||||||||||||||||||||||||
| branches: [main] | ||||||||||||||||||||||||||||||||||||||||||||||||||
| paths: | ||||||||||||||||||||||||||||||||||||||||||||||||||
| - "docs/**" | ||||||||||||||||||||||||||||||||||||||||||||||||||
| - "site/**" | ||||||||||||||||||||||||||||||||||||||||||||||||||
| - "mkdocs.yml" | ||||||||||||||||||||||||||||||||||||||||||||||||||
| - "src/ai_company/**" | ||||||||||||||||||||||||||||||||||||||||||||||||||
| - ".github/workflows/pages.yml" | ||||||||||||||||||||||||||||||||||||||||||||||||||
| workflow_dispatch: | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+3
to
+12
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick | 🔵 Trivial Consider gating deployment on CI success. The workflow triggers on Consider adding a dependency on the CI workflow: 💡 Suggested workflow modification on:
push:
branches: [main]
paths:
- "docs/**"
- "site/**"
- "mkdocs.yml"
- "src/ai_company/**"
- ".github/workflows/pages.yml"
workflow_dispatch:
+ workflow_run:
+ workflows: ["CI"] # or your main CI workflow name
+ types: [completed]
+ branches: [main]Then add a condition to skip if CI failed: jobs:
build:
# Only run if triggered manually, by push, or if CI succeeded
if: >
github.event_name != 'workflow_run' ||
github.event.workflow_run.conclusion == 'success'📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
| permissions: {} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
| concurrency: | ||||||||||||||||||||||||||||||||||||||||||||||||||
| group: "pages" | ||||||||||||||||||||||||||||||||||||||||||||||||||
| cancel-in-progress: false | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
| jobs: | ||||||||||||||||||||||||||||||||||||||||||||||||||
| build: | ||||||||||||||||||||||||||||||||||||||||||||||||||
| name: Build Site | ||||||||||||||||||||||||||||||||||||||||||||||||||
| runs-on: ubuntu-latest | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
coderabbitai[bot] marked this conversation as resolved.
|
||||||||||||||||||||||||||||||||||||||||||||||||||
| permissions: | ||||||||||||||||||||||||||||||||||||||||||||||||||
| contents: read | ||||||||||||||||||||||||||||||||||||||||||||||||||
| steps: | ||||||||||||||||||||||||||||||||||||||||||||||||||
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 | ||||||||||||||||||||||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||||||||||||||||||||||
| persist-credentials: false | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
| # --- MkDocs (documentation at /docs) --- | ||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Set up Python | ||||||||||||||||||||||||||||||||||||||||||||||||||
| uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 | ||||||||||||||||||||||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||||||||||||||||||||||
| python-version: "3.14" | ||||||||||||||||||||||||||||||||||||||||||||||||||
| allow-prereleases: true | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Install uv | ||||||||||||||||||||||||||||||||||||||||||||||||||
| uses: astral-sh/setup-uv@6b9c6063abd6010835644d4c2e1bef4cf5cd0fca # v6.0.1 | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Install docs dependencies | ||||||||||||||||||||||||||||||||||||||||||||||||||
| run: uv sync --group docs --no-dev | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
| run: uv sync --group docs --no-dev | |
| run: uv sync --group docs --no-dev --frozen |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -37,8 +37,20 @@ uv run pytest tests/ -m integration -n auto # integration tests only | |
| uv run pytest tests/ -m e2e -n auto # e2e tests only | ||
| uv run pytest tests/ -n auto --cov=ai_company --cov-fail-under=80 # full suite + coverage | ||
| uv run pre-commit run --all-files # all pre-commit hooks | ||
| uv run mkdocs build --strict # build docs (output: _site/) | ||
|
greptile-apps[bot] marked this conversation as resolved.
Outdated
|
||
| uv run mkdocs serve # local docs preview (http://127.0.0.1:8000) | ||
| ``` | ||
|
|
||
| ## Documentation | ||
|
|
||
| - **Docs source**: `docs/` (MkDocs markdown + mkdocstrings auto-generated API reference) | ||
| - **Landing page**: `site/` (Astro, Concept C hybrid design) | ||
| - **Config**: `mkdocs.yml` at repo root | ||
| - **API reference**: auto-generated from docstrings via mkdocstrings + Griffe (AST-based, no imports) | ||
| - **CI**: `.github/workflows/pages.yml` — builds Astro landing + MkDocs docs, merges, deploys to GitHub Pages | ||
| - **Architecture decision**: `docs/decisions/ADR-003-documentation-architecture.md` | ||
| - **Dependencies**: `docs` group in `pyproject.toml` (`mkdocs-material`, `mkdocstrings[python]`, `griffe-pydantic`) | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Document how contributors install the new MkDocs toolchain. Line 52 says the docs stack lives in a separate 🛠️ Suggested doc update uv sync # install all deps (dev + test)
+uv sync --group docs # install MkDocs docs toolchain
uv run ruff check src/ tests/ # lint
uv run ruff check src/ tests/ --fix # lint + auto-fix
uv run ruff format src/ tests/ # format
uv run mypy src/ tests/ # type-check (strict)🧰 Tools🪛 LanguageTool[uncategorized] ~50-~50: The official name of this software platform is spelled with a capital “H”. (GITHUB) 🤖 Prompt for AI Agents |
||
|
|
||
| ## Docker | ||
|
|
||
| ```bash | ||
|
|
@@ -159,7 +171,8 @@ src/ai_company/ | |
| ## CI | ||
|
|
||
| - **Jobs**: lint (ruff) + type-check (mypy src/ tests/) + test (pytest + coverage) run in parallel → ci-pass (gate) | ||
| - **Docker**: `.github/workflows/docker.yml` — builds backend + web images, pushes to GHCR, signs with cosign. Scans: Trivy (CRITICAL = hard fail, HIGH = warn-only) + Grype (critical cutoff). CVE triage via `.trivyignore.yaml` and `.grype.yaml`. Images only pushed after scans pass. Triggers on push to main and version tags (`v*`). | ||
| - **Pages**: `.github/workflows/pages.yml` — builds Astro landing + MkDocs docs, merges, deploys to GitHub Pages on push to main | ||
| - **Docker**: `.github/workflows/docker.yml` — builds backend + web images, pushes to GHCR, signs with cosign. Scans: Trivy (CRITICAL = hard fail, HIGH = warn-only) + Grype (critical cutoff). CVE triage via `.github/.trivyignore.yaml` and `.github/.grype.yaml`. Images only pushed after scans pass. Triggers on push to main and version tags (`v*`). | ||
| - **Matrix**: Python 3.14 | ||
| - **Dependabot**: daily uv + github-actions + docker updates, grouped minor/patch, no auto-merge | ||
| - **Secret scanning**: gitleaks workflow on push/PR + weekly schedule | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,45 @@ | ||
| # API Layer | ||
|
|
||
| Litestar REST + WebSocket API — controllers, authentication, guards, and channels. | ||
|
|
||
| ## App | ||
|
|
||
| ::: ai_company.api.app | ||
|
|
||
| ## Config | ||
|
|
||
| ::: ai_company.api.config | ||
|
|
||
| ## DTOs | ||
|
|
||
| ::: ai_company.api.dto | ||
|
|
||
| ## Errors | ||
|
|
||
| ::: ai_company.api.errors | ||
|
|
||
| ## Guards | ||
|
|
||
| ::: ai_company.api.guards | ||
|
|
||
| ## Middleware | ||
|
|
||
| ::: ai_company.api.middleware | ||
|
|
||
| ## Pagination | ||
|
|
||
| ::: ai_company.api.pagination | ||
|
|
||
| ## WebSocket Models | ||
|
|
||
| ::: ai_company.api.ws_models | ||
|
|
||
| ## Auth | ||
|
|
||
| ::: ai_company.api.auth.config | ||
|
|
||
| ::: ai_company.api.auth.models | ||
|
|
||
| ::: ai_company.api.auth.service | ||
|
|
||
| ::: ai_company.api.auth.middleware |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
gh release view "$TAG"will fail the job if the GitHub Release for that tag doesn’t exist yet (race with release creation, or manual tag pushes). To avoid breaking tag builds, add a small retry/backoff or a guard that creates the release (or skips with a warning) whengh release viewreturns non-zero.