Loading .dockerignoredeleted 100644 → 0 +0 −10 Changes for .dockerignore: 0 added lines, 10 removed lines. Original line number Diff line number Diff line * !pyproject.toml !uv.lock !README.md !src/portal_service/ !portal-gui/ **/__pycache__ portal-gui/node_modules portal-gui/dist portal-gui/.env*.local .env.exampledeleted 100644 → 0 +0 −21 Changes for .env.example: 0 added lines, 21 removed lines. Original line number Diff line number Diff line APP_VERSION=dev POSTGRESQL_SETTINGS__URL="postgresql+asyncpg://portal:portal@localhost:5432/portal" POSTGRESQL_SETTINGS__CREATE_SCHEMA_ON_STARTUP=true # Login through Keycloak. Set AUTH__SECURITY_MODE="none" to skip it. AUTH__SECURITY_MODE="jwt" OIDC__ISSUER="http://<keycloak-host>/realms/oop" OIDC__CLIENT_ID="oop-portal" OIDC__CLIENT_SECRET="change-me" # The GUI dev server's address, which proxies /api here, so the login cookies # belong to the address the browser is on. Keycloak's client must accept it. OIDC__REDIRECT_URI="http://localhost:3000/api/auth/callback" # OEG, which the GUI reaches through the portal at /api/oeg/* with the user's token. OEG__BASE_URL="http://localhost:8080" # The AI2 agent's chat endpoint, which the GUI reaches through the portal at /api/ai2/chat. AI2__CHAT_URL="http://localhost:9013/groq-mcp" # API products and their scopes. API_PRODUCTS__FILE="api-products.example.json" .gitignoredeleted 100644 → 0 +0 −12 Changes for .gitignore: 0 added lines, 12 removed lines. Original line number Diff line number Diff line # Python .venv/ .cache/ *.egg-info/ __pycache__/ .coverage *.py[cod] # Local environment .env .env.* !.env.example .gitlab-ci.ymldeleted 100644 → 0 +0 −107 Changes for .gitlab-ci.yml: 0 added lines, 107 removed lines. Original line number Diff line number Diff line workflow: rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS when: never - if: $CI_COMMIT_BRANCH stages: - backend - frontend variables: UV_CACHE_DIR: "$CI_PROJECT_DIR/.cache/uv" .backend: stage: backend image: python:3.12-slim needs: [] cache: paths: - .cache/uv before_script: - cd "$CI_PROJECT_DIR/${BACKEND_DIR:-.}" - pip install uv - export UV_SYSTEM_CERTS=1 - uv sync --locked --extra dev - . .venv/bin/activate rules: - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH == "develop" - changes: - src/**/* - tests/**/* - pyproject.toml - uv.lock - .gitlab-ci.yml .frontend: stage: frontend image: node:22-slim needs: [] cache: key: files: - portal-gui/package-lock.json paths: - portal-gui/.npm/ before_script: - cd "$CI_PROJECT_DIR/portal-gui" - npm ci --cache .npm --prefer-offline --no-audit --no-fund rules: - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH == "develop" - changes: - portal-gui/**/* - .gitlab-ci.yml backend:format: extends: .backend script: - ruff format --check src/ tests/ backend:lint: extends: .backend script: - ruff check src/ tests/ backend:type: extends: .backend script: - mypy src/ tests/ backend:architecture: extends: .backend script: - lint-imports backend:test: extends: .backend needs: [backend:format, backend:lint, backend:type, backend:architecture] variables: DOCKER_HOST: tcp://docker:2375 DOCKER_TLS_CERTDIR: "" services: - docker:dind script: - pytest --cov=src/portal_service --cov-branch --cov-report=term-missing coverage: '/TOTAL.+ ([0-9]{1,3}(?:\.[0-9]+)?%)/' gui:format: extends: .frontend script: - npm run format:check gui:lint: extends: .frontend script: - npm run lint gui:typecheck: extends: .frontend script: - npm run typecheck gui:build: extends: .frontend needs: [gui:format, gui:lint, gui:typecheck] script: - npm run build .pre-commit-config.yamldeleted 100644 → 0 +0 −61 Changes for .pre-commit-config.yaml: 0 added lines, 61 removed lines. Original line number Diff line number Diff line default_install_hook_types: [pre-commit, pre-push] default_stages: [pre-commit] repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v6.0.0 hooks: - id: check-yaml exclude: ^deployment/templates/ - id: check-toml - id: end-of-file-fixer stages: [pre-commit] - id: trailing-whitespace stages: [pre-commit] args: [--markdown-linebreak-ext=md] - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.15.6 hooks: - id: ruff-check args: [--fix, --cache-dir, .cache/ruff] - id: ruff-format args: [--cache-dir, .cache/ruff] - repo: https://github.com/pre-commit/mirrors-mypy rev: v1.19.1 hooks: - id: mypy files: ^(src|tests)/ args: [--strict, --ignore-missing-imports, --cache-dir, .cache/mypy] additional_dependencies: [ "fastapi[standard]>=0.115.0", "httpx>=0.28.0", "pydantic-settings>=2.9.1", "PyJWT[crypto]>=2.10.1", "pytest>=8.0.0", "pytest-asyncio>=0.25.0", "sqlalchemy>=2.0.48", "structlog>=25.0.0", ] # portal-gui: run through its own node_modules, so hooks and CI use the same versions. - repo: local hooks: - id: gui-prettier name: prettier (portal-gui) language: system entry: bash -c 'cd portal-gui && npx --no-install prettier --write --ignore-unknown "${@#portal-gui/}"' -- files: ^portal-gui/ - id: gui-eslint name: eslint (portal-gui) language: system entry: bash -c 'cd portal-gui && npx --no-install eslint --fix --no-warn-ignored "${@#portal-gui/}"' -- files: ^portal-gui/.*\.(ts|tsx)$ - id: gui-typecheck name: typecheck (portal-gui) language: system entry: npm --prefix portal-gui run typecheck files: ^portal-gui/ pass_filenames: false stages: [pre-push] Loading
.dockerignoredeleted 100644 → 0 +0 −10 Changes for .dockerignore: 0 added lines, 10 removed lines. Original line number Diff line number Diff line * !pyproject.toml !uv.lock !README.md !src/portal_service/ !portal-gui/ **/__pycache__ portal-gui/node_modules portal-gui/dist portal-gui/.env*.local
.env.exampledeleted 100644 → 0 +0 −21 Changes for .env.example: 0 added lines, 21 removed lines. Original line number Diff line number Diff line APP_VERSION=dev POSTGRESQL_SETTINGS__URL="postgresql+asyncpg://portal:portal@localhost:5432/portal" POSTGRESQL_SETTINGS__CREATE_SCHEMA_ON_STARTUP=true # Login through Keycloak. Set AUTH__SECURITY_MODE="none" to skip it. AUTH__SECURITY_MODE="jwt" OIDC__ISSUER="http://<keycloak-host>/realms/oop" OIDC__CLIENT_ID="oop-portal" OIDC__CLIENT_SECRET="change-me" # The GUI dev server's address, which proxies /api here, so the login cookies # belong to the address the browser is on. Keycloak's client must accept it. OIDC__REDIRECT_URI="http://localhost:3000/api/auth/callback" # OEG, which the GUI reaches through the portal at /api/oeg/* with the user's token. OEG__BASE_URL="http://localhost:8080" # The AI2 agent's chat endpoint, which the GUI reaches through the portal at /api/ai2/chat. AI2__CHAT_URL="http://localhost:9013/groq-mcp" # API products and their scopes. API_PRODUCTS__FILE="api-products.example.json"
.gitignoredeleted 100644 → 0 +0 −12 Changes for .gitignore: 0 added lines, 12 removed lines. Original line number Diff line number Diff line # Python .venv/ .cache/ *.egg-info/ __pycache__/ .coverage *.py[cod] # Local environment .env .env.* !.env.example
.gitlab-ci.ymldeleted 100644 → 0 +0 −107 Changes for .gitlab-ci.yml: 0 added lines, 107 removed lines. Original line number Diff line number Diff line workflow: rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS when: never - if: $CI_COMMIT_BRANCH stages: - backend - frontend variables: UV_CACHE_DIR: "$CI_PROJECT_DIR/.cache/uv" .backend: stage: backend image: python:3.12-slim needs: [] cache: paths: - .cache/uv before_script: - cd "$CI_PROJECT_DIR/${BACKEND_DIR:-.}" - pip install uv - export UV_SYSTEM_CERTS=1 - uv sync --locked --extra dev - . .venv/bin/activate rules: - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH == "develop" - changes: - src/**/* - tests/**/* - pyproject.toml - uv.lock - .gitlab-ci.yml .frontend: stage: frontend image: node:22-slim needs: [] cache: key: files: - portal-gui/package-lock.json paths: - portal-gui/.npm/ before_script: - cd "$CI_PROJECT_DIR/portal-gui" - npm ci --cache .npm --prefer-offline --no-audit --no-fund rules: - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH == "develop" - changes: - portal-gui/**/* - .gitlab-ci.yml backend:format: extends: .backend script: - ruff format --check src/ tests/ backend:lint: extends: .backend script: - ruff check src/ tests/ backend:type: extends: .backend script: - mypy src/ tests/ backend:architecture: extends: .backend script: - lint-imports backend:test: extends: .backend needs: [backend:format, backend:lint, backend:type, backend:architecture] variables: DOCKER_HOST: tcp://docker:2375 DOCKER_TLS_CERTDIR: "" services: - docker:dind script: - pytest --cov=src/portal_service --cov-branch --cov-report=term-missing coverage: '/TOTAL.+ ([0-9]{1,3}(?:\.[0-9]+)?%)/' gui:format: extends: .frontend script: - npm run format:check gui:lint: extends: .frontend script: - npm run lint gui:typecheck: extends: .frontend script: - npm run typecheck gui:build: extends: .frontend needs: [gui:format, gui:lint, gui:typecheck] script: - npm run build
.pre-commit-config.yamldeleted 100644 → 0 +0 −61 Changes for .pre-commit-config.yaml: 0 added lines, 61 removed lines. Original line number Diff line number Diff line default_install_hook_types: [pre-commit, pre-push] default_stages: [pre-commit] repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v6.0.0 hooks: - id: check-yaml exclude: ^deployment/templates/ - id: check-toml - id: end-of-file-fixer stages: [pre-commit] - id: trailing-whitespace stages: [pre-commit] args: [--markdown-linebreak-ext=md] - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.15.6 hooks: - id: ruff-check args: [--fix, --cache-dir, .cache/ruff] - id: ruff-format args: [--cache-dir, .cache/ruff] - repo: https://github.com/pre-commit/mirrors-mypy rev: v1.19.1 hooks: - id: mypy files: ^(src|tests)/ args: [--strict, --ignore-missing-imports, --cache-dir, .cache/mypy] additional_dependencies: [ "fastapi[standard]>=0.115.0", "httpx>=0.28.0", "pydantic-settings>=2.9.1", "PyJWT[crypto]>=2.10.1", "pytest>=8.0.0", "pytest-asyncio>=0.25.0", "sqlalchemy>=2.0.48", "structlog>=25.0.0", ] # portal-gui: run through its own node_modules, so hooks and CI use the same versions. - repo: local hooks: - id: gui-prettier name: prettier (portal-gui) language: system entry: bash -c 'cd portal-gui && npx --no-install prettier --write --ignore-unknown "${@#portal-gui/}"' -- files: ^portal-gui/ - id: gui-eslint name: eslint (portal-gui) language: system entry: bash -c 'cd portal-gui && npx --no-install eslint --fix --no-warn-ignored "${@#portal-gui/}"' -- files: ^portal-gui/.*\.(ts|tsx)$ - id: gui-typecheck name: typecheck (portal-gui) language: system entry: npm --prefix portal-gui run typecheck files: ^portal-gui/ pass_filenames: false stages: [pre-push]