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

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions ARCH.generated.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ Números atuais das zonas, do quality gate e do `package.json`:

| Zona | O que é | Tamanho medido | Regra |
|---|---|---|---|
| `public/` | o **jogo** | 59 arquivos `.js`, 41.159 linhas · Three.js `r160` vendorizado | ES modules servidos crus, **zero build**, sem dependência de runtime |
| `public/` | o **jogo** | 59 arquivos `.js`, 41.555 linhas · Three.js `r160` vendorizado | ES modules servidos crus, **zero build**, sem dependência de runtime |
| `src/` | o **site** | 18 páginas `.astro`, 21 rotas `/api` · Astro `^7.1.1` | framework é bem-vindo; `service_role` só no servidor |
| `tools/` | o **arnês** | 300 scripts em `tools/eval/`, 77 em `tools/` | node puro: sobe o jogo real sem browser |
| `tools/` | o **arnês** | 301 scripts em `tools/eval/`, 77 em `tools/` | node puro: sobe o jogo real sem browser |

**Não existe `public/index.html`.** O HTML do jogo é `src/pages/index.astro`, servido na rota `/`. Servir `public/` estaticamente entrega os arnêses visuais, **não o jogo** — é a pegadinha que custa a primeira hora de todo mundo.

Expand All @@ -25,10 +25,10 @@ Comandos e scripts atuais do quality gate:
<!-- BEGIN:GERADO:scripts — não edite à mão, rode `npm run docs` -->

```bash
npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:ambience-registry eval:parquewheel eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:backendhints changelog:check eval:velhooeste eval:penitenciaria eval:charhard eval:charpbr eval:motoca-visual eval:camera-grip eval:pilot-system eval:pilot-grip eval:char-thumbnail eval:asset-integrity eval:gltf-validator eval:props-acervo eval:propsuv1 eval:character-voice eval:audio-pack-character-voice eval:cinematic-ui eval:grafite-editorial eval:map-source eval:map-new eval:campo-contract eval:lajes-rooftop eval:lajes-visual eval:lajes-authored eval:lajes-spatial eval:lajes-gap eval:lajes-circuito eval:lajes-antitrap eval:mansao-water eval:mansao-garden eval:corrego-contract eval:corrego-water eval:look eval:mansao-ocean eval:wind eval:softparticles eval:escala-favela eval:escadao-contract eval:slice-abilities eval:faction-registry eval:mapview eval:devport spec:check skills:check eval:pickuparma eval:mutcega eval:autofix eval:deploygate eval:portaointeiro eval:wfsecret eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam
npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:ambience-registry eval:parquewheel eval:parquevida eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:backendhints changelog:check eval:velhooeste eval:penitenciaria eval:charhard eval:charpbr eval:motoca-visual eval:camera-grip eval:pilot-system eval:pilot-grip eval:char-thumbnail eval:asset-integrity eval:gltf-validator eval:props-acervo eval:propsuv1 eval:character-voice eval:audio-pack-character-voice eval:cinematic-ui eval:grafite-editorial eval:map-source eval:map-new eval:campo-contract eval:lajes-rooftop eval:lajes-visual eval:lajes-authored eval:lajes-spatial eval:lajes-gap eval:lajes-circuito eval:lajes-antitrap eval:mansao-water eval:mansao-garden eval:corrego-contract eval:corrego-water eval:look eval:mansao-ocean eval:wind eval:softparticles eval:escala-favela eval:escadao-contract eval:slice-abilities eval:faction-registry eval:mapview eval:devport spec:check skills:check eval:pickuparma eval:mutcega eval:autofix eval:deploygate eval:portaointeiro eval:wfsecret eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam
```

`package.json` tem **186 scripts**; o motivo de cada um mora em `SCRIPTS.md` (migrado das chaves `//nome` em 18/08/2026) — é onde está o porquê.
`package.json` tem **187 scripts**; o motivo de cada um mora em `SCRIPTS.md` (migrado das chaves `//nome` em 18/08/2026) — é onde está o porquê.

> Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `node -p "Object.keys(require('./package.json').scripts)"`

Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,17 +34,17 @@ contra bots, direto na aba. Sem download, sem instalação, sem cadastro.

| O que | Quanto | Onde confere |
|---|---:|---|
| Código do jogo | 41.159 linhas em 59 arquivos | `git ls-files public/js/*.js \| xargs wc -l` |
| Código do jogo | 41.555 linhas em 59 arquivos | `git ls-files public/js/*.js \| xargs wc -l` |
| `game.js` | **7.260** linhas | `wc -l public/js/game.js` |
| `main.js` | 2.812 linhas | `wc -l public/js/main.js` |
| Armas com GLB | 27 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` |
| GLBs de personagem | 63 | `git ls-files 'public/models/characters/*.glb' \| wc -l` |
| Props em GLB | 151 | `git ls-files 'public/models/props/*.glb' \| wc -l` |
| Props em GLB | 158 | `git ls-files 'public/models/props/*.glb' \| wc -l` |
| Clipes de animação versionados | 681 | `git ls-files public/models/anims \| wc -l` |
| Personagens jogáveis | 62, em 10 facções | array `CHARACTERS` de `characters.js` |
| Mapas no registro | 17 | objeto `MAPS` de `maps.js` |
| Arnêses visuais em HTML | 16 | `git ls-files 'public/*.html' \| wc -l` |
| Scripts do arnês | 300 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` |
| Scripts do arnês | 301 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` |
| Scripts de pipeline | 77 | `git ls-files 'tools/*.mjs' \| wc -l` |
| Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` |
| Versão | `2.0.0-alpha.184` | `public/js/version.js` e `package.json` (batem) |
Expand Down Expand Up @@ -320,7 +320,7 @@ Os mapas registrados, e em que modo cada um abre:
| `upa_24h` | UPA 24h da Treta | **captura** | `map_upa.js` | 302 |
| `obras_prefeitura` | Obras da Prefeitura | **captura** | `map_obras.js` | 257 |
| `atacadao_treta` | Atacadão da Treta | **captura** | `map_atacadao.js` | 276 |
| `parque_treta` | Parque da Treta | **captura** | `map_parque.js` | 426 |
| `parque_treta` | Parque da Treta | **captura** | `map_parque.js` | 810 |
| `velho_oeste` | Velho Oeste da Treta | **captura** | `map_velho_oeste.js` | 449 |
| `penitenciaria` | Penitenciária da Treta | **captura** | `map_penitenciaria.js` | 264 |

Expand Down
8 changes: 8 additions & 0 deletions SCRIPTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,14 @@ A roda-gigante gira em torno do cubo; assentos não invadem lateral, base nem ar
npm run eval:parquewheel
```

## `eval:parquevida`

O Parque da Treta não pode parecer low poly (frente USANTOS, dono 25/08/2026: "os mapas do usantos são os mais low poly do jogo"). PV1 mobiliário nomeado (coreto, ≥6 lixeiras, ≥6 bancos, trilho + ≥100 dormentes), PV2 vegetação instanciada (≥40 árvores, ≥60 arbustos), PV3 ≥16 texturas de canvas distintas em uso, PV4 nenhum quadrante 4×4 deserto de cobertura, PV5 horizonte próprio (skyUrl + LOOK.parque_treta). Mutantes: sem-coreto|sem-vegetacao|sem-variedade.

```bash
npm run eval:parquevida
```

## `eval:velhooeste`

O mapa Velho Oeste preserva marcos, janelas de madeira abertas/fechadas, gênero, perigo e recompensas dos cartazes, retratos, densidade, colisões, spawns e rota. Mutantes: sem-saloon|sem-carrocas|sem-tumbleweed|sem-obstaculos-centrais|centro-aberto|sem-cartazes|sem-retratos|cartaz-sobre-janela|genero-unico|janela-verde|todas-fechadas|perigoso-unico|recompensa-repetida|sem-colisao-varanda|sem-colisao-movel|parada|texturas-genericas.
Expand Down
4 changes: 2 additions & 2 deletions STATUS.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

- **Versão:** `2.0.0-alpha.184`
- **Conteúdo jogável:** 10 facções, 62 personagens, 17 mapas e 27 armas com GLB
- **Código do jogo:** 41.159 linhas em 59 módulos JavaScript
- **Automação:** 186 comandos npm, 300 scripts de avaliação e 77 scripts de pipeline
- **Código do jogo:** 41.555 linhas em 59 módulos JavaScript
- **Automação:** 187 comandos npm, 301 scripts de avaliação e 77 scripts de pipeline

> Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `package.json · CHARACTERS · MAPS · public/models/weapons · public/js · tools/`

Expand Down
2 changes: 1 addition & 1 deletion docs/docs/arquitetura.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ Tamanho dos arquivos que o `gen-arch.mjs` indexa — bloco gerado, regenerado po
| `public/js/weapons.js` | 356 |
| `public/js/springs.js` | 260 |

Total de `public/js/`: **41.159 linhas em 59 arquivos**. O índice símbolo→linha, com a tabela de conflito, é outro bloco gerado: `tools/eval/ARCH.md` (`npm run arch`).
Total de `public/js/`: **41.555 linhas em 59 arquivos**. O índice símbolo→linha, com a tabela de conflito, é outro bloco gerado: `tools/eval/ARCH.md` (`npm run arch`).

> Bloco gerado por `node tools/gen-docs.mjs`. Fonte: ``git ls-files public/js/*.js | xargs wc -l``

Expand Down
4 changes: 2 additions & 2 deletions docs/docs/colaborar.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ O número abaixo não é retórica, e não é escrito à mão: sai de `git short

{/* BEGIN:GERADO:pessoas — não edite à mão, rode `npm run docs` */}

**11 identidades de autoria humana** assinam commit no histórico **desta branch**: `ruben-cytonic`, `Ruben Marcus`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`. O resto dos commits é assinado por agentes de IA. Branch não é repositório: quem contribuiu num ramo que esta branch não contém **não aparece aqui**.
**11 identidades de autoria humana** assinam commit no histórico **desta branch**: `ruben-cytonic`, `Ruben Marcus`, `Ruben`, `rubenmarcus`, `Emerson Garrido`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`. O resto dos commits é assinado por agentes de IA. Branch não é repositório: quem contribuiu num ramo que esta branch não contém **não aparece aqui**.

> Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `git shortlog -sn --no-merges (descontando autores que são agentes)`

Expand Down Expand Up @@ -262,7 +262,7 @@ O registro, gerado do `MAPS` de `public/js/maps.js`:
| `upa_24h` | UPA 24h da Treta | **captura** | `map_upa.js` | 302 |
| `obras_prefeitura` | Obras da Prefeitura | **captura** | `map_obras.js` | 257 |
| `atacadao_treta` | Atacadão da Treta | **captura** | `map_atacadao.js` | 276 |
| `parque_treta` | Parque da Treta | **captura** | `map_parque.js` | 426 |
| `parque_treta` | Parque da Treta | **captura** | `map_parque.js` | 810 |
| `velho_oeste` | Velho Oeste da Treta | **captura** | `map_velho_oeste.js` | 449 |
| `penitenciaria` | Penitenciária da Treta | **captura** | `map_penitenciaria.js` | 264 |

Expand Down
12 changes: 6 additions & 6 deletions docs/docs/comecando.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,17 +39,17 @@ esta página envelhecia no primeiro commit — ver

| O que | Quanto | Onde confere |
|---|---:|---|
| Código do jogo | 41.159 linhas em 59 arquivos | `git ls-files public/js/*.js \| xargs wc -l` |
| Código do jogo | 41.555 linhas em 59 arquivos | `git ls-files public/js/*.js \| xargs wc -l` |
| `game.js` | **7.260** linhas | `wc -l public/js/game.js` |
| `main.js` | 2.812 linhas | `wc -l public/js/main.js` |
| Armas com GLB | 27 | `git ls-files 'public/models/weapons/*.glb' \| wc -l` |
| GLBs de personagem | 63 | `git ls-files 'public/models/characters/*.glb' \| wc -l` |
| Props em GLB | 151 | `git ls-files 'public/models/props/*.glb' \| wc -l` |
| Props em GLB | 158 | `git ls-files 'public/models/props/*.glb' \| wc -l` |
| Clipes de animação versionados | 681 | `git ls-files public/models/anims \| wc -l` |
| Personagens jogáveis | 62, em 10 facções | array `CHARACTERS` de `characters.js` |
| Mapas no registro | 17 | objeto `MAPS` de `maps.js` |
| Arnêses visuais em HTML | 16 | `git ls-files 'public/*.html' \| wc -l` |
| Scripts do arnês | 300 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` |
| Scripts do arnês | 301 | `git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l` |
| Scripts de pipeline | 77 | `git ls-files 'tools/*.mjs' \| wc -l` |
| Tarefas de entrada escritas | 26 | `git ls-files 'docs/issues/[0-9]*.md' \| wc -l` |
| Versão | `2.0.0-alpha.184` | `public/js/version.js` e `package.json` (batem) |
Expand Down Expand Up @@ -235,7 +235,7 @@ Os mapas registrados hoje, e em que modo cada um abre:
| `upa_24h` | UPA 24h da Treta | **captura** | `map_upa.js` | 302 |
| `obras_prefeitura` | Obras da Prefeitura | **captura** | `map_obras.js` | 257 |
| `atacadao_treta` | Atacadão da Treta | **captura** | `map_atacadao.js` | 276 |
| `parque_treta` | Parque da Treta | **captura** | `map_parque.js` | 426 |
| `parque_treta` | Parque da Treta | **captura** | `map_parque.js` | 810 |
| `velho_oeste` | Velho Oeste da Treta | **captura** | `map_velho_oeste.js` | 449 |
| `penitenciaria` | Penitenciária da Treta | **captura** | `map_penitenciaria.js` | 264 |

Expand Down Expand Up @@ -280,10 +280,10 @@ E os dois quality gates, com a lista exata do que cada um roda — direto do `pa
{/* BEGIN:GERADO:scripts — não edite à mão, rode `npm run docs` */}

```bash
npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:ambience-registry eval:parquewheel eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:backendhints changelog:check eval:velhooeste eval:penitenciaria eval:charhard eval:charpbr eval:motoca-visual eval:camera-grip eval:pilot-system eval:pilot-grip eval:char-thumbnail eval:asset-integrity eval:gltf-validator eval:props-acervo eval:propsuv1 eval:character-voice eval:audio-pack-character-voice eval:cinematic-ui eval:grafite-editorial eval:map-source eval:map-new eval:campo-contract eval:lajes-rooftop eval:lajes-visual eval:lajes-authored eval:lajes-spatial eval:lajes-gap eval:lajes-circuito eval:lajes-antitrap eval:mansao-water eval:mansao-garden eval:corrego-contract eval:corrego-water eval:look eval:mansao-ocean eval:wind eval:softparticles eval:escala-favela eval:escadao-contract eval:slice-abilities eval:faction-registry eval:mapview eval:devport spec:check skills:check eval:pickuparma eval:mutcega eval:autofix eval:deploygate eval:portaointeiro eval:wfsecret eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam
npm run check:fast # node tools/eval/runner.mjs syntax eval:release eval:telemetry eval:identity eval:error-console eval:error-origin eval:webgl eval:webglguard eval:maprotate eval:shaderlog eval:shaderbudget eval:botbrain eval:prune eval:vminspect eval:faccao eval:mapid eval:mapjson eval:mapcontrato eval:ambience-registry eval:parquewheel eval:parquevida eval:redesign eval:matchoptions eval:charvoice eval:screenquery docs:check arch:check audio:check feet:check eval:vmlabhud eval:ctfhud eval:pause eval:ctfround eval:ctfwin eval:spawn eval:regen eval:pegada eval:dmgdir eval:ctflabels anims:check anims:merge:check walls:check media:check menuwalls:check travessao:check eval:medianet eval:posters eval:grafitelayout eval:simclock eval:backendhints changelog:check eval:velhooeste eval:penitenciaria eval:charhard eval:charpbr eval:motoca-visual eval:camera-grip eval:pilot-system eval:pilot-grip eval:char-thumbnail eval:asset-integrity eval:gltf-validator eval:props-acervo eval:propsuv1 eval:character-voice eval:audio-pack-character-voice eval:cinematic-ui eval:grafite-editorial eval:map-source eval:map-new eval:campo-contract eval:lajes-rooftop eval:lajes-visual eval:lajes-authored eval:lajes-spatial eval:lajes-gap eval:lajes-circuito eval:lajes-antitrap eval:mansao-water eval:mansao-garden eval:corrego-contract eval:corrego-water eval:look eval:mansao-ocean eval:wind eval:softparticles eval:escala-favela eval:escadao-contract eval:slice-abilities eval:faction-registry eval:mapview eval:devport spec:check skills:check eval:pickuparma eval:mutcega eval:autofix eval:deploygate eval:portaointeiro eval:wfsecret eval:comentario eval:fixture eval:preload eval:docsautoria eval:replaycam
```

`package.json` tem **186 scripts**; o motivo de cada um mora em `SCRIPTS.md` (migrado das chaves `//nome` em 18/08/2026) — é onde está o porquê.
`package.json` tem **187 scripts**; o motivo de cada um mora em `SCRIPTS.md` (migrado das chaves `//nome` em 18/08/2026) — é onde está o porquê.

> Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `node -p "Object.keys(require('./package.json').scripts)"`

Expand Down
2 changes: 1 addition & 1 deletion docs/docs/quality-gates.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ PR (`.github/workflows/ci.yml`).
{/* BEGIN:GERADO:invariantes — não edite à mão, rode `npm run docs` */}

- `tools/eval/invariants.mjs`: **2.281 linhas**, **65 identificadores de invariante declarados** (`put()`), dos quais **28** têm caminho de `skip()` declarado.
- O arnês inteiro são **300 scripts** em `tools/eval/` (`.mjs` + `.py`), mais **77 scripts** de pipeline em `tools/`.
- O arnês inteiro são **301 scripts** em `tools/eval/` (`.mjs` + `.py`), mais **77 scripts** de pipeline em `tools/`.
- Quantas invariantes rodam como **críticas** numa execução **não é derivável do fonte**: depende de qual insumo existe na máquina (o JSON do auditor de viewmodel, um GLB, uma pasta de anims). Esse número só sai rodando o quality gate — e o lugar dele é o cabeçalho do `KNOWN-BUGS.md`, atualizado com saída real.

Reproduza:
Expand Down
2 changes: 1 addition & 1 deletion docs/docs/stack.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ hipotético:
| **Meshy** | props 3D por texto (alternativa) e rig | `tools/gen-asset.mjs --provider meshy` | `MESHY_API_KEY` |
| **OpenRouter** | arte 2D (cartaz de facção, wallpaper, splash) | `tools/gen-image.mjs` | `OPENROUTER_API_KEY` |

`mint-assets.json` registra **65 assets** gerados via Mint (19 `openrouter-image-concept` · 2 `openrouter-concept-tripo-blender-model` · 5 `imagegen-concept` · 30 `mint-model` · 2 `tripo3d-task` · 2 `openrouter-concept-meshy-model` · 5 `mint-asset-pack`), cada um com `assetId`, `chatUrl` e notas do que deu errado na tentativa anterior.
`mint-assets.json` registra **72 assets** gerados via Mint (19 `openrouter-image-concept` · 2 `openrouter-concept-tripo-blender-model` · 5 `imagegen-concept` · 37 `mint-model` · 2 `tripo3d-task` · 2 `openrouter-concept-meshy-model` · 5 `mint-asset-pack`), cada um com `assetId`, `chatUrl` e notas do que deu errado na tentativa anterior.

As três chaves de API vivem em `.env` na raiz — **gitignored, modo 600, nunca em `argv`** (argv vaza no `ps` de qualquer processo da máquina). Sem elas o jogo roda igual: o pipeline de geração é offline, o resultado é que entra no repositório.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ Size of the files `gen-arch.mjs` indexes — a generated block, regenerated by
| `public/js/weapons.js` | 356 |
| `public/js/springs.js` | 260 |

Total in `public/js/`: **41,159 lines in 59 files**. The symbol-to-line index lives in `tools/eval/ARCH.md`.
Total in `public/js/`: **41,555 lines in 59 files**. The symbol-to-line index lives in `tools/eval/ARCH.md`.

> Block generated by `node tools/gen-docs.mjs`. Source: ``wc -l public/js/*.js``

Expand Down
Loading
Loading