Skip to content

Feature/claude#613

Open
GustavoFSoares wants to merge 12 commits intohomolfrom
feature/claude
Open

Feature/claude#613
GustavoFSoares wants to merge 12 commits intohomolfrom
feature/claude

Conversation

@GustavoFSoares
Copy link
Copy Markdown
Collaborator

@GustavoFSoares GustavoFSoares commented Mar 16, 2026

Summary by CodeRabbit

  • Documentation

    • Added comprehensive frontend guides covering form/list/route/store conventions, component usage (table, pagination), project knowledge index, and several generator “skills” to scaffold CRUD pages.
  • Chore

    • Restricted an ignore rule to the repository root.
    • Introduced generic store-state types and a pagination-aware state type for global typings.

@cloudflare-workers-and-pages
Copy link
Copy Markdown

cloudflare-workers-and-pages bot commented Mar 16, 2026

Deploying smae with  Cloudflare Pages  Cloudflare Pages

Latest commit: 2c0fa9e
Status: ✅  Deploy successful!
Preview URL: https://bdaba353.smae.pages.dev
Branch Preview URL: https://feature-claude.smae.pages.dev

View logs

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Mar 16, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds frontend documentation and CLI-style "skills" under frontend/.claude/, new component READMEs under frontend/src/components/, and a small TypeScript typing change. Also tightens .gitignore to only ignore the repository-root /.claude/. No runtime code changes beyond types.

Changes

Cohort / File(s) Summary
Project Knowledge Docs
frontend/.claude/project-knowledge/form-creation.md, frontend/.claude/project-knowledge/list-creation.md, frontend/.claude/project-knowledge/route-creation.md, frontend/.claude/project-knowledge/store-creation.md
Added comprehensive frontend conventions for form schemas, list pages, route/module structure, and Pinia store patterns with examples and lifecycle guidance.
Skills & Tasks
frontend/.claude/skills/novo-formulario.md, frontend/.claude/skills/nova-lista.md, frontend/.claude/skills/nova-rota.md, frontend/.claude/skills/nova-store.md
New skill definitions describing interactive generation workflows and required inputs for scaffolding forms, lists, routes, and stores.
Component Documentation
frontend/src/components/MenuPaginacao.md, frontend/src/components/SmaeTable/README.md
Added usage docs for MenuPaginacao and SmaeTable: props, events, slots, examples, and URL/pagination behaviors to follow in consumers.
Frontend Index
frontend/CLAUDE.md
New index listing project-knowledge topics and available skills/commands.
Type Definitions
frontend/src/types/global.d.ts
Made Estado generic (Estado<ItemLista = unknown, ItemDetalhe = unknown>) and added EstadoPaginacao<ItemLista, ItemDetalhe> as Estado & { paginacao: Paginacao }.
Configuration
/.gitignore, .gitignore
Restricted .claude/ ignore to repository root by changing the pattern to /.claude/ (prevents ignoring nested .claude directories).

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

Suggested reviewers

  • robsonsobral
  • Eduruiz

Poem

🐇 I hopped through docs and typed a bit,

Seeds of routes, stores, and forms I knit,
Tables learned to paginate with grace,
Types dressed up for a cleaner place,
A tiny cheer — the repo wears a brighter fit 🥕✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Title check ❓ Inconclusive The title 'Feature/claude' is too vague and generic; it does not clearly convey what the pull request actually accomplishes. Use a more descriptive title that reflects the main changes, such as 'Add Claude AI documentation and skills for frontend scaffolding' or 'Add CLAUDE.md project knowledge and skill definitions for form/list/store/route generation'.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/claude

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (1)
frontend/.claude/project-knowledge/route-creation.md (1)

74-89: Consider documenting the optional tipos parameter for tiparPropsDeRota.

The documentation accurately describes the basic usage of tiparPropsDeRota, but the function signature actually accepts an optional second parameter tipos: Tipos = {} that allows explicit type mapping for route parameters.

While the automatic primitive decoding works well as a default, documenting the tipos parameter would help developers who need explicit type control.

📝 Suggested enhancement to documentation
 ### `tiparPropsDeRota` — uso padrão
 
 Sempre que os parâmetros da rota precisam ser passados como props para o componente, use `tiparPropsDeRota`:
 
 ```js
 import tiparPropsDeRota from '@/router/helpers/tiparPropsDeRota';
 
 {
   path: 'demandas/:id',
   name: 'demandaDetalhe',
   component: DemandaDetalhe,
   props: tiparPropsDeRota,
 }

-A função converte automaticamente os parâmetros para os tipos corretos (string, boolean, number) e decodifica primitivas.
+A função converte automaticamente os parâmetros para os tipos corretos (string, boolean, number) e decodifica primitivas. Para controle explícito de tipos, você pode passar um objeto de mapeamento:
+
+js +props: (route) => tiparPropsDeRota(route, { id: 'number', ativo: 'boolean' }), +


</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against the current code and only fix it if needed.

In @frontend/.claude/project-knowledge/route-creation.md around lines 74 - 89,
The docs for tiparPropsDeRota currently show only the default usage; update the
documentation to mention the optional second parameter tipos (Tipos = {}) that
allows explicit type mapping for route params and show a concise example using
props: (route) => tiparPropsDeRota(route, { id: 'number', ativo: 'boolean' });
reference the tiparPropsDeRota function and the tipos parameter so readers know
they can override automatic decoding with an explicit mapping.


</details>

</blockquote></details>

</blockquote></details>

<details>
<summary>🤖 Prompt for all review comments with AI agents</summary>

Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.gitignore:

  • Line 12: Replace the non-idiomatic gitignore pattern "./.claude/" with the
    root-anchored standard "/.claude/": open the .gitignore entry that currently
    contains "./.claude/" and change it to "/.claude/" so Git treats it as a
    repository-root directory ignore using standard .gitignore syntax.

In @frontend/.claude/project-knowledge/form-creation.md:

  • Around line 53-57: Update the example in form-creation.md to stop presenting
    keepValuesOnUnmount as a default useForm option: either remove the line
    "keepValuesOnUnmount: true" from the sample useForm call or retain it but mark
    it explicitly as optional with a short note describing when to use it (e.g., the
    specific use case in AreasTematicasCriarEditar.vue where form state must persist
    across unmounts). Make the change near the useForm example (the block showing
    const { errors, handleSubmit, isSubmitting, resetForm } = useForm({...})) and
    add one sentence referencing AreasTematicasCriarEditar.vue if you choose the
    optional-note approach.
  • Around line 5-22: Remove the misleading claim that "Schemas em formSchemas/
    separados não precisam ser registrados em formSchemas.js" and update the
    documentation to state the actual, enforced pattern: all schemas must be
    exported from and imported via the centralized barrel (@/consts/formSchemas /
    formSchemas.js); reference the existing standalone files (e.g., demanda.ts,
    tarefa.ts, metasLista.ts, buscaLivre.ts, InformarPreviaIndicador.schema.ts) as
    either deprecated/unused or document an alternative maintenance step (move or
    re-export them from formSchemas.js) so readers know to register schemas in
    formSchemas.js and import from the barrel.

Nitpick comments:
In @frontend/.claude/project-knowledge/route-creation.md:

  • Around line 74-89: The docs for tiparPropsDeRota currently show only the
    default usage; update the documentation to mention the optional second parameter
    tipos (Tipos = {}) that allows explicit type mapping for route params and show a
    concise example using props: (route) => tiparPropsDeRota(route, { id: 'number',
    ativo: 'boolean' }); reference the tiparPropsDeRota function and the tipos
    parameter so readers know they can override automatic decoding with an explicit
    mapping.

</details>

---

<details>
<summary>ℹ️ Review info</summary>

<details>
<summary>⚙️ Run configuration</summary>

**Configuration used**: defaults

**Review profile**: CHILL

**Plan**: Pro

**Run ID**: `f5550cd1-c279-417d-b40d-3daf4a332569`

</details>

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 56e6fe4326895991a91a96422eb70c209cda20f9 and 4e9958c3da829026d84ce828629a4aa76128764a.

</details>

<details>
<summary>📒 Files selected for processing (9)</summary>

* `.gitignore`
* `frontend/.claude/project-knowledge/form-creation.md`
* `frontend/.claude/project-knowledge/list-creation.md`
* `frontend/.claude/project-knowledge/route-creation.md`
* `frontend/.claude/project-knowledge/store-creation.md`
* `frontend/.claude/skills/novo-formulario.md`
* `frontend/CLAUDE.md`
* `frontend/src/components/MenuPaginacao.md`
* `frontend/src/components/SmaeTable/README.md`

</details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->

Comment on lines +5 to +22
- Schemas ficam em `src/consts/formSchemas/<entidade>.ts`
- Importar primitivos de `./initSchema` (não direto do `yup`):
```ts
import {
object,
string,
number,
array,
boolean,
date,
mixed,
} from "./initSchema";
```
- Sempre usar `.label('Nome do Campo')` em cada campo — o `SmaeLabel` extrai isso automaticamente
- Campos opcionais: `.nullable()` ou `.nullableOuVazio()`
- Campos condicionais: `.when('outro_campo', { is: ..., then: ..., otherwise: ... })`
- Exportar como named export: `export const minhaEntidadeSchema = object().shape({ ... })`
- Schemas em `formSchemas/` separados **não** precisam ser registrados em `formSchemas.js` — são importados diretamente na view
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot Mar 16, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check if schemas are centralized in formSchemas.js or distributed in separate files

echo "=== Schemas exported from formSchemas.js ==="
rg -n "^export const \w+ = " frontend/src/consts/formSchemas.js | head -20

echo ""
echo "=== Separate schema files in formSchemas/ directory ==="
fd -e ts -e js . frontend/src/consts/formSchemas/

echo ""
echo "=== How views import schemas ==="
rg -n "from ['\"]@/consts/formSchemas" frontend/src/views/ -A 0 | head -20

Repository: AppCivico/smae

Length of output: 4494


🏁 Script executed:

#!/bin/bash
# Check if separate schema files are imported anywhere in the codebase

echo "=== Searching for imports of separate schema files ==="
rg "from ['\"].*formSchemas/(buscaLivre|demanda|metasLista|tarefa|InformarPreviaIndicador)" --type ts --type tsx --type js --type vue -A 0

echo ""
echo "=== Check if formSchemas.js imports from separate schema files ==="
rg "from ['\"].*formSchemas/(buscaLivre|demanda|metasLista|tarefa)" frontend/src/consts/formSchemas.js

echo ""
echo "=== Content of one separate schema file for context ==="
head -30 frontend/src/consts/formSchemas/demanda.ts

Repository: AppCivico/smae

Length of output: 1188


🏁 Script executed:

#!/bin/bash
# Check full formSchemas.js for any imports or references to separate files

echo "=== Check full formSchemas.js imports section ==="
head -100 frontend/src/consts/formSchemas.js | grep -E "^import|^export"

echo ""
echo "=== Line count of formSchemas.js ==="
wc -l frontend/src/consts/formSchemas.js

echo ""
echo "=== Check if formSchemas/ files are mentioned anywhere in formSchemas.js ==="
rg "formSchemas/(buscaLivre|demanda|metasLista|tarefa|InformarPreviaIndicador)" frontend/src/consts/formSchemas.js

Repository: AppCivico/smae

Length of output: 1838


🏁 Script executed:

#!/bin/bash
# Check if separate schema files have recent changes or are intentionally separated

echo "=== Check git status of separate schema files ==="
git log -1 --oneline frontend/src/consts/formSchemas/demanda.ts frontend/src/consts/formSchemas/tarefa.ts frontend/src/consts/formSchemas/metasLista.ts 2>/dev/null | head -10

echo ""
echo "=== Check if there are any TODOs or comments in demanda.ts about usage ==="
head -5 frontend/src/consts/formSchemas/demanda.ts

Repository: AppCivico/smae

Length of output: 424


Documentation contradicts actual schema registration practice—remove misleading guidance.

The documentation at line 21–22 states that schemas in separate formSchemas/<entity>.ts files do not need to be registered in formSchemas.js and can be imported directly in views. However, verification shows:

  1. Those separate schema files (demanda.ts, tarefa.ts, metasLista.ts, buscaLivre.ts, InformarPreviaIndicador.schema.ts) exist but are never imported or used anywhere in the codebase.
  2. All views import schemas exclusively from the centralized @/consts/formSchemas barrel file.
  3. formSchemas.js does not reference or import from those separate files.

Remove the incorrect claim on line 21–22. The actual pattern requires all schemas to be defined in and exported from formSchemas.js. If the separate schema files serve a legitimate purpose, document that separately; otherwise, clarify that the only supported pattern is the centralized barrel approach.

🧰 Tools
🪛 LanguageTool

[uncategorized] ~21-~21: Se é uma abreviatura, falta um ponto. Se for uma expressão, coloque entre aspas.
Context: ...therwise: ... })- Exportar como named export:export const minhaEntidadeSchema = ob...

(ABREVIATIONS_PUNCTUATION)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@frontend/.claude/project-knowledge/form-creation.md` around lines 5 - 22,
Remove the misleading claim that "Schemas em formSchemas/ separados não precisam
ser registrados em formSchemas.js" and update the documentation to state the
actual, enforced pattern: all schemas must be exported from and imported via the
centralized barrel (`@/consts/formSchemas` / formSchemas.js); reference the
existing standalone files (e.g., demanda.ts, tarefa.ts, metasLista.ts,
buscaLivre.ts, InformarPreviaIndicador.schema.ts) as either deprecated/unused or
document an alternative maintenance step (move or re-export them from
formSchemas.js) so readers know to register schemas in formSchemas.js and import
from the barrel.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Veja essa, @GustavoFSoares .

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems like the humans are having a chat. I'll hop back into my burrow for now. If you need me again, just tag @coderabbitai in a new comment, and I'll come hopping out!

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

these files are been using.
One example is frontend/src/views/demandas/DemandasCriarEditar.vue:21, when CadastroDemandaSchema is been imported and used correctly

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

♻️ Duplicate comments (1)
frontend/.claude/project-knowledge/form-creation.md (1)

22-22: ⚠️ Potential issue | 🟠 Major

Remove contradictory schema registration guidance (Line 22).

This line still states that standalone files under formSchemas/ do not need central registration. That conflicts with the documented/used centralized schema access pattern and will mislead new implementations.

Suggested doc fix
-- Schemas em `formSchemas/` separados **não** precisam ser registrados em `formSchemas.js` — são importados diretamente na view
+- Todo schema deve ser exportado pelo ponto central de schemas (`@/consts/formSchemas`) para manter o padrão de consumo nas views.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@frontend/.claude/project-knowledge/form-creation.md` at line 22, The sentence
claiming "Schemas em `formSchemas/` separados **não** precisam ser registrados
em `formSchemas.js`" is contradictory; update the docs so it states that all
schema files in `formSchemas/` must be centrally registered in `formSchemas.js`
to follow the app's centralized schema access pattern. Edit the paragraph in
form-creation.md to remove the negation and explicitly instruct contributors to
add new schema modules to `formSchemas.js` (mention `formSchemas/` and
`formSchemas.js` by name) and optionally show the single-line
import/registration pattern used elsewhere in the repo.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In `@frontend/.claude/project-knowledge/form-creation.md`:
- Line 22: The sentence claiming "Schemas em `formSchemas/` separados **não**
precisam ser registrados em `formSchemas.js`" is contradictory; update the docs
so it states that all schema files in `formSchemas/` must be centrally
registered in `formSchemas.js` to follow the app's centralized schema access
pattern. Edit the paragraph in form-creation.md to remove the negation and
explicitly instruct contributors to add new schema modules to `formSchemas.js`
(mention `formSchemas/` and `formSchemas.js` by name) and optionally show the
single-line import/registration pattern used elsewhere in the repo.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 19781d52-663a-4660-a207-d1194b21aa90

📥 Commits

Reviewing files that changed from the base of the PR and between e43c80c and 29a8891.

📒 Files selected for processing (1)
  • frontend/.claude/project-knowledge/form-creation.md

Copy link
Copy Markdown
Collaborator

@robsonsobral robsonsobral left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Quando um item tem página de resumo e de edição, a gente tem uma view coisaItem para envelopar ambos e evitar duplicar código. Também valeria a pena. adicionar isso.

// adicionar campos conforme o DTO do backend
}

interface Estado {
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Esse tipo é global. Não precisa redefinir.

erro: null | unknown;
}

export const useMinhaEntidadeStore = defineStore('minhaEntidade', {
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A gente não fez aceitar um parâmetro para prefixar as stores, @GustavoFSoares ?! Vamos botar ele por padrão, com fallback.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mas não é o caso normal. Acho que isso devemos tratar como exceção, ou criar uma alteração na skill

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mas o código pode estar pronto para receber. Se não vier, não prefixa.

lista: [],
emFoco: null,
chamadasPendentes: { lista: false, emFoco: false },
erro: null,
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A gente não vai quebrar o componente de erro como erros? Já tivemos problemas em algumas telas, com erro de uma coisa atrapalhando outra.

},
```

No componente de lista, usar `watchEffect` (rastreia automaticamente todos os `route.query` acessados dentro de `buscarTudo`):
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tem certeza de que não roda sem necessidade, @GustavoFSoares ?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

acredito que nao. Podemos alterar para um watch e nomear todos, mas acho trabalhoso. Preferiria testar.
Até onde imagino, se alterar um query, deveria buscar novamente

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Depende. Pode ser que altere um parâmetro que é usado por outra parte da tela, não aquela. E aí, vai recarregar o que não deve.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Esse deveria ser uma SKILL

### Props de query e params juntos

```js
props: ({ params, query }) => ({
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

E o tiparProps(), @GustavoFSoares ?

```js
props: ({ params, query }) => ({
...params,
...query,
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Por que converter parâmetros de query string em props?!

],
() => {
store.$reset();
store.buscarTudo(route.query);
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Passar parâmetros à mais é má prática, @GustavoFSoares .

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Deveria ser uma SKILL.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Deveria ser uma SKILL

@GustavoFSoares
Copy link
Copy Markdown
Collaborator Author

Quando um item tem página de resumo e de edição, a gente tem uma view coisaItem para envelopar ambos e evitar duplicar código. Também valeria a pena. adicionar isso.

Nao peguei a referencia. Preciso de exemplo

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🧹 Nitpick comments (4)
frontend/.claude/project-knowledge/form-creation.md (1)

1-1: Should this be a "skill" instead of "project knowledge"?

Based on past review comments, there's a suggestion that form creation documentation should be structured as a .claude/skills/ workflow rather than static project knowledge. Skills provide step-by-step generation instructions for Claude, while project knowledge is reference material.

Consider whether this content is better suited as:

  • frontend/.claude/skills/novo-formulario.md (actionable workflow for generating forms)
  • Keep as project knowledge (reference material)

Based on learnings: Past review comments on lines 1-1 of both form-creation.md and store-creation.md suggested these should be "SKILLS".

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@frontend/.claude/project-knowledge/form-creation.md` at line 1, The file
frontend/.claude/project-knowledge/form-creation.md is currently authored as
project knowledge but reviewers recommend it be an actionable Claude "skill";
move or copy its contents into a new skill workflow
frontend/.claude/skills/novo-formulario.md (and do the same for
store-creation.md), rewriting the content into a step-by-step prompt/workflow
format suited for Claude (inputs, expected outputs, and example commands), then
either remove the original project-knowledge files or replace them with a short
reference/link to the new skill so callers use novo-formulario.md (and the
corresponding novo-store skill) instead of the static project-knowledge
documents.
frontend/.claude/project-knowledge/store-creation.md (2)

1-1: Should this be a "skill" instead of "project knowledge"?

Based on past review comments, there's a suggestion that store creation documentation should be structured as a .claude/skills/ workflow rather than static project knowledge.

The PR already includes frontend/.claude/skills/nova-store.md which likely references this documentation. Consider whether:

  1. This content should remain as reference material (current approach), OR
  2. The skill should be self-contained with this content embedded

Based on learnings: Past review comment on line 1-1 suggested this should be a "SKILL".

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@frontend/.claude/project-knowledge/store-creation.md` at line 1, The file
frontend/.claude/project-knowledge/store-creation.md appears to duplicate
workflow content already present in frontend/.claude/skills/nova-store.md; make
this a single source by either (A) converting store-creation.md into a
self-contained skill by moving its contents into
frontend/.claude/skills/nova-store.md (or merging and deleting the
project-knowledge copy) so the skill contains all guidance, examples and
prompts, or (B) keep store-creation.md only as a short reference and update
frontend/.claude/skills/nova-store.md to import/link to it and not duplicate
content; update the README/skill metadata in nova-store.md accordingly.

16-20: Consider documenting the global Estado type definition.

The code uses Estado<Item> on line 23, which according to learnings is a global type. However, developers reading this documentation might not know where Estado is defined or what it provides.

Consider adding a note like:

> **Nota:** `Estado<Item>` é um tipo global definido em `frontend/src/types/global.d.ts` que inclui campos padrão para stores (`lista`, `emFoco`, `chamadasPendentes`, `erros`).

This would help developers understand the pattern without needing to define local interfaces that duplicate the global type structure.

Based on learnings: ChamadasPendentes and Erros are global types defined in frontend/src/types/global.d.ts (from robsonsobral's learning about tipoEncerramento.store.ts).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@frontend/.claude/project-knowledge/store-creation.md` around lines 16 - 20,
Add a short note in store-creation.md explaining that Estado<Item> is a global
type (used where Estado<Item> appears) and list its standard store fields
(lista, emFoco, chamadasPendentes, erros), and mention that ChamadasPendentes
and Erros are also global types; update the documentation near the Estado<Item>
usage so readers know these global symbols (Estado, ChamadasPendentes, Erros)
provide the default store shape instead of duplicating local interfaces.
frontend/.claude/project-knowledge/list-creation.md (1)

1-1: Should this be a "skill" instead of "project knowledge"?

Based on past review comments, there's a suggestion that list creation documentation should be structured as a .claude/skills/ workflow rather than static project knowledge.

Consider whether this content is better suited as:

  • frontend/.claude/skills/nova-lista.md (actionable workflow for generating list pages)
  • Keep as project knowledge (reference material)

Based on learnings: Past review comment on line 1-1 suggested this should be a "SKILL".

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@frontend/.claude/project-knowledge/list-creation.md` at line 1, The "Criação
de Listas no Frontend SMAE" content should be converted from passive
project-knowledge into an actionable skill: create a new skill file named
nova-lista.md under the .claude skills area and migrate the guidance there;
rewrite the content as a step-by-step workflow (inputs, triggers, outputs,
templates, and examples) and add metadata/tags for intent (e.g., "create-list",
"frontend", "SMAE") so automation can invoke it, keeping the original document
as brief reference or a link to the new skill.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@frontend/.claude/project-knowledge/form-creation.md`:
- Line 88: Replace the absolute prohibition of the vee-validate <Form> wrapper
with prescriptive guidance describing when to use <Form> vs the composition API
useForm: identify that both patterns are valid, explain pros/cons and
recommended use cases (e.g., simple template-driven forms or view-level forms ->
<Form>; complex programmatic validation, reusable form logic or composables ->
useForm), reference the existing usages (examples:
NovoOrcamentarioPortfolio.vue, NovoRelatorioDePortfolio.vue,
NovoSemestralOuAnual.vue) as canonical cases, and update the sentence at the
current location to provide these rules of thumb and migration notes instead of
a blanket "must not be used" rule.

In `@frontend/.claude/project-knowledge/list-creation.md`:
- Around line 62-63: The doc example showing store.$reset(); store.buscarTudo();
is inconsistent with the codebase where buscarTudo() is usually called without
$reset() (see usages in PlanosDeAcaoLista, VariaveisCategoricasLista and
TarefasLista), so update the documentation to either (A) remove the $reset()
from the example to match the common pattern and state that buscarTudo()
normally refreshes state without explicit reset, or (B) keep the $reset() but
add a short rule clarifying when $reset() is required (e.g., to clear
pagination/filter state before fetching). Modify the list-creation.md example
accordingly and add a one-line note referencing the store methods $reset() and
buscarTudo() so readers know the expected behavior.

In `@frontend/.claude/project-knowledge/route-creation.md`:
- Line 115: Update the documentation entry for rotasParaMenuSecundário in
route-creation.md so its type matches the actual type definition (string[]), not
`string[] | Function`; find the table row that currently lists
`rotasParaMenuSecundário` and change the type column to `string[]` and any
descriptive text that mentions accepting a Function to reflect that only an
array of strings is supported by the global type definition
(rotasParaMenuSecundário in frontend/src/types/global.d.ts).
- Around line 170-181: O exemplo atual mistura as duas estratégias de registro
(meuModulo e ...meuModulo) na mesma array routes, o que é inválido; escolha uma
estratégia por módulo: se o export de meuModulo for um objeto, adicione apenas
meuModulo em routes; se for um array, use apenas o spread ...meuModulo em
routes. Atualize o trecho que popula routes para usar apenas uma dessas formas
para cada import (referência: meuModulo e routes).

In `@frontend/src/components/MenuPaginacao.md`:
- Around line 68-73: O snippet da interface Estado define tipos locais para
chamadasPendentes e erro; substitua essas formas locais pela utilização dos
tipos globais ChamadasPendentes e Erros (mantendo Item e Paginacao como estão)
para alinhar ao padrão do projeto; atualize a propriedade chamadasPendentes para
usar ChamadasPendentes e a propriedade erro para usar Erros, garantindo
import/declaração correta desses tipos no mesmo arquivo.

---

Nitpick comments:
In `@frontend/.claude/project-knowledge/form-creation.md`:
- Line 1: The file frontend/.claude/project-knowledge/form-creation.md is
currently authored as project knowledge but reviewers recommend it be an
actionable Claude "skill"; move or copy its contents into a new skill workflow
frontend/.claude/skills/novo-formulario.md (and do the same for
store-creation.md), rewriting the content into a step-by-step prompt/workflow
format suited for Claude (inputs, expected outputs, and example commands), then
either remove the original project-knowledge files or replace them with a short
reference/link to the new skill so callers use novo-formulario.md (and the
corresponding novo-store skill) instead of the static project-knowledge
documents.

In `@frontend/.claude/project-knowledge/list-creation.md`:
- Line 1: The "Criação de Listas no Frontend SMAE" content should be converted
from passive project-knowledge into an actionable skill: create a new skill file
named nova-lista.md under the .claude skills area and migrate the guidance
there; rewrite the content as a step-by-step workflow (inputs, triggers,
outputs, templates, and examples) and add metadata/tags for intent (e.g.,
"create-list", "frontend", "SMAE") so automation can invoke it, keeping the
original document as brief reference or a link to the new skill.

In `@frontend/.claude/project-knowledge/store-creation.md`:
- Line 1: The file frontend/.claude/project-knowledge/store-creation.md appears
to duplicate workflow content already present in
frontend/.claude/skills/nova-store.md; make this a single source by either (A)
converting store-creation.md into a self-contained skill by moving its contents
into frontend/.claude/skills/nova-store.md (or merging and deleting the
project-knowledge copy) so the skill contains all guidance, examples and
prompts, or (B) keep store-creation.md only as a short reference and update
frontend/.claude/skills/nova-store.md to import/link to it and not duplicate
content; update the README/skill metadata in nova-store.md accordingly.
- Around line 16-20: Add a short note in store-creation.md explaining that
Estado<Item> is a global type (used where Estado<Item> appears) and list its
standard store fields (lista, emFoco, chamadasPendentes, erros), and mention
that ChamadasPendentes and Erros are also global types; update the documentation
near the Estado<Item> usage so readers know these global symbols (Estado,
ChamadasPendentes, Erros) provide the default store shape instead of duplicating
local interfaces.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: dd16e952-5712-458e-9a5b-e45764e432f0

📥 Commits

Reviewing files that changed from the base of the PR and between 29a8891 and 1539c6d.

📒 Files selected for processing (13)
  • .gitignore
  • frontend/.claude/project-knowledge/form-creation.md
  • frontend/.claude/project-knowledge/list-creation.md
  • frontend/.claude/project-knowledge/route-creation.md
  • frontend/.claude/project-knowledge/store-creation.md
  • frontend/.claude/skills/nova-lista.md
  • frontend/.claude/skills/nova-rota.md
  • frontend/.claude/skills/nova-store.md
  • frontend/.claude/skills/novo-formulario.md
  • frontend/CLAUDE.md
  • frontend/src/components/MenuPaginacao.md
  • frontend/src/components/SmaeTable/README.md
  • frontend/src/types/global.d.ts
✅ Files skipped from review due to trivial changes (1)
  • frontend/src/components/SmaeTable/README.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • .gitignore

</template>
```

> **Atenção:** O padrão com `<Form>` wrapper do vee-validate **não deve ser usado** neste projeto. Sempre use o padrão com `useForm` acima, independentemente da complexidade do formulário.
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot Mar 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Search for any existing usage of vee-validate <Form> wrapper in the codebase

echo "=== Searching for <Form> component from vee-validate ==="
rg -n '<Form' frontend/src/views/ -A 2 -B 1

echo ""
echo "=== Searching for Form imports from vee-validate ==="
rg -n "import.*Form.*from ['\"]vee-validate['\"]" frontend/src/

Repository: AppCivico/smae

Length of output: 50370


Update documentation: <Form> wrapper is actually used extensively in the codebase.

The documentation states that the <Form> wrapper from vee-validate "must not be used," but the codebase contains numerous active usages across many view files (NovoOrcamentarioPortfolio.vue, NovoRelatorioDePortfolio.vue, NovoSemestralOuAnual.vue, and 70+ others). The prohibition does not match actual project practice.

Update the documentation to reflect when each pattern (<Form> wrapper vs. useForm composition) is appropriate for the project, rather than stating a blanket prohibition.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@frontend/.claude/project-knowledge/form-creation.md` at line 88, Replace the
absolute prohibition of the vee-validate <Form> wrapper with prescriptive
guidance describing when to use <Form> vs the composition API useForm: identify
that both patterns are valid, explain pros/cons and recommended use cases (e.g.,
simple template-driven forms or view-level forms -> <Form>; complex programmatic
validation, reusable form logic or composables -> useForm), reference the
existing usages (examples: NovoOrcamentarioPortfolio.vue,
NovoRelatorioDePortfolio.vue, NovoSemestralOuAnual.vue) as canonical cases, and
update the sentence at the current location to provide these rules of thumb and
migration notes instead of a blanket "must not be used" rule.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bom ponto. Você pode deixar claro que o uso de <Form> é obsoleto no projeto, que se deve migrar quando possível.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@robsonsobral, entendido! Vou atualizar a nota para deixar claro que o <Form> wrapper é obsoleto no projeto e que a migração para useForm deve ser feita quando possível.

  • Atualizar a nota de aviso no final de frontend/.claude/project-knowledge/form-creation.md para indicar que <Form> é obsoleto e que novas telas devem usar useForm, e que telas existentes devem migrar quando possível.

✏️ Learnings added
Learnt from: robsonsobral
Repo: AppCivico/smae PR: 613
File: frontend/.claude/project-knowledge/form-creation.md:88-88
Timestamp: 2026-03-20T19:31:51.467Z
Learning: No projeto SMAE (AppCivico/smae), o uso do componente `<Form>` wrapper do vee-validate é considerado obsoleto. Todo código novo de formulário deve usar o padrão de composição com `useForm` (de `vee-validate`). Telas existentes que ainda utilizam `<Form>` devem ser migradas para `useForm` quando possível. Isso está documentado em `frontend/.claude/project-knowledge/form-creation.md`.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.


🧠 Learnings used
Learnt from: Eduruiz
Repo: AppCivico/smae PR: 343
File: frontend/src/components/transferencia/VaralDeEtapas.vue:86-89
Timestamp: 2025-06-10T16:15:44.557Z
Learning: In this Vue.js project, several components are globally registered using app.component() and don't require explicit imports in Vue components. The globally registered components include: CheckClose, ErrorComponent, FormErrorsList, SmaeFieldsetSubmit, LabelFromYup, SmaeLabel, LoadingComponent, MigalhasDePão, MigalhasDePao, SmaeLink, SmaeText, TítuloDePágina, TituloDePagina, TituloDaPagina, and CabecalhoDePagina.

Learnt from: robsonsobral
Repo: AppCivico/smae PR: 348
File: frontend/src/components/FiltroParaPagina.vue:262-271
Timestamp: 2025-06-11T00:40:44.522Z
Learning: No projeto SMAE, em formulários como `FiltroParaPagina.vue`, o botão de submissão permanece habilitado mesmo quando há erros de validação. A prevenção do envio é feita dentro do handler de `submit`, permitindo ao usuário focar o botão e ler as mensagens de erro; portanto não se aplica o atributo `disabled`, apenas `aria-*`.

Learnt from: robsonsobral
Repo: AppCivico/smae PR: 472
File: frontend/src/components/monitoramentoDeMetas/DetalhamentoDeCiclo.vue:305-333
Timestamp: 2025-12-04T19:31:36.635Z
Learning: No projeto SMAE, existe um capturador de erros no elemento raiz da aplicação que lida com erros lançados pelos componentes, incluindo feedback visual ao usuário. Portanto, não é necessário adicionar tratamento de erro específico em cada função que lança erros - o `throw` no catch block é suficiente para que o erro seja capturado e tratado globalmente.

Learnt from: CR
Repo: AppCivico/smae PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-03T12:14:22.453Z
Learning: Applies to backend/**/*.{ts,tsx} : Follow the backend NestJS development patterns documented in backend/PATTERNS.md, including Prisma schema patterns (audit fields, shared relationships), NestJS module structure, service and controller patterns, privilege system, migration workflow, and complete CRUD checklist

  • 📌 Commit the changes to this branch

| `rotaDeEscape` | `string` | Nome da rota para onde ir ao cancelar/voltar |
| `rotasParaMigalhasDePão` | `string[]` | Nomes de rotas que formam o breadcrumb |
| `rotasParaMenuPrincipal` | `string[]` | Nomes de rotas exibidas no menu lateral principal |
| `rotasParaMenuSecundário` | `string[] \| Function` | Nomes de rotas exibidas no menu secundário |
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot Mar 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Confirma divergência entre documentação e tipagem global.
rg -n "rotasParaMenuSecundário" frontend/.claude/project-knowledge/route-creation.md frontend/src/types/global.d.ts

Repository: AppCivico/smae

Length of output: 288


Update documentation for rotasParaMenuSecundário type definition to match implementation.

The documentation in frontend/.claude/project-knowledge/route-creation.md (line 115) states rotasParaMenuSecundário accepts string[] | Function, but the actual type definition in frontend/src/types/global.d.ts (line 77) defines it as string[] only. Update the documentation to match the type definition.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@frontend/.claude/project-knowledge/route-creation.md` at line 115, Update the
documentation entry for rotasParaMenuSecundário in route-creation.md so its type
matches the actual type definition (string[]), not `string[] | Function`; find
the table row that currently lists `rotasParaMenuSecundário` and change the type
column to `string[]` and any descriptive text that mentions accepting a Function
to reflect that only an array of strings is supported by the global type
definition (rotasParaMenuSecundário in frontend/src/types/global.d.ts).

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bom ponto, @GustavoFSoares .

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems like the humans are having a chat. I'll hop back into my burrow for now. If you need me again, just tag @coderabbitai in a new comment, and I'll come hopping out!

Comment on lines +170 to +181
```js
// import direto (objeto único)
import meuModulo from './meu-modulo.js';

// ou spread (array de rotas)
import * as meuModulo from './meu-modulo.js';

const routes = [
// ...outras rotas
meuModulo, // import direto
...meuModulo, // spread
];
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot Mar 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verifica padrão real de exports dos módulos de rota e forma de registro no index.
rg -n --type=js -C2 "export default|export const" frontend/src/router
rg -n --type=js -C4 "import .* from './.*\\.js'|import \\* as .* from './.*\\.js'|const routes\\s*=\\s*\\[" frontend/src/router/index.js

Repository: AppCivico/smae

Length of output: 11196


🏁 Script executed:

cat -n frontend/src/router/index.js | head -80

Repository: AppCivico/smae

Length of output: 3218


🏁 Script executed:

cat -n frontend/src/router/index.js | sed -n '43,120p'

Repository: AppCivico/smae

Length of output: 2333


Separe as duas estratégias de registro (elas são alternativas, não cumulativas).

Em Line 177-181, o exemplo adiciona meuModulo e ...meuModulo juntos na mesma array routes. Esse padrão misto nunca é usado no codebase real—cada módulo é registrado usando ou a estratégia direta (para exports de objeto) ou spread (para exports de array), nunca ambas simultaneamente. Copiado como está, quebrará conforme o tipo de export do módulo.

Exemplo corrigido:
// Se meuModulo exporta um objeto:
import meuModulo from './meu-modulo.js';
const routes = [ ...outras, meuModulo ];

// Se meuModulo exporta um array:
import meuModulo from './meu-modulo.js';
const routes = [ ...outras, ...meuModulo ];

// Nunca:
import meuModulo from './meu-modulo.js';
const routes = [ ...outras, meuModulo, ...meuModulo ];
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@frontend/.claude/project-knowledge/route-creation.md` around lines 170 - 181,
O exemplo atual mistura as duas estratégias de registro (meuModulo e
...meuModulo) na mesma array routes, o que é inválido; escolha uma estratégia
por módulo: se o export de meuModulo for um objeto, adicione apenas meuModulo em
routes; se for um array, use apenas o spread ...meuModulo em routes. Atualize o
trecho que popula routes para usar apenas uma dessas formas para cada import
(referência: meuModulo e routes).

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isso ficou mesmo confuso, @GustavoFSoares .

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems like the humans are having a chat. I'll hop back into my burrow for now. If you need me again, just tag @coderabbitai in a new comment, and I'll come hopping out!

Comment on lines +68 to +73
interface Estado {
lista: Item[];
paginacao: Paginacao;
chamadasPendentes: { lista: boolean };
erro: null | unknown;
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Alinhe o exemplo de Estado aos tipos globais do projeto.

Em Line 71-73, o snippet usa shape local ({ lista: boolean } + erro) e diverge do padrão global (ChamadasPendentes e Erros). Isso pode induzir implementação inconsistente em novas stores.

📌 Ajuste sugerido no snippet
-interface Estado {
-  lista: Item[];
-  paginacao: Paginacao;
-  chamadasPendentes: { lista: boolean };
-  erro: null | unknown;
-}
+interface Estado {
+  lista: Item[];
+  paginacao: Paginacao;
+  chamadasPendentes: ChamadasPendentes;
+  erros: Erros;
+}
Based on learnings: In the SMAE frontend, `ChamadasPendentes` and `Erros` are global types in `frontend/src/types/global.d.ts` and should be used directly.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
interface Estado {
lista: Item[];
paginacao: Paginacao;
chamadasPendentes: { lista: boolean };
erro: null | unknown;
}
interface Estado {
lista: Item[];
paginacao: Paginacao;
chamadasPendentes: ChamadasPendentes;
erros: Erros;
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@frontend/src/components/MenuPaginacao.md` around lines 68 - 73, O snippet da
interface Estado define tipos locais para chamadasPendentes e erro; substitua
essas formas locais pela utilização dos tipos globais ChamadasPendentes e Erros
(mantendo Item e Paginacao como estão) para alinhar ao padrão do projeto;
atualize a propriedade chamadasPendentes para usar ChamadasPendentes e a
propriedade erro para usar Erros, garantindo import/declaração correta desses
tipos no mesmo arquivo.

@sonarqubecloud
Copy link
Copy Markdown

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (4)
frontend/.claude/project-knowledge/route-creation.md (2)

115-115: ⚠️ Potential issue | 🟡 Minor

Corrija a tipagem documentada de rotasParaMenuSecundário.

Em Line 115, o guia ainda mostra string[] | Function, mas o padrão já revisado é string[].

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@frontend/.claude/project-knowledge/route-creation.md` at line 115, Update the
documented type for rotasParaMenuSecundário from "string[] | Function" to the
revised standard "string[]" wherever it's declared or described (e.g., in the
table entry showing `rotasParaMenuSecundário`); adjust any surrounding prose
that references the old union type and ensure examples/inline code snippets,
type annotations, and the table cell at the current declaration all use
`string[]` consistently.

170-181: ⚠️ Potential issue | 🟡 Minor

Não misture as duas estratégias de registro no mesmo exemplo.

Em Line 177-181, o exemplo adiciona meuModulo e ...meuModulo juntos. Isso confunde o consumo (objeto vs array) e é fácil copiar errado.

💡 Exemplo corrigido
-// import direto (objeto único)
-import meuModulo from './meu-modulo.js';
-
-// ou spread (array de rotas)
-import * as meuModulo from './meu-modulo.js';
+import meuModulo from './meu-modulo.js';

 const routes = [
   // ...outras rotas
-  meuModulo,          // import direto
-  ...meuModulo,       // spread
+  ...meuModulo, // se export default for array
+  // ou: meuModulo, // se export default for objeto único
 ];
#!/bin/bash
# Verifica como os módulos de rota são exportados e registrados no projeto.
rg -n --type=js -C2 "export default|export const" frontend/src/router
rg -n --type=js -C4 "const routes\\s*=\\s*\\[" frontend/src/router/index.js
rg -n --type=js -C2 "import .* from './.*\\.js'|import \\* as .* from './.*\\.js'" frontend/src/router/index.js
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@frontend/.claude/project-knowledge/route-creation.md` around lines 170 - 181,
The example incorrectly mixes two registration strategies by adding both
meuModulo and ...meuModulo into the same routes array; pick one approach that
matches how the route module is exported and update the import/registration
accordingly: if the route file exports a default route object (export default
...), import with "import meuModulo from './meu-modulo.js'" and register only
meuModulo in the routes array; if the route file exports an array (export const
routes = [...] or export default [...] as array), import with "import * as
meuModulo from './meu-modulo.js'" or adjust to "import { routes as meuModulo }
from './meu-modulo.js'" and register using "...meuModulo" (spread) only; ensure
the export shape in the route module matches the chosen import/registration so
routes is consistently an array of route objects.
frontend/src/components/MenuPaginacao.md (1)

68-73: ⚠️ Potential issue | 🟡 Minor

Use os tipos globais de estado no snippet da store.

Em Line 71-72, o exemplo ainda usa shape local ({ lista: boolean } e erro: null | unknown) e pode induzir implementação fora do padrão do projeto.

💡 Ajuste sugerido
 interface Estado {
   lista: Item[];
   paginacao: Paginacao;
-  chamadasPendentes: { lista: boolean };
-  erro: null | unknown;
+  chamadasPendentes: ChamadasPendentes;
+  erros: Erros;
 }

Based on learnings: In the SMAE frontend codebase, ChamadasPendentes and Erros are global types defined in frontend/src/types/global.d.ts and are available to all TypeScript files without importing.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@frontend/src/components/MenuPaginacao.md` around lines 68 - 73, O snippet da
store define interface Estado com shapes locais para chamadasPendentes e erro;
substitua essas definições pelo uso dos tipos globais do projeto: troque o tipo
de chamadasPendentes (`{ lista: boolean }`) por ChamadasPendentes e o tipo de
erro (`null | unknown`) por Erros para alinhar com os tipos globais definidos em
frontend/src/types/global.d.ts; procure pela interface Estado no arquivo e
atualize as propriedades chamadasPendentes e erro para usar ChamadasPendentes e
Erros respectivamente, sem adicionar imports.
frontend/.claude/project-knowledge/form-creation.md (1)

88-88: ⚠️ Potential issue | 🟡 Minor

Evite regra absoluta sobre <Form>; documente quando usar cada abordagem.

Em Line 88, a proibição total do <Form> pode conflitar com padrões já usados no projeto. Sugiro transformar em diretriz contextual (useForm como padrão preferencial, <Form> em casos específicos).

#!/bin/bash
# Levanta uso real de <Form> e useForm nas views para calibrar a diretriz documental.
rg -n '<Form\\b' frontend/src/views/ -g '*.vue'
rg -n 'useForm\\(' frontend/src/views/ -g '*.vue'
rg -n "import\\s*\\{[^}]*Form[^}]*\\}\\s*from\\s*['\"]vee-validate['\"]" frontend/src -g '*.{ts,js,vue}'
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@frontend/.claude/project-knowledge/form-creation.md` at line 88, Change the
absolute prohibition on the vee-validate <Form> wrapper to a contextual
guideline: state that useForm is the preferred default, but allow using <Form>
in documented, specific scenarios (e.g., very simple forms, when template-only
composition is required, or when migrating legacy components). Update the
sentence around the existing `<Form>` and `useForm` mentions to recommend
`useForm` as default and add a short bullet or note explaining the acceptable
exceptions and examples where `<Form>` is appropriate; also include the
suggested ripgrep commands to verify current usage in the repo for calibrating
the guidance.
🧹 Nitpick comments (2)
frontend/.claude/project-knowledge/store-creation.md (2)

148-159: Consider documenting watchEffect trade-offs.

The watchEffect pattern automatically tracks all reactive dependencies, which is convenient but may cause unnecessary re-fetches if route.query contains unrelated parameters. Based on learnings, FiltroParaPagina updates route.query only on form submission, but other components might update query params more frequently.

The rule at lines 250-257 prescribes watchEffect for pagination scenarios but doesn't explain the rationale or trade-offs. Consider adding a note about when the automatic tracking is beneficial versus when explicit watch with a dependency array is more appropriate.

Based on learnings: FiltroParaPagina updates route.query only on form submission; consequentemente, watchers sobre esses parâmetros disparam apenas por submissão, não por digitação.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@frontend/.claude/project-knowledge/store-creation.md` around lines 148 - 159,
Add a short note near the existing rule that recommends `watchEffect` for simple
pagination use-cases but documents its trade-offs: explain that `watchEffect`
(used with `useRoute`/`route.query` and `store.buscarTudo`) auto-tracks all
reactive accesses and can cause extra re-fetches if unrelated query params
change, and recommend using an explicit `watch` with a dependency list when you
only care about specific keys; mention the observed behavior of
`FiltroParaPagina` (it updates `route.query` only on form submit) as an example
where `watchEffect` is safe.

250-257: Justify the watchEffect rule for pagination scenarios.

This rule prescribes watchEffect for pagination cases, but doesn't explain the reasoning. Given the unresolved discussion at line 148 about potential unnecessary re-runs, consider adding:

  1. Why watchEffect is preferred for pagination (e.g., MenuPaginacao parameters change together, tracking all simplifies code)
  2. Trade-offs: automatic tracking may cause extra fetches if unrelated query params exist
  3. When to reconsider: if performance profiling shows excessive re-fetches

The prohibition on mixing watch and watchEffect for the same buscarTudo is good for consistency.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@frontend/.claude/project-knowledge/store-creation.md` around lines 250 - 257,
Update the "Regra watch vs watchEffect" section to justify using watchEffect for
pagination by explaining that MenuPaginacao parameters (page, pageSize, sort,
filters) tend to change together so automatic dependency tracking with
watchEffect simplifies the code and ensures buscarTudo runs when any
pagination-related param changes; add trade-offs noting watchEffect can cause
extra fetches if unrelated route.query params exist and recommend scoping or
using explicit watch when profiling shows excessive re-fetches; finally add a
short guideline for when to reconsider (profile first, switch to explicit watch
on a curated array of route.query fields or debounce fetches) and keep the
prohibition on mixing watch and watchEffect for the same buscarTudo for
consistency.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@frontend/.claude/project-knowledge/list-creation.md`:
- Around line 290-294: Update the example links in the table so they use correct
relative paths from frontend/.claude/project-knowledge/ by prefixing the shown
file paths with the appropriate ../ segments (e.g., change
"src/views/projetos.etiquetas/EtiquetasLista.vue" to
"../../src/views/projetos.etiquetas/EtiquetasLista.vue"); apply the same ../../
prefix to the other entries listed (AreasTematicasLista.vue, AditivosLista.vue,
TransferenciasVoluntariasLista.vue, AcompanhamentosLista.vue) so the links
resolve correctly in the preview.

In `@frontend/.claude/skills/novo-formulario.md`:
- Line 135: Clarify the store filename convention in novo-formulario.md: replace
or augment the reference to src/stores/<modulo>.store.ts with the consistent
convention used in store-creation.md (src/stores/<entidade>.store.ts), explain
the difference between "Módulo/pasta" and "Nome da store" and state explicitly
when to use <entidade> vs <modulo> (e.g., use <entidade> when the store maps to
a domain entity and <modulo> only when the entire module contains a single store
that should be named after the module), and update the example line to use
<entidade>.store.ts for consistency.

---

Duplicate comments:
In `@frontend/.claude/project-knowledge/form-creation.md`:
- Line 88: Change the absolute prohibition on the vee-validate <Form> wrapper to
a contextual guideline: state that useForm is the preferred default, but allow
using <Form> in documented, specific scenarios (e.g., very simple forms, when
template-only composition is required, or when migrating legacy components).
Update the sentence around the existing `<Form>` and `useForm` mentions to
recommend `useForm` as default and add a short bullet or note explaining the
acceptable exceptions and examples where `<Form>` is appropriate; also include
the suggested ripgrep commands to verify current usage in the repo for
calibrating the guidance.

In `@frontend/.claude/project-knowledge/route-creation.md`:
- Line 115: Update the documented type for rotasParaMenuSecundário from
"string[] | Function" to the revised standard "string[]" wherever it's declared
or described (e.g., in the table entry showing `rotasParaMenuSecundário`);
adjust any surrounding prose that references the old union type and ensure
examples/inline code snippets, type annotations, and the table cell at the
current declaration all use `string[]` consistently.
- Around line 170-181: The example incorrectly mixes two registration strategies
by adding both meuModulo and ...meuModulo into the same routes array; pick one
approach that matches how the route module is exported and update the
import/registration accordingly: if the route file exports a default route
object (export default ...), import with "import meuModulo from
'./meu-modulo.js'" and register only meuModulo in the routes array; if the route
file exports an array (export const routes = [...] or export default [...] as
array), import with "import * as meuModulo from './meu-modulo.js'" or adjust to
"import { routes as meuModulo } from './meu-modulo.js'" and register using
"...meuModulo" (spread) only; ensure the export shape in the route module
matches the chosen import/registration so routes is consistently an array of
route objects.

In `@frontend/src/components/MenuPaginacao.md`:
- Around line 68-73: O snippet da store define interface Estado com shapes
locais para chamadasPendentes e erro; substitua essas definições pelo uso dos
tipos globais do projeto: troque o tipo de chamadasPendentes (`{ lista: boolean
}`) por ChamadasPendentes e o tipo de erro (`null | unknown`) por Erros para
alinhar com os tipos globais definidos em frontend/src/types/global.d.ts;
procure pela interface Estado no arquivo e atualize as propriedades
chamadasPendentes e erro para usar ChamadasPendentes e Erros respectivamente,
sem adicionar imports.

---

Nitpick comments:
In `@frontend/.claude/project-knowledge/store-creation.md`:
- Around line 148-159: Add a short note near the existing rule that recommends
`watchEffect` for simple pagination use-cases but documents its trade-offs:
explain that `watchEffect` (used with `useRoute`/`route.query` and
`store.buscarTudo`) auto-tracks all reactive accesses and can cause extra
re-fetches if unrelated query params change, and recommend using an explicit
`watch` with a dependency list when you only care about specific keys; mention
the observed behavior of `FiltroParaPagina` (it updates `route.query` only on
form submit) as an example where `watchEffect` is safe.
- Around line 250-257: Update the "Regra watch vs watchEffect" section to
justify using watchEffect for pagination by explaining that MenuPaginacao
parameters (page, pageSize, sort, filters) tend to change together so automatic
dependency tracking with watchEffect simplifies the code and ensures buscarTudo
runs when any pagination-related param changes; add trade-offs noting
watchEffect can cause extra fetches if unrelated route.query params exist and
recommend scoping or using explicit watch when profiling shows excessive
re-fetches; finally add a short guideline for when to reconsider (profile first,
switch to explicit watch on a curated array of route.query fields or debounce
fetches) and keep the prohibition on mixing watch and watchEffect for the same
buscarTudo for consistency.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 0aab46db-eae1-4087-969b-888202a410fc

📥 Commits

Reviewing files that changed from the base of the PR and between 1539c6d and 2c0fa9e.

📒 Files selected for processing (13)
  • .gitignore
  • frontend/.claude/project-knowledge/form-creation.md
  • frontend/.claude/project-knowledge/list-creation.md
  • frontend/.claude/project-knowledge/route-creation.md
  • frontend/.claude/project-knowledge/store-creation.md
  • frontend/.claude/skills/nova-lista.md
  • frontend/.claude/skills/nova-rota.md
  • frontend/.claude/skills/nova-store.md
  • frontend/.claude/skills/novo-formulario.md
  • frontend/CLAUDE.md
  • frontend/src/components/MenuPaginacao.md
  • frontend/src/components/SmaeTable/README.md
  • frontend/src/types/global.d.ts
✅ Files skipped from review due to trivial changes (2)
  • frontend/src/types/global.d.ts
  • frontend/src/components/SmaeTable/README.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • .gitignore

Comment on lines +290 to +294
| [EtiquetasLista.vue](src/views/projetos.etiquetas/EtiquetasLista.vue) | SmaeTable mínimo, rotaEditar condicional por `pode_editar` |
| [AreasTematicasLista.vue](src/views/areasTematicas/AreasTematicasLista.vue) | SmaeTable com slots de célula customizados, LoadingComponent separado |
| [AditivosLista.vue](src/views/tipoDeAditivo/AditivosLista.vue) | SmaeTable + FiltroParaPagina com busca client-side via `filtrarObjetos` |
| [TransferenciasVoluntariasLista.vue](src/views/transferenciasVoluntarias/TransferenciasVoluntariasLista.vue) | Filtros na URL, paginação "carregar mais" (ainda usa tabela manual) |
| [AcompanhamentosLista.vue](src/views/mdo.acompanhamentos/AcompanhamentosLista.vue) | Ordenação com URL query params (ainda usa tabela manual) |
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Ajuste os caminhos dos links de exemplos para caminho relativo correto.

Em Line 290-294, os links estão como src/views/..., mas este arquivo está em frontend/.claude/project-knowledge/; isso tende a quebrar os links no preview.

💡 Ajuste sugerido
-| [EtiquetasLista.vue](src/views/projetos.etiquetas/EtiquetasLista.vue) ...
+| [EtiquetasLista.vue](../../src/views/projetos.etiquetas/EtiquetasLista.vue) ...

(Aplicar o mesmo prefixo ../../ para os demais links da tabela.)

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
| [EtiquetasLista.vue](src/views/projetos.etiquetas/EtiquetasLista.vue) | SmaeTable mínimo, rotaEditar condicional por `pode_editar` |
| [AreasTematicasLista.vue](src/views/areasTematicas/AreasTematicasLista.vue) | SmaeTable com slots de célula customizados, LoadingComponent separado |
| [AditivosLista.vue](src/views/tipoDeAditivo/AditivosLista.vue) | SmaeTable + FiltroParaPagina com busca client-side via `filtrarObjetos` |
| [TransferenciasVoluntariasLista.vue](src/views/transferenciasVoluntarias/TransferenciasVoluntariasLista.vue) | Filtros na URL, paginação "carregar mais" (ainda usa tabela manual) |
| [AcompanhamentosLista.vue](src/views/mdo.acompanhamentos/AcompanhamentosLista.vue) | Ordenação com URL query params (ainda usa tabela manual) |
| [EtiquetasLista.vue](../../src/views/projetos.etiquetas/EtiquetasLista.vue) | SmaeTable mínimo, rotaEditar condicional por `pode_editar` |
| [AreasTematicasLista.vue](../../src/views/areasTematicas/AreasTematicasLista.vue) | SmaeTable com slots de célula customizados, LoadingComponent separado |
| [AditivosLista.vue](../../src/views/tipoDeAditivo/AditivosLista.vue) | SmaeTable + FiltroParaPagina com busca client-side via `filtrarObjetos` |
| [TransferenciasVoluntariasLista.vue](../../src/views/transferenciasVoluntarias/TransferenciasVoluntariasLista.vue) | Filtros na URL, paginação "carregar mais" (ainda usa tabela manual) |
| [AcompanhamentosLista.vue](../../src/views/mdo.acompanhamentos/AcompanhamentosLista.vue) | Ordenação com URL query params (ainda usa tabela manual) |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@frontend/.claude/project-knowledge/list-creation.md` around lines 290 - 294,
Update the example links in the table so they use correct relative paths from
frontend/.claude/project-knowledge/ by prefixing the shown file paths with the
appropriate ../ segments (e.g., change
"src/views/projetos.etiquetas/EtiquetasLista.vue" to
"../../src/views/projetos.etiquetas/EtiquetasLista.vue"); apply the same ../../
prefix to the other entries listed (AreasTematicasLista.vue, AditivosLista.vue,
TransferenciasVoluntariasLista.vue, AcompanhamentosLista.vue) so the links
resolve correctly in the preview.

Depois de coletar as informações, crie os seguintes arquivos seguindo os padrões acima e dos documentos lidos:

1. `src/consts/formSchemas/<entidade>.ts`
2. `src/stores/<modulo>.store.ts`
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot Mar 20, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Clarify store filename convention.

Line 135 specifies the store file as src/stores/<modulo>.store.ts, but:

  • Line 24 asks for "Nome da store" separately from "Módulo/pasta"
  • The store-creation.md guide specifies src/stores/<entidade>.store.ts

Is the store filename based on the entity name or module name? If they can differ, please clarify when to use which. Consider updating this line to <entidade>.store.ts for consistency with the store creation guide.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@frontend/.claude/skills/novo-formulario.md` at line 135, Clarify the store
filename convention in novo-formulario.md: replace or augment the reference to
src/stores/<modulo>.store.ts with the consistent convention used in
store-creation.md (src/stores/<entidade>.store.ts), explain the difference
between "Módulo/pasta" and "Nome da store" and state explicitly when to use
<entidade> vs <modulo> (e.g., use <entidade> when the store maps to a domain
entity and <modulo> only when the entire module contains a single store that
should be named after the module), and update the example line to use
<entidade>.store.ts for consistency.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ele tem razão, @GustavoFSoares . Usamos a palavra "módulo" para os itens no menu inicial.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems like the humans are having a chat. I'll hop back into my burrow for now. If you need me again, just tag @coderabbitai in a new comment, and I'll come hopping out!

Depois de coletar as informações, crie os seguintes arquivos seguindo os padrões acima e dos documentos lidos:

1. `src/consts/formSchemas/<entidade>.ts`
2. `src/stores/<modulo>.store.ts`
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ele tem razão, @GustavoFSoares . Usamos a palavra "módulo" para os itens no menu inicial.


Antes de começar, leia o seguinte arquivo de conhecimento do projeto:

- `.claude/project-knowledge/store-creation.md` — padrão de store Pinia (estado, actions, paginação, watch vs watchEffect)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Como você quer excluir a pasta .claude do GIT, @GustavoFSoares ?

3. **A store precisa de paginação?** (MenuPaginacao)
4. **Quais actions são necessárias?** (buscarTudo, buscarItem, salvarItem, excluirItem — ou subconjunto)
5. **Algum getter específico além de `itensPorId`?**
6. **A store pertence a uma entidade mãe específica?** Algumas stores usam `route.meta.entidadeMãe` para selecionar o endpoint correto e recebem um sufixo no nome do arquivo. Os valores aceitos são:
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Não é só para selecionar o endpoint correto, mas para evitar colisões, @GustavoFSoares .

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

E não é que a entidade é o prefixo. Ela deveria receber qualquer prefixo, mas a entidade é um bom candidato.

5. **Operações disponíveis**: listar, criar, editar, detalhar?
6. **Precisa de menu lateral?** Se sim, o módulo tem ícone SVG?
7. **entidadeMãe** (contexto do módulo: `pdm`, `projeto`, `mdo`, `planoSetorial`)
8. **O módulo já existe em `src/router/index.js`?** Se não, precisamos registrá-lo lá também.
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Módulo é outra coisa! A gente pode ter arquivos para projetos e portfólios. Ambos são do mesmo módulo.


```typescript
export const useMinhaEntidadeStore = (
entidadeMae: ModuloSistema.MDO | ModuloSistema.Projetos,
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A gente chama de "prefixo", não? Como eu disse, a entidade mãe não é necessariamente o prefixo.

},
```

No componente de lista, usar `watchEffect` (rastreia automaticamente todos os `route.query` acessados dentro de `buscarTudo`):
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Depende. Pode ser que altere um parâmetro que é usado por outra parte da tela, não aquela. E aí, vai recarregar o que não deve.

erro: null | unknown;
}

export const useMinhaEntidadeStore = defineStore('minhaEntidade', {
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mas o código pode estar pronto para receber. Se não vier, não prefixa.

Comment on lines +170 to +181
```js
// import direto (objeto único)
import meuModulo from './meu-modulo.js';

// ou spread (array de rotas)
import * as meuModulo from './meu-modulo.js';

const routes = [
// ...outras rotas
meuModulo, // import direto
...meuModulo, // spread
];
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isso ficou mesmo confuso, @GustavoFSoares .

| `rotaDeEscape` | `string` | Nome da rota para onde ir ao cancelar/voltar |
| `rotasParaMigalhasDePão` | `string[]` | Nomes de rotas que formam o breadcrumb |
| `rotasParaMenuPrincipal` | `string[]` | Nomes de rotas exibidas no menu lateral principal |
| `rotasParaMenuSecundário` | `string[] \| Function` | Nomes de rotas exibidas no menu secundário |
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bom ponto, @GustavoFSoares .

</template>
```

> **Atenção:** O padrão com `<Form>` wrapper do vee-validate **não deve ser usado** neste projeto. Sempre use o padrão com `useForm` acima, independentemente da complexidade do formulário.
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bom ponto. Você pode deixar claro que o uso de <Form> é obsoleto no projeto, que se deve migrar quando possível.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants