{"_id":"@alemdocodigo/web-local","_rev":"3-02aeb2625392eff12eba5e2fa6e5947f","name":"@alemdocodigo/web-local","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"@alemdocodigo/web-local","version":"0.1.0","license":"MIT","_id":"@alemdocodigo/web-local@0.1.0","maintainers":[{"name":"alemdocodigo","email":"geral@alemdocodigo.pt"}],"homepage":"https://github.com/Alem-do-Codigo/web-local#readme","bugs":{"url":"https://github.com/Alem-do-Codigo/web-local/issues"},"bin":{"web-local":"bin/web-local.js"},"dist":{"shasum":"6c4918c18f4c19a690fd3515561c87285ec25ca1","tarball":"https://registry.npmjs.org/@alemdocodigo/web-local/-/web-local-0.1.0.tgz","fileCount":13,"integrity":"sha512-IRAlHOb60Xi+UQhvmUpG9fG5p0EKy7nrRgYc/qT3uFeRH1WmK/D7/ncSiw4ffZCuDhTQSwZJ5sa5aIHbJwXdcw==","signatures":[{"sig":"MEYCIQC5DlGNWxwF4LMf6aLAAVtMZKI01tlzjIU5/lSPMAAfQQIhAOkSOrOOFJh16gPgQ5nDdrjZmNq84IE2xdL5qRRi0EKZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":63333},"type":"module","engines":{"node":">=20"},"gitHead":"6f866d333f9fff0ab19bbffa0bc4e9d24e75222c","scripts":{"test":"node --test","start":"node bin/web-local.js"},"_npmUser":{"name":"alemdocodigo","email":"geral@alemdocodigo.pt"},"repository":{"url":"git+https://github.com/Alem-do-Codigo/web-local.git","type":"git"},"_npmVersion":"11.4.2","description":"Todos os serviços locais num só painel.","directories":{},"_nodeVersion":"22.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/web-local_0.1.0_1784215096937_0.7662524946535787","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@alemdocodigo/web-local","version":"0.1.2","license":"MIT","_id":"@alemdocodigo/web-local@0.1.2","maintainers":[{"name":"alemdocodigo","email":"geral@alemdocodigo.pt"}],"homepage":"https://github.com/Alem-do-Codigo/web-local#readme","bugs":{"url":"https://github.com/Alem-do-Codigo/web-local/issues"},"bin":{"web-local":"bin/web-local.js"},"dist":{"shasum":"5fe2d8b16e15cddb2c44a14065561b806f0d42c6","tarball":"https://registry.npmjs.org/@alemdocodigo/web-local/-/web-local-0.1.2.tgz","fileCount":13,"integrity":"sha512-m3n/WWscq+8zXR3inlpapno91lRKhFAGky+r5rJn0eJnZufZlSkhinQz+Z/Vd57TWT42VXhUe8n0FPwagnADuw==","signatures":[{"sig":"MEQCIGvbIq1Szs+Co8CCVxdFt4D2FQXwNLNwdd6ESpnlkTCRAiApcdnaL6W+XqG3kqD98nCGFhTERxbfbskM5G52qpYsFg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@alemdocodigo%2fweb-local@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":62535},"type":"module","engines":{"node":">=20"},"gitHead":"b7b5c7de01efd4142d12df30361019dd5aa2f64d","scripts":{"test":"node --test","start":"node bin/web-local.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5d50ee18-0181-4907-bda8-7eab9263f0f9"}},"repository":{"url":"git+https://github.com/Alem-do-Codigo/web-local.git","type":"git"},"_npmVersion":"11.16.0","description":"Todos os serviços locais num só painel.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/web-local_0.1.2_1784219334292_0.5495422147003772","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@alemdocodigo/web-local","version":"0.1.3","description":"Todos os serviços locais num só painel.","type":"module","license":"MIT","repository":{"type":"git","url":"git+https://github.com/Alem-do-Codigo/web-local.git"},"homepage":"https://github.com/Alem-do-Codigo/web-local#readme","bugs":{"url":"https://github.com/Alem-do-Codigo/web-local/issues"},"engines":{"node":">=20"},"scripts":{"start":"node bin/web-local.js","test":"node --test"},"bin":{"web-local":"bin/web-local.js"},"gitHead":"4269b3413dd9681fd73aae541abfe7def9fbfeda","_id":"@alemdocodigo/web-local@0.1.3","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-0Wxw3ceAVR5rBSqnmMNH6vDWu565cvZmxdHWPGO+u6srmyFd0flLuBuS4EDKUSuAN0I1CzIelzkzZZi/aId6PA==","shasum":"d8669e46e8671a6d27c8823f49deb90803525210","tarball":"https://registry.npmjs.org/@alemdocodigo/web-local/-/web-local-0.1.3.tgz","fileCount":13,"unpackedSize":66418,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@alemdocodigo%2fweb-local@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCmjYRQshzcQGsmeaC9VHtMUlcyt3hpcfI8M+MR70KF/gIgPzXg7dK90S1+aLDZNjggEx+3itiwrGS+uWS5QOG3GG8="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5d50ee18-0181-4907-bda8-7eab9263f0f9"}},"directories":{},"maintainers":[{"name":"alemdocodigo","email":"geral@alemdocodigo.pt"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/web-local_0.1.3_1784301974329_0.8099809138410994"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-16T15:18:16.842Z","modified":"2026-07-17T15:26:15.439Z","0.1.0":"2026-07-16T15:18:17.067Z","0.1.2":"2026-07-16T16:28:54.419Z","0.1.3":"2026-07-17T15:26:14.467Z"},"bugs":{"url":"https://github.com/Alem-do-Codigo/web-local/issues"},"license":"MIT","homepage":"https://github.com/Alem-do-Codigo/web-local#readme","repository":{"type":"git","url":"git+https://github.com/Alem-do-Codigo/web-local.git"},"description":"Todos os serviços locais num só painel.","maintainers":[{"name":"alemdocodigo","email":"geral@alemdocodigo.pt"}],"readme":"# WebLocal\n\n**Todos os serviços locais num só painel.**\n\nO WebLocal (`@alemdocodigo/web-local`) deteta serviços HTTP/HTTPS em portas locais, mostra-os\nnum painel e permite abrir cada página no navegador. A terminação só fica\ndisponível para processos reconhecidos como servidores de desenvolvimento.\n\n> Versão `0.1.2`, distribuída sob licença MIT.\n\n## Requisitos\n\n- Node.js 20 ou superior.\n- Windows: PowerShell com `Get-NetTCPConnection` e CIM.\n- macOS: `lsof` e `ps`.\n- Linux: `ss` e acesso permitido aos dados necessários em `/proc`.\n\n## Executar\n\nSem instalação permanente:\n\n```powershell\nnpx @alemdocodigo/web-local\n```\n\nOu com instalação global:\n\n```powershell\nnpm install --global @alemdocodigo/web-local\nweb-local\n```\n\nAjuda e versão:\n\n```powershell\nweb-local --help\nweb-local --version\n```\n\nDurante o desenvolvimento deste repositório:\n\n```powershell\nnpm start\n```\n\nO painel abre em <http://127.0.0.1:7331>. Para usar outra porta:\n\n```powershell\n$env:PORT = \"7444\"\nnpm start\n```\n\nEm shells POSIX:\n\n```sh\nPORT=7444 npm start\n```\n\n## Utilização\n\nO painel atualiza automaticamente a lista de serviços. Cada linha mostra a\nURL, porta, PID, processo, estado e duas ações:\n\n- Os cabeçalhos **Página**, **Porta**, **Processo** e **PID** ordenam a lista\n  nos dois sentidos.\n\n- **Abrir** abre o serviço no navegador.\n- **Terminar** pede confirmação e só é ativado quando o processo pertence ao\n  utilizador atual, tem uma identidade temporal confirmada e corresponde à\n  allowlist explícita de ferramentas de desenvolvimento.\n\nGuarde o trabalho antes de terminar um processo. O WebLocal envia apenas\n`process.kill(pid, 'SIGTERM')` ao PID revalidado, sem terminar a árvore, sem\nelevação e sem fallback para `SIGKILL`. No Windows, segundo a semântica do\nNode.js, este sinal termina o processo de forma abrupta e incondicional.\n\n## API local\n\nEstes são endpoints internos do painel, não uma API pública:\n\n- `GET /api/services` devolve os serviços HTTP/HTTPS locais detetados, avisos e\n  a hora da pesquisa. Exige o token da sessão no cabeçalho\n  `X-WebLocal-CSRF`.\n- `POST /api/services/:id/terminate` revalida a identidade do processo e pede a\n  sua terminação. Exige o mesmo token, uma origem local válida e corpo JSON\n  vazio (`{}`).\n\n## Segurança\n\n- O servidor aceita ligações apenas em `127.0.0.1` e valida `Host` e `Origin`.\n- A API exige um token CSRF por instância; não existe CORS.\n- O painel aplica Content Security Policy e outros cabeçalhos defensivos.\n- Linhas de comando completas são usadas apenas no processo local para\n  classificação e nunca são devolvidas ao navegador.\n- Antes de terminar, o WebLocal volta a enumerar o PID e confirma a identidade,\n  o instante de início, o proprietário e a assinatura reconhecida.\n- Processos Docker, WSL, de sistema, do próprio WebLocal, do processo pai ou\n  não reconhecidos permanecem protegidos.\n\n## Limitações conhecidas\n\n- A descoberta considera apenas serviços HTTP/HTTPS acessíveis por loopback.\n- Não descobre serviços apenas dentro de Docker, WSL, VMs ou máquinas remotas.\n- Não termina árvores de processos, não eleva privilégios e não usa `SIGKILL`.\n- A descoberta e terminação foram validadas ao vivo no Windows. macOS e Linux\n  estão cobertos por testes com fixtures, mas ainda não foram validados ao vivo.\n\n## Testes e pacote\n\n```powershell\nnpm test\nnpm pack --dry-run\n```\n\n## Publicação\n\nAo publicar uma GitHub Release, o workflow `publish.yml` testa e publica a\nversão definida em `package.json` no npm através de Trusted Publishing (OIDC).\nO workflow não usa tokens npm persistentes.\n\n## Licença\n\n[MIT](LICENSE) © 2026 Além do Código LDA.\n","readmeFilename":"README.md"}