From 7af50a06720eec65ca75db0aed35d31b71c72fe8 Mon Sep 17 00:00:00 2001 From: danielhe4rt Date: Mon, 15 Jun 2026 23:52:09 -0300 Subject: [PATCH 01/13] chore(squads): scaffold module structure --- app-modules/squads/composer.json | 27 +++++++++++++++++++ .../squads/database/factories/.gitkeep | 0 .../squads/database/migrations/.gitkeep | 0 app-modules/squads/database/seeders/.gitkeep | 0 app-modules/squads/phpstan.ignore.neon | 2 ++ app-modules/squads/phpstan.neon | 6 +++++ .../src/Providers/SquadsServiceProvider.php | 14 ++++++++++ app-modules/squads/tests/Feature/.gitkeep | 0 app-modules/squads/tests/Unit/.gitkeep | 0 9 files changed, 49 insertions(+) create mode 100644 app-modules/squads/composer.json create mode 100644 app-modules/squads/database/factories/.gitkeep create mode 100644 app-modules/squads/database/migrations/.gitkeep create mode 100644 app-modules/squads/database/seeders/.gitkeep create mode 100644 app-modules/squads/phpstan.ignore.neon create mode 100644 app-modules/squads/phpstan.neon create mode 100644 app-modules/squads/src/Providers/SquadsServiceProvider.php create mode 100644 app-modules/squads/tests/Feature/.gitkeep create mode 100644 app-modules/squads/tests/Unit/.gitkeep diff --git a/app-modules/squads/composer.json b/app-modules/squads/composer.json new file mode 100644 index 000000000..c7b79a4c9 --- /dev/null +++ b/app-modules/squads/composer.json @@ -0,0 +1,27 @@ +{ + "name": "he4rt/squads", + "description": "", + "type": "library", + "version": "1.0.0", + "license": "proprietary", + "autoload": { + "psr-4": { + "He4rt\\Squads\\": "src/", + "He4rt\\Squads\\Database\\Factories\\": "database/factories/", + "He4rt\\Squads\\Database\\Seeders\\": "database/seeders/" + } + }, + "autoload-dev": { + "psr-4": { + "He4rt\\Squads\\Tests\\": "tests/" + } + }, + "minimum-stability": "stable", + "extra": { + "laravel": { + "providers": [ + "He4rt\\Squads\\Providers\\SquadsServiceProvider" + ] + } + } +} diff --git a/app-modules/squads/database/factories/.gitkeep b/app-modules/squads/database/factories/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/app-modules/squads/database/migrations/.gitkeep b/app-modules/squads/database/migrations/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/app-modules/squads/database/seeders/.gitkeep b/app-modules/squads/database/seeders/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/app-modules/squads/phpstan.ignore.neon b/app-modules/squads/phpstan.ignore.neon new file mode 100644 index 000000000..f51e71c3f --- /dev/null +++ b/app-modules/squads/phpstan.ignore.neon @@ -0,0 +1,2 @@ +parameters: + ignoreErrors: [] diff --git a/app-modules/squads/phpstan.neon b/app-modules/squads/phpstan.neon new file mode 100644 index 000000000..b577d0f29 --- /dev/null +++ b/app-modules/squads/phpstan.neon @@ -0,0 +1,6 @@ +includes: + - phpstan.ignore.neon + +parameters: + paths: + - src/ diff --git a/app-modules/squads/src/Providers/SquadsServiceProvider.php b/app-modules/squads/src/Providers/SquadsServiceProvider.php new file mode 100644 index 000000000..c9437e8e2 --- /dev/null +++ b/app-modules/squads/src/Providers/SquadsServiceProvider.php @@ -0,0 +1,14 @@ + Date: Mon, 15 Jun 2026 23:52:17 -0300 Subject: [PATCH 02/13] chore(onboarding): scaffold module structure --- app-modules/onboarding/composer.json | 27 +++++++++++++++++++ .../onboarding/database/factories/.gitkeep | 0 .../onboarding/database/migrations/.gitkeep | 0 .../onboarding/database/seeders/.gitkeep | 0 app-modules/onboarding/phpstan.ignore.neon | 2 ++ app-modules/onboarding/phpstan.neon | 6 +++++ .../Providers/OnboardingServiceProvider.php | 14 ++++++++++ app-modules/onboarding/tests/Feature/.gitkeep | 0 app-modules/onboarding/tests/Unit/.gitkeep | 0 9 files changed, 49 insertions(+) create mode 100644 app-modules/onboarding/composer.json create mode 100644 app-modules/onboarding/database/factories/.gitkeep create mode 100644 app-modules/onboarding/database/migrations/.gitkeep create mode 100644 app-modules/onboarding/database/seeders/.gitkeep create mode 100644 app-modules/onboarding/phpstan.ignore.neon create mode 100644 app-modules/onboarding/phpstan.neon create mode 100644 app-modules/onboarding/src/Providers/OnboardingServiceProvider.php create mode 100644 app-modules/onboarding/tests/Feature/.gitkeep create mode 100644 app-modules/onboarding/tests/Unit/.gitkeep diff --git a/app-modules/onboarding/composer.json b/app-modules/onboarding/composer.json new file mode 100644 index 000000000..dc3cc0266 --- /dev/null +++ b/app-modules/onboarding/composer.json @@ -0,0 +1,27 @@ +{ + "name": "he4rt/onboarding", + "description": "", + "type": "library", + "version": "1.0.0", + "license": "proprietary", + "autoload": { + "psr-4": { + "He4rt\\Onboarding\\": "src/", + "He4rt\\Onboarding\\Database\\Factories\\": "database/factories/", + "He4rt\\Onboarding\\Database\\Seeders\\": "database/seeders/" + } + }, + "autoload-dev": { + "psr-4": { + "He4rt\\Onboarding\\Tests\\": "tests/" + } + }, + "minimum-stability": "stable", + "extra": { + "laravel": { + "providers": [ + "He4rt\\Onboarding\\Providers\\OnboardingServiceProvider" + ] + } + } +} diff --git a/app-modules/onboarding/database/factories/.gitkeep b/app-modules/onboarding/database/factories/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/app-modules/onboarding/database/migrations/.gitkeep b/app-modules/onboarding/database/migrations/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/app-modules/onboarding/database/seeders/.gitkeep b/app-modules/onboarding/database/seeders/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/app-modules/onboarding/phpstan.ignore.neon b/app-modules/onboarding/phpstan.ignore.neon new file mode 100644 index 000000000..f51e71c3f --- /dev/null +++ b/app-modules/onboarding/phpstan.ignore.neon @@ -0,0 +1,2 @@ +parameters: + ignoreErrors: [] diff --git a/app-modules/onboarding/phpstan.neon b/app-modules/onboarding/phpstan.neon new file mode 100644 index 000000000..b577d0f29 --- /dev/null +++ b/app-modules/onboarding/phpstan.neon @@ -0,0 +1,6 @@ +includes: + - phpstan.ignore.neon + +parameters: + paths: + - src/ diff --git a/app-modules/onboarding/src/Providers/OnboardingServiceProvider.php b/app-modules/onboarding/src/Providers/OnboardingServiceProvider.php new file mode 100644 index 000000000..1558f42d5 --- /dev/null +++ b/app-modules/onboarding/src/Providers/OnboardingServiceProvider.php @@ -0,0 +1,14 @@ + Date: Mon, 15 Jun 2026 23:52:21 -0300 Subject: [PATCH 03/13] chore(deps): register onboarding and squads modules --- composer.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/composer.json b/composer.json index 3169d8210..581d26b3d 100644 --- a/composer.json +++ b/composer.json @@ -29,10 +29,12 @@ "he4rt/integration-twitch": ">=1", "he4rt/integration-whatsapp": ">=1", "he4rt/moderation": "^1.0", + "he4rt/onboarding": "*", "he4rt/panel-admin": ">=1", "he4rt/panel-app": ">=1", "he4rt/portal": ">=1", "he4rt/profile": ">=1", + "he4rt/squads": "*", "internachi/modular": "^3.0.2", "laracord/framework": "dev-next#e7b64d6", "laravel/framework": "^13.15.0", From c9e31680bb09c46f9d328b6100c25f6ec341c16e Mon Sep 17 00:00:00 2001 From: danielhe4rt Date: Mon, 15 Jun 2026 23:52:37 -0300 Subject: [PATCH 04/13] docs(onboarding): add bounded-context glossary --- app-modules/onboarding/CONTEXT.md | 75 +++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 app-modules/onboarding/CONTEXT.md diff --git a/app-modules/onboarding/CONTEXT.md b/app-modules/onboarding/CONTEXT.md new file mode 100644 index 000000000..1b017dc82 --- /dev/null +++ b/app-modules/onboarding/CONTEXT.md @@ -0,0 +1,75 @@ +# Onboarding Context + +The universal, mandatory entry layer of the ecosystem. Owns the polymorphic onboarding state +machines that a person walks through, and the per-type **completion** status that other contexts +consume as an access gate. Today it powers community entry (`Welcome`) and squad entry (`Squads`), +but it is designed so new onboarding types are added without touching consumers. + +## Glossary + +| Term | Definition | Not to be confused with | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| **Onboarding** | One person's journey through one typed flow, scoped to a tenant. One row per `(tenant, user, type)`. Holds lifecycle `status`, not the per-step detail. | The UI wizard (presentation) — the Onboarding is the persisted state machine | +| **OnboardingType** | The discriminator enum (`Welcome`, `Squads`, …). Resolves the polymorphic behaviour via `handler(): OnboardingFlow` — same idiom as `IdentityProvider::getClient`. | A step — a type _has_ steps | +| **OnboardingFlow** | The per-type handler (a class behind the `OnboardingFlow` contract). Declares `steps()`, `prerequisites()`, `advance()`, `isComplete()`. All type-specific rules live here. | The model — the Flow is stateless behaviour; the Onboarding is the state | +| **OnboardingStep** | One auditable stage of a flow, one row in `onboarding_steps`. Carries its own `status` + `data` (jsonb) + `completed_at`. Enables pause/resume and history. | A prerequisite (another _type_ that must be complete first) | +| **Prerequisite** | Another `OnboardingType` that must be **completed** before this one can start (e.g. `Squads` requires `Welcome`). Declared by the flow, enforced on start. | A step (intra-type) — a prerequisite is inter-type | +| **APTO** | Domain shorthand for "completed the `Squads` onboarding". The condition that unlocks squad candidacy and squad creation. It is _not_ a global flag — it is `Squads` completion. | A generic "active member" — APTO is specifically squad-eligible | +| **Challenge** | The Git step of the `Squads` flow: open a PR (with the mandatory template) on a `challenge` repo; a human reviewer approves it on GitHub. Curation happens entirely on GitHub. | A contribution (the gamification record) — challenge repos do **not** award XP | +| **Gate** | A pre-condition checked at a transition without being a step of its own. The `Squads` flow gates `git_challenge` on having a linked GitHub `ExternalIdentity`. | A step — a gate produces no `onboarding_steps` row | + +## State machine (shape) + +`status` is a generic lifecycle: `in_progress` · `paused` · `completed` · `rejected`. The _steps_ are +type-specific and defined by the flow. The `Squads` flow: + +``` +[prereq: Welcome completed?] + │ yes + ▼ + step: form ──(submit, auto-advance, no curation)──► [gate: GitHub linked?] + │ no -> blocked + CTA "link GitHub" + │ yes + ▼ + step: git_challenge ──(PR approved on challenge repo)──► completed = APTO +``` + +Pause/resume is orthogonal: `status = paused` + `paused_at`, resumable from the current step. + +## Structure (proposed) + +``` +src/ +├── Models/ ← Onboarding · OnboardingStep +├── Enums/ ← OnboardingType · OnboardingStatus · OnboardingStepStatus +├── Contracts/ ← OnboardingFlow +├── Flows/ ← WelcomeOnboardingFlow · SquadsOnboardingFlow +├── Actions/ ← StartOnboarding · AdvanceStep · PauseOnboarding · ResumeOnboarding +├── DTOs/ ← per-step payload contracts (validated by the flow) +└── Listeners/ ← GithubPullRequestApproved -> advance the challenge step +``` + +## Module Boundaries + +### This module owns: + +- The onboarding state machines (one polymorphic model + steps) and their lifecycle. +- The per-type **completion** status other modules read as a gate (`Onboarding::isCompleted(user, tenant, type)`). +- The inter-type prerequisite chain. + +### This module does NOT own: + +- Squad lifecycle, membership, governance — belongs to `squads` (a consumer of the gate). +- Any HTTP communication with GitHub or the raw event lake — belongs to `integration-github`. This + module **listens to** `GithubPullRequestApproved` and reads `GithubRepository` (`purpose = challenge`). +- GitHub account linking — belongs to `identity` (`ExternalIdentity`, provider `github`). + +## Dependencies + +- **Identity** — `User`, tenant scoping, and the GitHub `ExternalIdentity` link (the `git_challenge` gate). +- **Integration GitHub** — consumes the `GithubPullRequestApproved` domain event and the `challenge` + repo allowlist. Never the reverse. +- Presentation (`panel-app`) drives the UI and calls the module's Actions. + +See `docs/adr/0001-onboarding-polimorfico-por-tipo.md` and +`docs/adr/0002-sinal-de-pr-aprovado-via-evento-de-dominio.md`. From e784d196389c39044027d1ccab1897900fd3c007 Mon Sep 17 00:00:00 2001 From: danielhe4rt Date: Mon, 15 Jun 2026 23:52:38 -0300 Subject: [PATCH 05/13] docs(onboarding): add ADR-0001 polymorphic onboarding by type --- .../0001-onboarding-polimorfico-por-tipo.md | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 app-modules/onboarding/docs/adr/0001-onboarding-polimorfico-por-tipo.md diff --git a/app-modules/onboarding/docs/adr/0001-onboarding-polimorfico-por-tipo.md b/app-modules/onboarding/docs/adr/0001-onboarding-polimorfico-por-tipo.md new file mode 100644 index 000000000..50621065c --- /dev/null +++ b/app-modules/onboarding/docs/adr/0001-onboarding-polimorfico-por-tipo.md @@ -0,0 +1,110 @@ +# ADR-0001: Onboarding polimórfico por tipo, com etapas auditáveis + +**Status:** Accepted +**Date:** 2026-06-15 +**Deciders:** danielhe4rt + +## Contexto + +Os Squads da He4rt rodam hoje no informal (grupos de WhatsApp, sem liderança formal). A primeira +entrega de software ataca **governança** (capitão/subcapitão, eleição, etc.) e, antes dela, uma +camada de **Entrada** que filtra quem realmente quer integrar a comunidade e contribuir. + +Essa Entrada — chamada no documento da P.O. de "pré-triagem" — é **universal e obrigatória**: +ninguém se candidata a um squad nem propõe um squad novo sem concluí-la. Duas perguntas de fronteira +apareceram: + +1. **Onde mora?** A pré-triagem é sobre pertencer à comunidade, não a um squad específico, e reusa + pesado o `identity` (vínculo GitHub via `ExternalIdentity`). Colocá-la dentro de `squads` + amarraria um conceito universal a um consumidor específico. +2. **Quantos formatos?** O time já enxerga **mais de um tipo de entrada** — `Welcome` (entrada na + comunidade) e `Squads` (entrada no programa) — e quer outros no futuro, cada um com seu próprio + contrato de payload e processamento. + +Modelar a pré-triagem como uma máquina de estados fixa (form → desafio) resolveria o `Squads` de +hoje, mas não comportaria novos tipos sem refator. + +## Decisão + +**Criar um módulo de domínio novo, `onboarding`, dono de máquinas de onboarding polimórficas por +tipo.** `squads` (e futuros consumidores) apenas leem o gate de conclusão. + +### Polimorfismo (enum → handler) + +- `OnboardingType` (enum) discrimina o tipo e resolve o comportamento via `handler(): OnboardingFlow` + — mesmo idioma que `IdentityProvider::getClient()` já usa no `identity`. +- `OnboardingFlow` (contrato) declara `steps()`, `prerequisites()`, `advance()`, `isComplete()`. + Toda regra específica do tipo vive no handler; nenhum consumidor conhece os tipos concretos. + +### Persistência (modelo + etapas) + +Modelo único discriminado por `type` + tabela de etapas (opção "C" avaliada): + +`onboardings` — uma linha por `(tenant_id, user_id, type)`: + +| Coluna | Tipo | Notas | +| -------------- | ---------------------------- | --------------------------------------------------------------------- | +| `id` | uuid (PK) | `HasUuids` | +| `tenant_id` | uuid (FK) | tenant-scoped (convenção do repo, multi-tenant-ready) | +| `user_id` | uuid (FK) | | +| `type` | string | `OnboardingType` (`welcome` \| `squads` \| …) | +| `status` | string | ciclo de vida genérico: `in_progress`/`paused`/`completed`/`rejected` | +| `completed_at` | timestamptz? | | +| `paused_at` | timestamptz? | | +| timestamps | tz | | +| UNIQUE | `(tenant_id, user_id, type)` | | + +`onboarding_steps` — uma linha por etapa do fluxo: + +| Coluna | Tipo | Notas | +| --------------- | --------------------------- | ------------------------------------------------- | +| `id` | uuid (PK) | | +| `onboarding_id` | uuid (FK) | | +| `step_key` | string | semântica do handler (`form`, `git_challenge`, …) | +| `status` | string | `pending`/`done`/… | +| `data` | jsonb | payload da etapa, validado pelo DTO do tipo | +| `completed_at` | timestamptz? | | +| timestamps | tz | | +| UNIQUE | `(onboarding_id, step_key)` | | + +A tabela de etapas (em vez de só um `payload` JSON no modelo) foi escolhida por dar **auditoria e +histórico por etapa de graça** — relevante pro desafio Git, que tem reenvio com evolução e +pausa/retoma. + +### Cadeia entre tipos + +`prerequisites()` declara dependências **inter-tipo**: `Squads` exige `Welcome` concluído para poder +iniciar. O gate que o `squads` consome é `Onboarding::isCompleted(user, tenant, Squads)` — apelidado +de **APTO** no domínio. + +## Alternativas consideradas + +- **Pré-triagem dentro de `identity`** (membership): conceitualmente limpo, mas mistura onboarding + evolutivo com o núcleo de autenticação e força `identity` a depender de `integration-github`. +- **Pré-triagem dentro de `squads`**: entrega rápida, mas amarra um conceito universal a um consumidor + e exigiria migração quando outro módulo (eventos, etc.) quiser o mesmo gate. +- **STI / modelo por tipo**: Laravel não tem STI nativo (exige pacote/boilerplate), foge do idioma + `enum→resolve` do repo e incha o schema com colunas nuláveis por tipo. Descartado. +- **Modelo único só com `payload` JSON (sem tabela de etapas)**: mais simples, mas perde auditoria + por etapa. É o passo anterior natural; promovido para a tabela de etapas por causa do desafio Git. + +## Consequências + +### Positivas + +- Somar um tipo novo = +1 case no enum + 1 classe `Flow`. Consumidores intactos. +- Auditoria etapa-a-etapa nativa (início/fim de cada etapa, tentativas de reenvio). +- Pausa/retoma natural (estado vive na etapa + `status=paused`). +- Núcleo do jogo (futuro) pode virar mais um tipo, ou consumir o gate, sem acoplar. + +### Negativas / diferidas + +- `status`/`step_key` são strings genéricas — a disciplina de transição fica no handler, não no banco. +- Dois lugares de verdade (`onboardings` + `onboarding_steps`); o `isComplete()` precisa ser a única + fonte que decide conclusão para não divergirem. +- Validação do payload é só de aplicação (DTO), não de schema. + +## Review trigger + +Revisitar quando (a) o Núcleo do jogo for refinado e a gente decidir se ele é um `OnboardingType` ou +um consumidor do gate; ou (b) surgir um tipo cujo estado de etapa não caiba no par modelo+steps. From 33fbfa42b582e7eafc265200d3892c21f20c00b9 Mon Sep 17 00:00:00 2001 From: danielhe4rt Date: Mon, 15 Jun 2026 23:52:38 -0300 Subject: [PATCH 06/13] docs(onboarding): add ADR-0002 PR-approval signal via github domain event --- ...al-de-pr-aprovado-via-evento-de-dominio.md | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 app-modules/onboarding/docs/adr/0002-sinal-de-pr-aprovado-via-evento-de-dominio.md diff --git a/app-modules/onboarding/docs/adr/0002-sinal-de-pr-aprovado-via-evento-de-dominio.md b/app-modules/onboarding/docs/adr/0002-sinal-de-pr-aprovado-via-evento-de-dominio.md new file mode 100644 index 000000000..8ab15d34e --- /dev/null +++ b/app-modules/onboarding/docs/adr/0002-sinal-de-pr-aprovado-via-evento-de-dominio.md @@ -0,0 +1,87 @@ +# ADR-0002: Sinal de "PR aprovado" via evento de domínio do integration-github + +**Status:** Accepted +**Date:** 2026-06-15 +**Deciders:** danielhe4rt +**Relates to:** [ADR-0001](0001-onboarding-polimorfico-por-tipo.md); `integration-github` + +## Contexto + +O step `git_challenge` do `SquadsOnboarding` conclui quando um **revisor humano aprova, no GitHub, o +PR do candidato** num repo de desafio. A plataforma precisa reagir a essa aprovação. + +O `integration-github` já é o **único** ponto que fala com o GitHub: `GithubWebhookController` recebe +todos os webhooks, grava no `GithubEventLog` (lake, dedup por `delivery_id`), e o `ProjectGithubEvent` +projeta eventos de repos da allowlist (`GithubRepository`) em `github_contributions`, emitindo +`GithubContributionRecorded`. A regra de fronteira do módulo é: ele **só emite eventos de domínio e +nunca importa de outros módulos**. + +Duas decisões de acoplamento precisavam ser tomadas: + +1. Como o sinal de aprovação chega ao `onboarding` sem duplicar a infra de webhook/HMAC/dedup nem + acoplar os módulos. +2. Como distinguir um "repo de desafio" de um repo de contribuições — sem que o `git_challenge` vire + XP de gamification. + +## Decisão + +### Sinal por evento de domínio + +O `integration-github` passa a emitir um **segundo evento de domínio**, +`GithubPullRequestApproved` (`author_login`, `repo`, `pr_number`, `approved_at`), ao observar +`pull_request_review` com `state = approved`. O `onboarding` registra um **listener** que resolve o +`author_login` para um `User` (via `ExternalIdentity` github) e avança o step `git_challenge`. + +O transporte continua centralizado num lugar só; HMAC e dedup são reusados; nenhum módulo passa a +falar com o GitHub além do `integration-github`. É a mesma costura do `GithubContributionRecorded`. + +### Repo de desafio via `purpose` na allowlist + +`GithubRepository` ganha um campo **`purpose`** (`contributions` | `challenge`): + +- Repos `challenge` **não** geram `GithubContributionRecorded` (fazer o desafio não vira XP). +- O `onboarding` resolve o repo de desafio lendo `GithubRepository::query()->where('purpose', 'challenge')` + (tenant-scoped), e ignora aprovações de repos que não sejam de desafio. + +O `purpose` é uma **categoria de projeção** legítima do próprio `integration-github` (ele já decide o +que projetar). O `integration-github` nunca precisa conhecer a palavra "onboarding". + +### Vínculo do GitHub é gate, não há reconciliação + +O vínculo da conta GitHub (`ExternalIdentity` provider `github`) é **pré-requisito** (gate) para o +step `git_challenge`. Logo o `author_login` do webhook **sempre** casa um `User`, e o cenário +"aprovação de conta não vinculada → retém e reconcilia" **deixa de existir** — sem buffer, sem tabela +de pendências, sem reconciliação. Isso diverge do BDD original da P.O., que previa reconciliação. + +## Alternativas consideradas + +- **Webhook próprio do `onboarding`** só pro repo de desafio: desacoplaria 100%, mas duplicaria + HMAC/dedup e criaria um segundo ponto que fala com o GitHub. Descartado. +- **`onboarding` relendo o lake (`GithubEventLog`)**: inverteria a dependência (`onboarding` → + consulta interna do `integration-github`) e furaria o encapsulamento do lake. Descartado. +- **Config de repo de desafio dentro do `onboarding`** (em vez do `purpose` na allowlist): manteria o + `integration-github` sem nenhuma categoria nova, mas duplicaria o cadastro de repos e perderia o + benefício de excluir o repo de desafio da projeção de contribuições num lugar só. Trade-off aceito + a favor do `purpose`. + +## Consequências + +### Positivas + +- Um único ponto de integração com o GitHub; HMAC/dedup reusados. +- Repos de desafio ficam fora da gamification por construção (`purpose`). +- Sem reconciliação: a máquina de estados fica drasticamente mais simples. + +### Negativas / diferidas + +- `integration-github` ganha um rótulo (`purpose=challenge`) que existe por causa de um consumidor — + acoplamento mínimo e consciente, mitigado por ser categoria de projeção, não lógica de onboarding. +- O repo de desafio precisa ter o webhook do GitHub instalado apontando pro endpoint do + `integration-github` (setup de infra, não de código). +- Diverge do BDD original (reconciliação removida) — o documento da P.O. precisa ser atualizado. + +## Review trigger + +Revisitar se algum dia um onboarding precisar reagir a aprovações de conta ainda não vinculada +(reintroduziria o buffer/reconciliação), ou se mais de um repo de desafio por tenant exigir +roteamento por tipo de desafio. From e696486a03ecdcdcb091fb63ca5179c0b08b5e1d Mon Sep 17 00:00:00 2001 From: danielhe4rt Date: Mon, 15 Jun 2026 23:52:39 -0300 Subject: [PATCH 07/13] docs(squads): add bounded-context glossary --- app-modules/squads/CONTEXT.md | 80 +++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 app-modules/squads/CONTEXT.md diff --git a/app-modules/squads/CONTEXT.md b/app-modules/squads/CONTEXT.md new file mode 100644 index 000000000..d7d7ae514 --- /dev/null +++ b/app-modules/squads/CONTEXT.md @@ -0,0 +1,80 @@ +# Squads Context + +The system of record for squads: their lifecycle, membership and in-squad roles, plus an append-only +audit trail of membership events. Governance decisions (elections, removals, reallocation) happen +**off-system** (Discord/WhatsApp/conversation); this module records their _outcome_ and owns the +resulting state — it is a ledger, not a workflow engine. Entry into a squad (candidacy) is the one +flow it actively conducts. + +## Glossary + +| Term | Definition | Not to be confused with | +| ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- | +| **Squad** | A tenant-scoped crew with a clear objective. Lifecycle `status`: `draft` → `active` → `inactive` → `archived`. Created by a super-admin (the bottom-up proposal/validation happens off-system). | A WhatsApp group (the informal precursor) — the Squad is the formalized record | +| **SquadMember** | A row in the `squad_members` pivot: one person's standing in one squad. Carries `role`, `joined_at`, `left_at`. | A community member generally — this is squad-scoped standing | +| **Role (in squad)** | The `squad_members.role` enum: `Captain` · `SubCaptain` · `Member` · `ExMember`. Confers power on the platform: Captain/Sub manage their own squad. | A governance role (super-admin) — that is platform-wide, config-driven | +| **Captain / SubCaptain** | The squad's leadership. They conduct their own squad on the platform: approve/reject candidacy, promote a sub, mark an `ExMember`. | The Head dos Squads (an off-system human role; in software it is the super-admin) | +| **ExMember** | A person who left (or was removed from) a squad. A role value, not a deletion. Does **not** count toward exclusivity. `left_at` dates the exit. | A `Member` on leave — there is no "paused membership" state | +| **Application (candidatura)** | An APTO person's request to join a squad (`squad_applications`, `pending`/`approved`/`rejected`). The captain decides; approval creates the membership in a transaction. | An onboarding (community/program entry) — that is upstream, in `onboarding` | +| **Exclusivity** | A person may hold at most one _active_ membership (role in `Captain`/`SubCaptain`/`Member`) across all squads. Enforced on join. | A hard unique DB constraint — `ExMember` rows are allowed to pile up | +| **Vacancy** | A squad with no active `Captain`. It is the **absence** of a Captain in the pivot, not a status of its own. | The `inactive` squad status (the whole squad is dormant) | +| **Super-admin** | Platform governance authority, sourced from `config('he4rt.admins')` via `User::isAdmin()`. Creates squads, sets captains, overrides any squad action. Stands in for the "Head/Gestão" roles. | A Captain — a Captain's power is scoped to their own squad | +| **APTO** | The gate this module consumes from `onboarding`: the person completed the `Squads` onboarding. Required to apply or to be in a squad. | An `active` Squad — APTO is about a person, not a squad | + +## What this module records vs. conducts + +| Flow (P.O. doc) | In this module (model B — record-keeping) | +| --------------------------- | -------------------------------------------------------------------------------------------------------------- | +| Candidacy to existing squad | **Conducted**: application → captain decides → membership created (exclusivity checked). | +| Squad creation (bottom-up) | **Recorded**: super-admin registers the squad (draft→active) with its captain. Proposal/validation off-system. | +| Captain election | **Recorded**: runs off-system; the outcome is registered (set captain/sub via promote). | +| Captain exit | **Recorded**: mark `ExMember` / promote the sub (sub assumes) or leave the seat vacant. | +| Captain removal | **Recorded**: runs off-system (moderator→management→Head); outcome registered (mark ExMember). | +| Leadership reallocation | **Recorded**: super-admin moves a leader to another squad. | + +Human rules that stay **out of software** this delivery: ≥1-delivery eligibility, tie-break by Head, +single-candidate handling, proportional vote minimum, and the "no direct re-election" rule. They are +applied by humans off-system; only results are recorded. (The open "definition of a delivery" is thus +not blocking.) + +## State & audit + +- `squads` — squad state (`status`, `objective`, `slug`, tenant-scoped). +- `squad_members` — current standing per (squad, user): `role`, `joined_at`, `left_at`. +- `squad_membership_events` — append-only trail: `action` (`join`/`leave`/`promote`/`demote`/…), + `actor_id`, `reason`, `occurred_at`, `metadata`. Answers "who held what, when, and why". +- `squad_applications` — candidacy requests and their decision. + +## Structure (proposed) + +``` +src/ +├── Models/ ← Squad · SquadMember · SquadMembershipEvent · SquadApplication +├── Enums/ ← SquadStatus · SquadRole · MembershipAction · ApplicationStatus +├── Actions/ ← CreateSquad · ApplyToSquad · DecideApplication · PromoteToSubCaptain · +│ AssignCaptain · MarkExMember · ReallocateLeader · ArchiveSquad +├── Policies/ ← SquadPolicy (captain/sub of the squad, or super-admin) +└── DTOs/ +``` + +## Module Boundaries + +### This module owns: + +- Squad lifecycle, membership, in-squad roles, and the membership audit trail. +- The candidacy flow and exclusivity enforcement. + +### This module does NOT own: + +- The onboarding/APTO gate — it **reads** `Onboarding::isCompleted(user, tenant, Squads)` from `onboarding`. +- UI — Filament lives in `panel-app` (captain/member) and `panel-admin` (super-admin). +- Conducting elections/removals — those happen off-system; only outcomes are recorded. +- The squad game core (all-or-nothing project, scoring, season, redemption) — deferred, not here yet. + +## Dependencies + +- **Onboarding** — reads the `Squads`-completion gate (APTO). Never the reverse. +- **Identity** — users, tenants, and super-admin authority (`config('he4rt.admins')`). +- Presentation panels depend on this module, never the reverse. + +See `docs/adr/0001-governanca-como-registro.md`. From 0cb4fc3eccb28e9ddae44c8e9dad78e9b5335bbb Mon Sep 17 00:00:00 2001 From: danielhe4rt Date: Mon, 15 Jun 2026 23:52:39 -0300 Subject: [PATCH 08/13] docs(squads): add ADR-0001 governance as record-keeping --- .../docs/adr/0001-governanca-como-registro.md | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 app-modules/squads/docs/adr/0001-governanca-como-registro.md diff --git a/app-modules/squads/docs/adr/0001-governanca-como-registro.md b/app-modules/squads/docs/adr/0001-governanca-como-registro.md new file mode 100644 index 000000000..70d1ba04b --- /dev/null +++ b/app-modules/squads/docs/adr/0001-governanca-como-registro.md @@ -0,0 +1,85 @@ +# ADR-0001: Governança de squads como registro (record-keeping), não workflow engine + +**Status:** Accepted +**Date:** 2026-06-15 +**Deciders:** danielhe4rt +**Relates to:** `onboarding/docs/adr/0001` (o gate APTO que este módulo consome) + +## Contexto + +Os Squads da He4rt rodam hoje no informal — grupos de WhatsApp, **sem liderança formal** +(capitão/subcapitão). A dor principal é **governança**: dar estrutura de liderança e ter uma fonte da +verdade de quem é o quê. + +O documento da P.O. (camada Governança) ainda está **em validação** e descreve sete fluxos, vários +deles fortemente humanos: eleição com votação aberta e apuração, remoção que passa por +moderador→gestão→Head, realocação por análise de encaixe, regras de elegibilidade ("≥1 entrega", +ainda sem definição fechada), desempate pelo Head e proibição de reeleição direta. + +A pergunta de escopo foi: **quanto desses processos o software deve conduzir?** Avaliamos três níveis: + +- **Workflow engine completo** — cada fluxo vira processo orquestrado (etapas, fila por papel, SLA, + notificações, trilha por etapa). +- **Registro + automação + eleição na plataforma** — o sistema conduz o determinístico e a votação; + decisões discricionárias são ações registradas. +- **Só registro (record-keeping)** — o sistema é o livro-razão dos estados; os processos acontecem + fora e o resultado é lançado. + +## Decisão + +**Adotar record-keeping (o nível mais enxuto): o `squads` é a fonte da verdade do _estado_, não um +motor de processo.** Eleição, remoção, saída e realocação acontecem off-system; o módulo registra o +**resultado** e aplica a mudança de estado, com trilha de auditoria. + +A única exceção é a **candidatura a um squad existente** (camada Entrada), que é simples o bastante +para ser conduzida no sistema: pessoa APTO pede → capitão decide → membership criada. + +### Autoridade + +- **Super-admins** (de `config('he4rt.admins')`, via `User::isAdmin()`) fazem a gestão: criam squads, + definem capitão, e fazem override de qualquer ação. Eles encarnam, no software, os papéis humanos + de "Head dos Squads" e "Gestão". Não introduzimos spatie/permission nem Discord-roles para isto. +- **Capitão / Subcapitão** têm poder **sobre o próprio squad**: aprovar/recusar candidatura, promover + sub, marcar `ExMember`. O `role` do pivot, portanto, concede permissão (via `SquadPolicy`). + +### Modelo + +- `squads` (`status`: `draft`/`active`/`inactive`/`archived`, `objective`, `slug`, tenant-scoped). +- `squad_members` (pivot): `role` (`Captain`/`SubCaptain`/`Member`/`ExMember`), `joined_at`, `left_at`. + Saída/remoção viram `ExMember` (não deleção); vaga de capitania = ausência de `Captain` ativo. +- `squad_membership_events` (append-only): `action` (`join`/`leave`/`promote`/`demote`/…), `actor_id`, + `reason`, `occurred_at`, `metadata` — o "como se chegou aqui". +- `squad_applications`: candidatura e sua decisão. +- **Exclusividade**: no máximo uma membership ativa por pessoa (role em Captain/SubCaptain/Member); + `ExMember` não conta. Enforçada na Action de entrada. + +### Fora do software nesta entrega + +Cédula/apuração, candidatura-a-capitão, elegibilidade automática (≥1 entrega), desempate pelo Head, +mínimo de votos proporcional e "sem reeleição direta" são **regras humanas aplicadas off-system** — +o sistema apenas registra o desfecho. Isso destrava a entrega sem depender de regras ainda em validação. + +## Consequências + +### Positivas + +- Entrega enxuta, focada na dor real (estrutura de liderança + fonte da verdade). +- Não acopla o software a regras que a P.O. ainda está validando — mudou a regra, muda o processo + humano, o registro continua válido. +- Trilha de auditoria responde "quem foi capitão quando e por quê". +- Caminho de evolução claro: promover fluxo a fluxo para condução/automação (ou workflow) se o volume + justificar, sem refazer o modelo de estado. + +### Negativas / diferidas + +- A eleição (apontada como "caos") **continua fora do sistema**; ganhamos o registro do resultado, não + a condução. Risco de o estado lançado divergir do que aconteceu de fato (mitigado pela trilha + por + o lançamento ser feito por super-admin/capitão). +- Regras como "sem reeleição direta" não são impedidas pelo sistema — dependem de disciplina humana. +- Vários cenários BDD do documento da P.O. não viram testes de software nesta fase. + +## Review trigger + +Revisitar quando (a) o volume de eleições/casos justificar conduzir/automatizar na plataforma; (b) a +P.O. fechar as regras de elegibilidade/eleição; ou (c) o Núcleo do jogo exigir que o estado de squad +seja derivado de processos, não lançado. From 91140697958a708be720f9367565e5e7c2d2619d Mon Sep 17 00:00:00 2001 From: danielhe4rt Date: Mon, 15 Jun 2026 23:52:40 -0300 Subject: [PATCH 09/13] docs(squads): add ADR-0002 squads data model --- .../squads/docs/adr/0002-modelo-de-dados.md | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 app-modules/squads/docs/adr/0002-modelo-de-dados.md diff --git a/app-modules/squads/docs/adr/0002-modelo-de-dados.md b/app-modules/squads/docs/adr/0002-modelo-de-dados.md new file mode 100644 index 000000000..a023de779 --- /dev/null +++ b/app-modules/squads/docs/adr/0002-modelo-de-dados.md @@ -0,0 +1,88 @@ +# ADR-0002: Modelo de dados de squads (estado + trilha + exclusividade) + +**Status:** Accepted +**Date:** 2026-06-15 +**Deciders:** danielhe4rt +**Relates to:** [ADR-0001](0001-governanca-como-registro.md) + +## Contexto + +Sob o modelo de governança como registro (ADR-0001), o `squads` precisa de um esquema que seja a +fonte da verdade do **estado** (quem é o quê em cada squad) e que carregue uma **trilha de auditoria** +de tudo que muda em membership/papéis (join/leave/promote/demote), tudo tenant-scoped. Algumas +invariantes de negócio (capitão único, "1 squad ativo") merecem ser garantidas no banco, não só na +aplicação. + +## Decisão + +Quatro tabelas, todas com `id` UUIDv7 (`HasUuids`) e `tenant_id`. + +### `squads` + +`name`, `slug`, `objective` (text, nullable — `draft` pode não ter), `status` (`SquadStatus` +`draft`/`active`/`inactive`/`archived`, default `draft`), timestamps. + +- `UNIQUE (tenant_id, slug)`, `INDEX (tenant_id, status)`. +- **Sem `captain_id` denormalizado** — o capitão é derivado do pivot (`role = captain`). Fonte única. +- **Sem `SoftDeletes`** — `archived` é o encerramento lógico. + +### `squad_members` (pivot com id próprio) + +`squad_id`, `user_id`, `role` (`SquadRole` `captain`/`sub_captain`/`member`/`ex_member`), +`joined_at`, `left_at` (nullable, datado ao virar `ExMember`), timestamps. + +- `UNIQUE (squad_id, user_id)` — uma linha por pessoa por squad. +- **Capitão único:** `UNIQUE (squad_id) WHERE role = 'captain'` (partial index). +- **Exclusividade (1 squad ativo, por tenant):** `UNIQUE (tenant_id, user_id) WHERE role IN +('captain','sub_captain','member')`. `ex_member` não conta. Defense-in-depth com a validação na Action. + +### `squad_membership_events` (append-only) + +`squad_id`, `user_id` (sujeito), `actor_id` (nullable; null = sistema), `action` +(`MembershipAction`), `from_role`/`to_role` (`SquadRole`, nullable), `reason` (text, nullable), +`metadata` (jsonb, nullable), `occurred_at`, timestamps. + +- `INDEX (squad_id, occurred_at)`, `INDEX (user_id, occurred_at)`. +- Nunca atualizado/deletado — é a trilha. + +### `squad_applications` + +`squad_id`, `user_id` (candidato), `status` (`ApplicationStatus` +`pending`/`approved`/`rejected`/`withdrawn`, default `pending`), `message` (text, nullable), +`decided_by` (nullable), `decided_at` (nullable), timestamps. + +- `INDEX (squad_id, status)`. +- `UNIQUE (squad_id, user_id) WHERE status = 'pending'` — ≤1 candidatura pendente por pessoa/squad. + +### Enums + +`SquadStatus`, `SquadRole`, `ApplicationStatus`, `MembershipAction` — backed string, cast nos models. +PHPDoc `@property` em todos os models conforme `.ai/04-model-phpdoc-sync`. + +## Alternativas consideradas + +- **`captain_id` denormalizado em `squads`**: query de listagem mais barata, mas vira 2ª fonte da + verdade a sincronizar a cada troca. Descartado a favor de derivar do pivot. +- **Exclusividade só na Action** (sem partial unique): mais simples, mas sem rede contra corrida/bug. + Descartado a favor de defense-in-depth. +- **Estado-only (sem tabela de eventos)**: descartado — a trilha de join/leave/promote/demote é + requisito explícito. + +## Consequências + +### Positivas + +- Invariantes críticas (capitão único, 1 squad ativo) garantidas pelo Postgres. +- Capitão sem risco de divergir (fonte única no pivot). +- Auditoria completa de membership/papéis. + +### Negativas / diferidas + +- Listar squads com o capitão custa um join (sem denormalização). +- Partial unique indexes são Postgres-específicos (o repo já é Postgres — aceitável). +- A trilha cresce indefinidamente (append-only); particionamento/arquivamento é problema futuro. + +## Review trigger + +Revisitar se a listagem de squads+capitão virar gargalo (considerar projeção/denormalização), ou se a +exclusividade deixar de ser "1 por tenant" (ex.: 1 global, ou N squads por pessoa no futuro). From dd2a5d59fc42f9d2883ac433d060c96fd3653ed4 Mon Sep 17 00:00:00 2001 From: danielhe4rt Date: Mon, 15 Jun 2026 23:52:40 -0300 Subject: [PATCH 10/13] docs(architecture): map onboarding and squads contexts --- CONTEXT-MAP.md | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/CONTEXT-MAP.md b/CONTEXT-MAP.md index 72998b24f..687fea251 100644 --- a/CONTEXT-MAP.md +++ b/CONTEXT-MAP.md @@ -9,15 +9,17 @@ This is a modular monorepo (`internachi/modular`). Each bounded context lives un ## Contexts -| Context | Path | Description | -| ------------------- | ---------------------------------- | -------------------------------------------------------------------------------------------------------------- | -| Moderation | `app-modules/moderation/` | Content moderation pipeline — classification, routing, enforcement, appeals | -| Bot Discord | `app-modules/bot-discord/` | Discord bot runtime (Laracord websocket, slash commands, event handlers) | -| Integration Discord | `app-modules/integration-discord/` | Discord platform transport (REST API via Saloon), OAuth, ETL | -| Identity | `app-modules/identity/` | Users, tenants, external identities, authentication | -| Panel Admin | `app-modules/panel-admin/` | Filament admin panel — dashboards, resources, moderation UI, marketing | -| Integration Twitch | `app-modules/integration-twitch/` | Twitch platform transport (Helix API via Saloon), OAuth, EventSub webhooks | -| Integration GitHub | `app-modules/integration-github/` | GitHub transport (REST via Saloon), OAuth, community contribution ingestion (backfill + webhooks) + event lake | +| Context | Path | Description | +| ------------------- | ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | +| Moderation | `app-modules/moderation/` | Content moderation pipeline — classification, routing, enforcement, appeals | +| Bot Discord | `app-modules/bot-discord/` | Discord bot runtime (Laracord websocket, slash commands, event handlers) | +| Integration Discord | `app-modules/integration-discord/` | Discord platform transport (REST API via Saloon), OAuth, ETL | +| Identity | `app-modules/identity/` | Users, tenants, external identities, authentication | +| Panel Admin | `app-modules/panel-admin/` | Filament admin panel — dashboards, resources, moderation UI, marketing | +| Integration Twitch | `app-modules/integration-twitch/` | Twitch platform transport (Helix API via Saloon), OAuth, EventSub webhooks | +| Integration GitHub | `app-modules/integration-github/` | GitHub transport (REST via Saloon), OAuth, community contribution ingestion (backfill + webhooks) + event lake | +| Onboarding | `app-modules/onboarding/` | Universal, mandatory entry layer — polymorphic onboarding state machines by type; owns the per-type completion gate (APTO) | +| Squads | `app-modules/squads/` | Squad lifecycle, membership and governance (captain/sub-captain, elections, removal, reallocation) | ## Relationships @@ -49,3 +51,5 @@ This is a modular monorepo (`internachi/modular`). Each bounded context lives un - **Integration Twitch** depends on Identity (OAuth user resolution, ExternalIdentity for tenant linking). It never imports from Moderation, Integration Discord, or Bot Discord. - **Integration GitHub** depends on Identity (OAuth user resolution; future `Character` seam via `ExternalIdentity`). It never imports from Activity, Economy, Moderation or any Bot/runtime module — it only emits the `GithubContributionRecorded` domain event. The community presentation (in `portal`) and the allowlist admin UI (in `panel-admin`) depend on it, never the reverse. - **Identity** has no upstream dependencies on other contexts listed here. +- **Onboarding** depends on Identity (User, tenant scoping, GitHub `ExternalIdentity` link) and listens to `integration-github`'s `GithubPullRequestApproved` domain event (reads the `challenge` repos in the allowlist). It never imports from `squads` — `squads` is a consumer of its completion gate, never the reverse. +- **Squads** depends on Onboarding (reads the `Squads`-completion gate, "APTO") and Identity (users/tenants). It never imports from presentation; the panels depend on it. From 36262a8e678dfc906b05d9ce4a32dd356b5a6412 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Sun, 21 Jun 2026 15:59:20 -0300 Subject: [PATCH 11/13] docs(squads): apply new questioning Co-authored-by: Sther <72408918+stherzada@users.noreply.github.com> Signed-off-by: Daniel Reis --- .../onboarding/docs/adr/0001-onboarding-polimorfico-por-tipo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app-modules/onboarding/docs/adr/0001-onboarding-polimorfico-por-tipo.md b/app-modules/onboarding/docs/adr/0001-onboarding-polimorfico-por-tipo.md index 50621065c..f6f5af3b8 100644 --- a/app-modules/onboarding/docs/adr/0001-onboarding-polimorfico-por-tipo.md +++ b/app-modules/onboarding/docs/adr/0001-onboarding-polimorfico-por-tipo.md @@ -14,7 +14,7 @@ Essa Entrada — chamada no documento da P.O. de "pré-triagem" — é **univers ninguém se candidata a um squad nem propõe um squad novo sem concluí-la. Duas perguntas de fronteira apareceram: -1. **Onde mora?** A pré-triagem é sobre pertencer à comunidade, não a um squad específico, e reusa +1. **Esse onboarding é específico de um squad ou global da comunidade?** A pré-triagem é sobre pertencer à comunidade, não a um squad específico, e reusa pesado o `identity` (vínculo GitHub via `ExternalIdentity`). Colocá-la dentro de `squads` amarraria um conceito universal a um consumidor específico. 2. **Quantos formatos?** O time já enxerga **mais de um tipo de entrada** — `Welcome` (entrada na From cb96c3ad595342ac761cb5e0834fbbc4c11f25ad Mon Sep 17 00:00:00 2001 From: Gabriel do Carmo Vieira <48625433+gvieira18@users.noreply.github.com> Date: Mon, 29 Jun 2026 21:32:15 -0300 Subject: [PATCH 12/13] chore(deps): update composer dependencies Bump guzzle to ^7.13.1 and refresh transitive locks; normalize he4rt/onboarding and he4rt/squads constraints from "*" to ">=1" to match sibling path modules. --- composer.json | 6 +-- composer.lock | 112 +++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 95 insertions(+), 23 deletions(-) diff --git a/composer.json b/composer.json index 7ef4fffe1..da144666b 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,7 @@ "dedoc/scramble": "^0.13.30", "filament/filament": "^5.6.7", "filament/spatie-laravel-media-library-plugin": "^5.6.7", - "guzzlehttp/guzzle": "^7.12.3", + "guzzlehttp/guzzle": "^7.13.1", "he4rt/activity": ">=1", "he4rt/bot-discord": ">=1.0", "he4rt/community": ">=1", @@ -29,12 +29,12 @@ "he4rt/integration-twitch": ">=1", "he4rt/integration-whatsapp": ">=1", "he4rt/moderation": "^1.0", - "he4rt/onboarding": "*", + "he4rt/onboarding": ">=1", "he4rt/panel-admin": ">=1", "he4rt/panel-app": ">=1", "he4rt/portal": ">=1", "he4rt/profile": ">=1", - "he4rt/squads": "*", + "he4rt/squads": ">=1", "internachi/modular": "^3.0.2", "laracord/framework": "dev-next#e7b64d6", "laravel/framework": "^13.17.0", diff --git a/composer.lock b/composer.lock index f4ed50a8b..0d5ccabcf 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f6267da13faf388a7153c1777f093a1f", + "content-hash": "d99073592af48a849b8d049d16bddaee", "packages": [ { "name": "blade-ui-kit/blade-heroicons", @@ -2662,16 +2662,16 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.12.3", + "version": "7.13.1", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "9aa17bcdd777ee31df9fc83c337ca4ca2340def3" + "reference": "55901a76dfd2006a0cc012b9e3c5b487f796478d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/9aa17bcdd777ee31df9fc83c337ca4ca2340def3", - "reference": "9aa17bcdd777ee31df9fc83c337ca4ca2340def3", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/55901a76dfd2006a0cc012b9e3c5b487f796478d", + "reference": "55901a76dfd2006a0cc012b9e3c5b487f796478d", "shasum": "" }, "require": { @@ -2690,7 +2690,7 @@ "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", "guzzle/client-integration-tests": "3.0.2", - "guzzlehttp/test-server": "^0.5.1", + "guzzlehttp/test-server": "^0.6", "php-http/message-factory": "^1.1", "phpunit/phpunit": "^8.5.52 || ^9.6.34", "psr/log": "^1.1 || ^2.0 || ^3.0" @@ -2770,7 +2770,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.12.3" + "source": "https://github.com/guzzle/guzzle/tree/7.13.1" }, "funding": [ { @@ -2786,7 +2786,7 @@ "type": "tidelift" } ], - "time": "2026-06-23T15:29:02+00:00" + "time": "2026-06-29T20:14:18+00:00" }, { "name": "guzzlehttp/promises", @@ -3607,6 +3607,42 @@ "relative": true } }, + { + "name": "he4rt/onboarding", + "version": "1.0.0", + "dist": { + "type": "path", + "url": "app-modules/onboarding", + "reference": "3a220d43dbb84baa4f55ad195653e0cf99c92c84" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "He4rt\\Onboarding\\Providers\\OnboardingServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "He4rt\\Onboarding\\": "src/", + "He4rt\\Onboarding\\Database\\Factories\\": "database/factories/", + "He4rt\\Onboarding\\Database\\Seeders\\": "database/seeders/" + } + }, + "autoload-dev": { + "psr-4": { + "He4rt\\Onboarding\\Tests\\": "tests/" + } + }, + "license": [ + "proprietary" + ], + "transport-options": { + "symlink": true, + "relative": true + } + }, { "name": "he4rt/panel-admin", "version": "1.0", @@ -3757,6 +3793,42 @@ "relative": true } }, + { + "name": "he4rt/squads", + "version": "1.0.0", + "dist": { + "type": "path", + "url": "app-modules/squads", + "reference": "6d710964545ed1c8635e42b11780e181211075e7" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "He4rt\\Squads\\Providers\\SquadsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "He4rt\\Squads\\": "src/", + "He4rt\\Squads\\Database\\Factories\\": "database/factories/", + "He4rt\\Squads\\Database\\Seeders\\": "database/seeders/" + } + }, + "autoload-dev": { + "psr-4": { + "He4rt\\Squads\\Tests\\": "tests/" + } + }, + "license": [ + "proprietary" + ], + "transport-options": { + "symlink": true, + "relative": true + } + }, { "name": "internachi/modular", "version": "3.0.2", @@ -7851,16 +7923,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.23", + "version": "v0.12.24", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "4dcc0f08047d52bbde475eda481146fd8e27e1a4" + "reference": "ca0fdcf8a7617afa3adfdf1b5fef573dffb69ca1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/4dcc0f08047d52bbde475eda481146fd8e27e1a4", - "reference": "4dcc0f08047d52bbde475eda481146fd8e27e1a4", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/ca0fdcf8a7617afa3adfdf1b5fef573dffb69ca1", + "reference": "ca0fdcf8a7617afa3adfdf1b5fef573dffb69ca1", "shasum": "" }, "require": { @@ -7924,9 +7996,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.23" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.24" }, - "time": "2026-05-23T13:41:31+00:00" + "time": "2026-06-29T15:41:09+00:00" }, { "name": "ralouphie/getallheaders", @@ -9861,16 +9933,16 @@ }, { "name": "spatie/image-optimizer", - "version": "1.9.0", + "version": "1.10.0", "source": { "type": "git", "url": "https://github.com/spatie/image-optimizer.git", - "reference": "6ad4d364e2fdfdfe7f2640d59e946c7fd7b8f3ab" + "reference": "333c03952289dc2df0a91874636a0dffeb5b6aec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/image-optimizer/zipball/6ad4d364e2fdfdfe7f2640d59e946c7fd7b8f3ab", - "reference": "6ad4d364e2fdfdfe7f2640d59e946c7fd7b8f3ab", + "url": "https://api.github.com/repos/spatie/image-optimizer/zipball/333c03952289dc2df0a91874636a0dffeb5b6aec", + "reference": "333c03952289dc2df0a91874636a0dffeb5b6aec", "shasum": "" }, "require": { @@ -9910,9 +9982,9 @@ ], "support": { "issues": "https://github.com/spatie/image-optimizer/issues", - "source": "https://github.com/spatie/image-optimizer/tree/1.9.0" + "source": "https://github.com/spatie/image-optimizer/tree/1.10.0" }, - "time": "2026-06-25T21:47:29+00:00" + "time": "2026-06-29T08:28:30+00:00" }, { "name": "spatie/invade", From 95be88d9992087329e19e116bc020ccb16b4222f Mon Sep 17 00:00:00 2001 From: Gabriel do Carmo Vieira <48625433+gvieira18@users.noreply.github.com> Date: Mon, 29 Jun 2026 21:32:25 -0300 Subject: [PATCH 13/13] chore(deps): bump frontend dev dependencies Update tailwindcss/vite to 4.3.2, prettier to 3.9.3, npm-check-updates to 22.2.9. --- package-lock.json | 160 +++++++++++++++++++++++----------------------- package.json | 8 +-- 2 files changed, 84 insertions(+), 84 deletions(-) diff --git a/package-lock.json b/package-lock.json index fc4830dad..b0efcf12b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,14 +12,14 @@ "@emnapi/core": "1.11.1", "@emnapi/runtime": "1.11.1", "@tailwindcss/typography": "0.5.20", - "@tailwindcss/vite": "4.3.1", + "@tailwindcss/vite": "4.3.2", "concurrently": "10.0.3", "husky": "9.1.7", "laravel-vite-plugin": "3.1.0", "lint-staged": "17.0.8", - "npm-check-updates": "22.2.8", - "prettier": "3.9.1", - "tailwindcss": "4.3.1", + "npm-check-updates": "22.2.9", + "prettier": "3.9.3", + "tailwindcss": "4.3.2", "tw-animate-css": "1.4.0", "vite": "8.1.0" }, @@ -404,9 +404,9 @@ "license": "MIT" }, "node_modules/@tailwindcss/node": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.1.tgz", - "integrity": "sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.2.tgz", + "integrity": "sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==", "dev": true, "license": "MIT", "dependencies": { @@ -416,37 +416,37 @@ "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", - "tailwindcss": "4.3.1" + "tailwindcss": "4.3.2" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.1.tgz", - "integrity": "sha512-yVPyo8RNkabVr3O2EhHEE0Rewu7YKzc1DhIqfL46LKveFrmu9XbDazNOJY7/GRuvw1h6u3utWnR29H/p5JPlgA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.2.tgz", + "integrity": "sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==", "dev": true, "license": "MIT", "engines": { "node": ">= 20" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.3.1", - "@tailwindcss/oxide-darwin-arm64": "4.3.1", - "@tailwindcss/oxide-darwin-x64": "4.3.1", - "@tailwindcss/oxide-freebsd-x64": "4.3.1", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.1", - "@tailwindcss/oxide-linux-arm64-gnu": "4.3.1", - "@tailwindcss/oxide-linux-arm64-musl": "4.3.1", - "@tailwindcss/oxide-linux-x64-gnu": "4.3.1", - "@tailwindcss/oxide-linux-x64-musl": "4.3.1", - "@tailwindcss/oxide-wasm32-wasi": "4.3.1", - "@tailwindcss/oxide-win32-arm64-msvc": "4.3.1", - "@tailwindcss/oxide-win32-x64-msvc": "4.3.1" + "@tailwindcss/oxide-android-arm64": "4.3.2", + "@tailwindcss/oxide-darwin-arm64": "4.3.2", + "@tailwindcss/oxide-darwin-x64": "4.3.2", + "@tailwindcss/oxide-freebsd-x64": "4.3.2", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.2", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.2", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.2", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.2", + "@tailwindcss/oxide-linux-x64-musl": "4.3.2", + "@tailwindcss/oxide-wasm32-wasi": "4.3.2", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.2", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.2" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.1.tgz", - "integrity": "sha512-SVlyf61g374l5cHyg8x9kf5xmLcOaxvOTsbsqDnSsDJaKOEFZ7GCvi84VAVGpxojYOs1+3K6M0UjXfqPU8vmOQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.2.tgz", + "integrity": "sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==", "cpu": [ "arm64" ], @@ -461,9 +461,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.1.tgz", - "integrity": "sha512-hVnWLwv+e/l7c4WKyVtHVrIPvYdqWHjRB3MDIqARynzFtnQg85kmQEFCbV9Ja0VVx4xXTIiDWY60Y7iz/iNoDA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.2.tgz", + "integrity": "sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==", "cpu": [ "arm64" ], @@ -478,9 +478,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.1.tgz", - "integrity": "sha512-Cf7abu0WVgbhU7ANgPUnSAvm7nCvMweusHb8FnaHlLfv/Caq4GYaEZg7ZImzzmjx4lIAfuS8q+eLIS7A7IzxIg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.2.tgz", + "integrity": "sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==", "cpu": [ "x64" ], @@ -495,9 +495,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.1.tgz", - "integrity": "sha512-ZZqzX2Y+GXtXXfqSfpJhDm60OoZfvLHLCgm+J7NVqgHHJjG/m9ugZI77RwTsVd4fnBJuCFP6Ae6kTJb71UdS8g==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.2.tgz", + "integrity": "sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==", "cpu": [ "x64" ], @@ -512,9 +512,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.1.tgz", - "integrity": "sha512-/Ah/xik0LaMYfv9DZ0S/t4pBlBNYOcqtRwusjgovHkvT8ixueWCLyJjsaF5kQIckjb4IT8Q6K6p/iPmZMixYgg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.2.tgz", + "integrity": "sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==", "cpu": [ "arm" ], @@ -529,9 +529,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.1.tgz", - "integrity": "sha512-gqdFoVJlw444GvpnheZLHmvTzSxI/cOUUh2KSNejQjTcYkW062SVD+En0rUgD+QV91bz1XGIGtt1HJd48xUGbQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.2.tgz", + "integrity": "sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==", "cpu": [ "arm64" ], @@ -546,9 +546,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.1.tgz", - "integrity": "sha512-Bwv9KwOvE0VKa86xPFif9b9c3Y1NxOV1P0gLti/IYaWEsQYZXDlxfGEtA8mdDZ7SG3wyNXAWYT5SIn3giL57oA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.2.tgz", + "integrity": "sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==", "cpu": [ "arm64" ], @@ -563,9 +563,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.1.tgz", - "integrity": "sha512-Ymi8O8T15HYQdOUWUtTI6ldN0neHP85FC+Qz32xTcZ7iJXtem/x8ITev0o1e9e5rkqj4lONZfTRLvkmin1+tKg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.2.tgz", + "integrity": "sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==", "cpu": [ "x64" ], @@ -580,9 +580,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.1.tgz", - "integrity": "sha512-M+P/91qJ6uILLw4k2G93GMDRAXj61SMvFQYt39AqvUqYgExXpLL5aepfns7sj4HiAQeolirQF9E0lzRvdf4zPQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.2.tgz", + "integrity": "sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==", "cpu": [ "x64" ], @@ -597,9 +597,9 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.1.tgz", - "integrity": "sha512-zsM8uOeqvVGHsAXsJxsT28ttosFahLJKCLOTUBqRAtKnVgGSRitds9T432QiT8b77Yga7JIBkulIRRlJPtYhRA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.2.tgz", + "integrity": "sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==", "bundleDependencies": [ "@napi-rs/wasm-runtime", "@emnapi/core", @@ -615,9 +615,9 @@ "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "^1.10.0", - "@emnapi/runtime": "^1.10.0", - "@emnapi/wasi-threads": "^1.2.1", + "@emnapi/core": "^1.11.1", + "@emnapi/runtime": "^1.11.1", + "@emnapi/wasi-threads": "^1.2.2", "@napi-rs/wasm-runtime": "^1.1.4", "@tybys/wasm-util": "^0.10.2", "tslib": "^2.8.1" @@ -627,9 +627,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.1.tgz", - "integrity": "sha512-aiNvSq9BsVk8V513lDKlrCFAgf8qBMPZTpgEhInL+NwQqs97mYmupVMrPrgBBSL8Pv/0zXu9MrMF9rMun1ZeNg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.2.tgz", + "integrity": "sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==", "cpu": [ "arm64" ], @@ -644,9 +644,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.1.tgz", - "integrity": "sha512-xDEyu1rg290472FEGaKHnzyDyh5QH+AlWvsU5hMoMtPpzmKlRI0jaYKCgSHDYtaQWZOYbMaduSyCwFwY4n1HmA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.2.tgz", + "integrity": "sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==", "cpu": [ "x64" ], @@ -674,15 +674,15 @@ } }, "node_modules/@tailwindcss/vite": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.1.tgz", - "integrity": "sha512-hItDHuIIlEV61R+faXu66s1K36aTurO/Qw0e45Vskz57gXl9pWOT6eg3zmcEui6CZXddbN7zd41bwmvag4JGwQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.2.tgz", + "integrity": "sha512-eHpMeX4JXfVNJDEcsouTeCBubJBTcTLigeaw/NTUW6PB5ATKKXdyonnXgTBX2VuRbjz1hjfz6C5XAhr52ImQXA==", "dev": true, "license": "MIT", "dependencies": { - "@tailwindcss/node": "4.3.1", - "@tailwindcss/oxide": "4.3.1", - "tailwindcss": "4.3.1" + "@tailwindcss/node": "4.3.2", + "@tailwindcss/oxide": "4.3.2", + "tailwindcss": "4.3.2" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" @@ -1488,9 +1488,9 @@ } }, "node_modules/npm-check-updates": { - "version": "22.2.8", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-22.2.8.tgz", - "integrity": "sha512-jL2cs1TSDSj3ieDlMVFf0bZFVqLNtXt+ExvCMF1OYxR7PiVjFcmAP80rJFNOFrrt0KLyPqeRBZtD7xZu9emd8w==", + "version": "22.2.9", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-22.2.9.tgz", + "integrity": "sha512-DVeZ0KirHfliSsHuR2o7cHE+tW439sVHfJjF6cGWeDiY0Wyl3BI/jS4zV0eixtcMOquFbcF1Su/FsxOvk5MoYA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -1539,9 +1539,9 @@ } }, "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "version": "8.5.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", + "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==", "dev": true, "funding": [ { @@ -1582,9 +1582,9 @@ } }, "node_modules/prettier": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.1.tgz", - "integrity": "sha512-ppiDo2CSwexck1eyZUwJHg/N3nf1+6IRCv7W/VJ5vaLnVCmB7+3CdRfMwoCHBBX6xTrREDTksZ4OZl5SSf4zXA==", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.3.tgz", + "integrity": "sha512-HWmu+K+zvHNpaMfSnYeqdqrDbR16cuIXaPx8WoHaviQkDJh1/0BNtOZmHVQI5jc3wXv0H1yXc9wjvFdXh+n3hQ==", "dev": true, "license": "MIT", "bin": { @@ -1775,9 +1775,9 @@ } }, "node_modules/tailwindcss": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.1.tgz", - "integrity": "sha512-hk+TB1m+K8CYNrP6rjQaq/Y+4Zylwpa87mLYBKCunwnnQ9p+fHb7kmSfGqyEJoxF/O6CDyABWVFEafNSYKll+Q==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.2.tgz", + "integrity": "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==", "dev": true, "license": "MIT", "peer": true diff --git a/package.json b/package.json index e118cc0e8..443a26ee4 100644 --- a/package.json +++ b/package.json @@ -19,14 +19,14 @@ "@emnapi/core": "1.11.1", "@emnapi/runtime": "1.11.1", "@tailwindcss/typography": "0.5.20", - "@tailwindcss/vite": "4.3.1", + "@tailwindcss/vite": "4.3.2", "concurrently": "10.0.3", "husky": "9.1.7", "laravel-vite-plugin": "3.1.0", "lint-staged": "17.0.8", - "npm-check-updates": "22.2.8", - "prettier": "3.9.1", - "tailwindcss": "4.3.1", + "npm-check-updates": "22.2.9", + "prettier": "3.9.3", + "tailwindcss": "4.3.2", "tw-animate-css": "1.4.0", "vite": "8.1.0" },