Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
* text=auto

# Texto versionado usa LF para produzir diffs e artefatos consistentes entre plataformas.
*.kt text eol=lf
*.kts text eol=lf
*.gradle text eol=lf
*.xml text eol=lf
*.md text eol=lf
*.yml text eol=lf
*.yaml text eol=lf
*.toml text eol=lf
*.properties text eol=lf
*.pro text eol=lf
*.json text eol=lf
*.sh text eol=lf
gradlew text eol=lf
*.bat text eol=crlf

# Artefatos binários não devem receber normalização de conteúdo.
*.jar binary
*.jks binary
*.keystore binary
*.png binary
*.jpg binary
*.jpeg binary
*.gif binary
*.webp binary
*.ttf binary
11 changes: 11 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Revisão compartilhada do projeto.
* @YannLeao @EllenRocha1 @MClaraFerreira5

# Mudanças de supply chain, release e segurança exigem revisão explícita dos owners.
/.github/ @YannLeao @EllenRocha1 @MClaraFerreira5
/gradle/ @YannLeao @EllenRocha1 @MClaraFerreira5
/app/build.gradle.kts @YannLeao @EllenRocha1 @MClaraFerreira5
/build.gradle.kts @YannLeao @EllenRocha1 @MClaraFerreira5
/SECURITY.md @YannLeao @EllenRocha1 @MClaraFerreira5
/config/release/ @YannLeao @EllenRocha1 @MClaraFerreira5
/scripts/release/ @YannLeao @EllenRocha1 @MClaraFerreira5
59 changes: 59 additions & 0 deletions .github/ISSUE_TEMPLATE/bug.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
name: Relatar problema
description: Registre um comportamento incorreto sem incluir dados pessoais ou credenciais.
title: "fix: "
labels: [bug, triage]
body:
- type: markdown
attributes:
value: |
Não inclua tokens, endpoints privados, imagens de medicamentos ou dados reais de pacientes.
Vulnerabilidades devem ser reportadas pelo canal privado exibido no seletor de issues.
- type: textarea
id: description
attributes:
label: Descrição
description: O que ocorreu e qual era o comportamento esperado?
validations:
required: true
- type: textarea
id: reproduction
attributes:
label: Reprodução
description: Use dados sintéticos e passos mínimos.
placeholder: |
1. Abra...
2. Toque em...
3. Observe...
validations:
required: true
- type: input
id: version
attributes:
label: Versão ou commit
placeholder: v1.2.3 ou SHA
validations:
required: true
- type: dropdown
id: api
attributes:
label: Android API
options:
- API 26-28
- API 29-32
- API 33-35
- API 36+
- Não se aplica
validations:
required: true
- type: textarea
id: evidence
attributes:
label: Evidências sanitizadas
description: Logs mínimos ou screenshots sem dados sensíveis.
- type: checkboxes
id: safety
attributes:
label: Privacidade
options:
- label: Removi credenciais, tokens, imagens e dados pessoais das evidências.
required: true
5 changes: 5 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: Reportar vulnerabilidade em privado
url: https://github.com/MedTrack-Project/MedTrack-Mobile/security/advisories/new
about: Não abra vulnerabilidades, credenciais ou dados sensíveis em uma issue pública.
31 changes: 31 additions & 0 deletions .github/ISSUE_TEMPLATE/feature.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
name: Propor melhoria
description: Descreva uma necessidade de produto ou melhoria técnica.
title: "feat: "
labels: [enhancement, triage]
body:
- type: textarea
id: problem
attributes:
label: Problema
description: Qual necessidade deve ser atendida? Não inclua dados reais de pacientes.
validations:
required: true
- type: textarea
id: outcome
attributes:
label: Resultado esperado
description: Descreva o comportamento observável e critérios de sucesso.
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: Alternativas e impactos
description: Considere acessibilidade, privacidade, offline, compatibilidade e manutenção.
- type: checkboxes
id: scope
attributes:
label: Escopo
options:
- label: A proposta não contém credenciais, endpoints privados ou dados pessoais.
required: true
70 changes: 70 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
version: 2
updates:
- package-ecosystem: gradle
directory: /
target-branch: main
schedule:
interval: weekly
day: monday
time: "09:00"
timezone: America/Sao_Paulo
open-pull-requests-limit: 6
reviewers:
- YannLeao
- EllenRocha1
- MClaraFerreira5
labels:
- dependencies
- android
groups:
android-toolchain:
patterns:
- com.android.*
- org.jetbrains.kotlin.*
- com.google.devtools.ksp
androidx-compose:
patterns:
- androidx.compose.*
- androidx.activity:activity-compose
- androidx.lifecycle:lifecycle-runtime-compose
- androidx.navigation:navigation-compose
androidx-runtime:
patterns:
- androidx.*
exclude-patterns:
- androidx.compose.*
- androidx.activity:activity-compose
- androidx.lifecycle:lifecycle-runtime-compose
- androidx.navigation:navigation-compose
networking:
patterns:
- com.squareup.retrofit2:*
- com.squareup.okhttp3:*
- com.google.code.gson:gson
quality-tooling:
patterns:
- io.gitlab.arturbosch.detekt
- org.jlleitschuh.gradle.ktlint
- org.jetbrains.kotlinx.kover
- org.cyclonedx.bom

- package-ecosystem: github-actions
directory: /
target-branch: main
schedule:
interval: weekly
day: monday
time: "09:30"
timezone: America/Sao_Paulo
open-pull-requests-limit: 4
reviewers:
- YannLeao
- EllenRocha1
- MClaraFerreira5
labels:
- dependencies
- ci
groups:
github-actions:
patterns:
- "*"
7 changes: 7 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@

<!-- Inclua comandos, resultados, screenshots ou vídeos relevantes. Não inclua dados sensíveis. -->

## Alterações visuais

<!-- Inclua antes/depois quando houver UI. Caso contrário, escreva "Não se aplica". -->

## Riscos e rollback

<!-- Descreva impacto, compatibilidade, migration e como reverter, quando aplicável. -->
Expand All @@ -25,6 +29,9 @@
- [ ] A cobertura dos pacotes tocados não foi reduzida sem justificativa.
- [ ] Registrei testes manuais para câmera, notificação, migração, background ou navegação.
- [ ] Não incluí secrets, endpoints antigos, credenciais ou dados reais de pacientes.
- [ ] Revisei logs, artifacts, screenshots e payloads quanto a dados pessoais ou de saúde.
- [ ] Alterações visuais incluem evidência e verificação de acessibilidade, quando aplicável.
- [ ] Mudanças de release preservam assinatura, versionamento, checksum, SBOM e rollback.
- [ ] Atualizei documentação/ADR quando alterei uma decisão técnica.
- [ ] Documentei rollback para migration, autenticação ou release.
- [ ] Não misturei upgrade amplo de dependências com refatoração funcional.
Expand Down
128 changes: 128 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
name: CI

on:
pull_request:
branches: [main]
workflow_dispatch:

permissions:
contents: read

concurrency:
group: ci-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
dependency-review:
name: Dependency review
if: github.event_name == 'pull_request'
runs-on: ubuntu-24.04
timeout-minutes: 10
steps:
- name: Checkout
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
with:
persist-credentials: false

- name: Review dependency changes
uses: actions/dependency-review-action@2031cfc080254a8a887f58cffee85186f0e49e48 # v4.9.0
with:
fail-on-severity: high
license-check: true

quality:
name: Quality and debug APK
runs-on: ubuntu-24.04
timeout-minutes: 45
steps:
- name: Checkout
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
with:
persist-credentials: false

- name: Set up JDK 21
uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5
with:
distribution: temurin
java-version: "21"

- name: Validate wrapper and set up Gradle
uses: gradle/actions/setup-gradle@4733eaac7c1b0da527e4206b7671e0061de1ce37 # v6
with:
validate-wrappers: true
cache-read-only: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork }}

- name: Run quality gates and assemble debug APK
run: ./gradlew qualityCheck assembleDebug --no-daemon --stacktrace

- name: Upload quality reports
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: quality-reports-${{ github.run_attempt }}
if-no-files-found: warn
retention-days: 14
path: |
app/build/reports/
app/build/test-results/
app/build/outputs/unit_test_code_coverage/

- name: Upload debug APK
if: success()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: medtrack-debug-${{ github.sha }}
if-no-files-found: error
retention-days: 7
path: app/build/outputs/apk/debug/app-debug.apk

instrumented:
name: Instrumented tests (API 35)
runs-on: ubuntu-24.04
timeout-minutes: 50
steps:
- name: Checkout
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
with:
persist-credentials: false

- name: Set up JDK 21
uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5
with:
distribution: temurin
java-version: "21"

- name: Validate wrapper and set up Gradle
uses: gradle/actions/setup-gradle@4733eaac7c1b0da527e4206b7671e0061de1ce37 # v6
with:
validate-wrappers: true
cache-read-only: true

- name: Enable KVM
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' \
| sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm

- name: Run instrumented suite
uses: ReactiveCircus/android-emulator-runner@4c44018e59b437e86cdfc41da381398f93ed8808 # v2
with:
api-level: 35
target: google_apis
arch: x86_64
profile: pixel_6
disable-animations: true
emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
script: ./gradlew connectedDebugAndroidTest --no-daemon --stacktrace

- name: Upload instrumented test reports
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: instrumented-reports-api-35-${{ github.run_attempt }}
if-no-files-found: warn
retention-days: 14
path: |
app/build/outputs/androidTest-results/
app/build/reports/androidTests/
33 changes: 33 additions & 0 deletions .github/workflows/dependency-submission.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: Dependency submission

on:
push:
branches: [main]
workflow_dispatch:

permissions:
contents: write

concurrency:
group: dependency-submission-${{ github.ref }}
cancel-in-progress: true

jobs:
submit:
name: Submit Gradle dependency graph
runs-on: ubuntu-24.04
timeout-minutes: 20
steps:
- name: Checkout
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
with:
persist-credentials: false

- name: Set up JDK 21
uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5
with:
distribution: temurin
java-version: "21"

- name: Generate and submit Gradle dependency graph
uses: gradle/actions/dependency-submission@4733eaac7c1b0da527e4206b7671e0061de1ce37 # v6
Loading
Loading