{"_id":"@alana-aomt/live-md","name":"@alana-aomt/live-md","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.1":{"name":"@alana-aomt/live-md","version":"1.0.1","description":"Servidor local com hot-reload para navegar e visualizar Markdown de qualquer pasta. Também disponível como app web estática (File System Access API).","bin":{"live-md":"bin/live-md.js"},"main":"server.js","type":"commonjs","scripts":{"start":"node bin/live-md.js","build:web":"node scripts/build-web.mjs","build:binaries":"node scripts/build-binaries.mjs","smoke":"node scripts/smoke.mjs","prepublishOnly":"node scripts/smoke.mjs"},"engines":{"node":">=16"},"dependencies":{"chokidar":"^3.6.0"},"devDependencies":{"@yao-pkg/pkg":"^6.5.1"},"pkg":{"scripts":["server.js"],"assets":["public/**/*"],"outputPath":"dist","targets":["node22-macos-arm64","node22-macos-x64","node22-linux-x64","node22-win-x64"]},"keywords":["markdown","live-reload","viewer","preview","cli","katex","mermaid","presentation"],"author":{"name":"Alana Oliveira","email":"alana.oliveira@ufma.br"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/alana-aomt/live-md.git"},"bugs":{"url":"https://github.com/alana-aomt/live-md/issues"},"homepage":"https://github.com/alana-aomt/live-md#readme","_id":"@alana-aomt/live-md@1.0.1","gitHead":"fbefc802294a7672708c1f34f1b5f832eff82151","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-9uaHhycGSvQ7aIkBSSova2mH8MMOu2X8AH+k53okg2ObFr8iTsa8GPqPDgFy90+y/KFpskey/G1YaJ2SKMHAbA==","shasum":"9b15e2c973490d577dec7009d59cab0293b43359","tarball":"https://registry.npmjs.org/@alana-aomt/live-md/-/live-md-1.0.1.tgz","fileCount":6,"unpackedSize":91630,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCwDkCNRmA5VHpQk52nHxttBXbBaLJM3ta04KJupXAp5wIgYbY74R9i8POnJdMMpzpdXPcS0waeUxoCWU4WOxVqSbs="}]},"_npmUser":{"name":"alana-aomt","email":"alana.oliveira@ufma.br"},"directories":{},"maintainers":[{"name":"alana-aomt","email":"alana.oliveira@ufma.br"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/live-md_1.0.1_1785698804658_0.06456838565865053"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-02T19:26:44.469Z","1.0.1":"2026-08-02T19:26:44.791Z","modified":"2026-08-02T19:26:45.340Z"},"maintainers":[{"name":"alana-aomt","email":"alana.oliveira@ufma.br"}],"description":"Servidor local com hot-reload para navegar e visualizar Markdown de qualquer pasta. Também disponível como app web estática (File System Access API).","homepage":"https://github.com/alana-aomt/live-md#readme","keywords":["markdown","live-reload","viewer","preview","cli","katex","mermaid","presentation"],"repository":{"type":"git","url":"git+https://github.com/alana-aomt/live-md.git"},"author":{"name":"Alana Oliveira","email":"alana.oliveira@ufma.br"},"bugs":{"url":"https://github.com/alana-aomt/live-md/issues"},"license":"MIT","readme":"# live-md\n\nVisualizador de Markdown com hot-reload. Rode como CLI local (servidor Node) ou no navegador como app web estática (File System Access API). O mesmo `public/viewer.html` alimenta os dois alvos.\n\nPorta padrão do servidor: **4321** (não usa 5000; no macOS a 5000 costuma conflitar com o AirPlay Receiver).\n\n## Instalação\n\n### Web (Vercel)\n\nAbra o deploy estático no Chrome ou Edge (precisam da File System Access API para navegar pastas). Clique em **Abrir pasta**, escolha a pasta local; nenhum arquivo é enviado a servidor algum. Tudo roda no seu navegador.\n\nDeploy: [https://live-md-xi.vercel.app](https://live-md-xi.vercel.app)\n\nLimitações do modo web:\n- Precisa de Chrome/Edge (ou outro navegador com File System Access API). Fallback `webkitdirectory` abre a pasta sem hot-reload por handle.\n- Hot-reload é um poll leve (~1s) só do arquivo atualmente aberto (`lastModified`). A árvore não é observada automaticamente.\n\nBuild local da pasta estática:\n\n```bash\nnpm run build:web   # gera web/index.html a partir de public/viewer.html\n```\n\n### Desktop via npm\n\n```bash\nnpm install -g @alana-aomt/live-md\n```\n\nDurante o desenvolvimento local (sem publicar):\n\n```bash\nnpm install\nnpm link            # comando global \"live-md\"\n# remover depois: npm unlink -g live-md\n```\n\n### Desktop via binário (sem Node)\n\nBaixe o executável do [GitHub Releases](https://github.com/alana-aomt/live-md/releases) para o seu SO:\n\n| Arquivo | Plataforma |\n|---|---|\n| `live-md-macos-arm64` | macOS Apple Silicon |\n| `live-md-macos-x64` | macOS Intel |\n| `live-md-linux-x64` | Linux x64 |\n| `live-md-win-x64.exe` | Windows x64 |\n\n```bash\nchmod +x live-md-macos-arm64\n./live-md-macos-arm64 ~/notas\n```\n\n**macOS e Gatekeeper:** os binários não são assinados com certificado Apple. Na primeira abertura, use *Abrir mesmo assim* em Ajustes > Privacidade e Segurança, ou remova a quarentena:\n\n```bash\nxattr -dr com.apple.quarantine ./live-md-macos-arm64\n```\n\n## Uso\n\n```bash\nlive-md                    # serve a pasta atual\nlive-md ./docs             # serve a subpasta ./docs\nlive-md ~/notas            # serve outra pasta\nlive-md -p 8080            # porta (se ocupada, tenta a próxima livre)\nlive-md --no-open          # não abre o navegador\nlive-md --host 0.0.0.0     # expõe na rede local (só em rede confiável)\nlive-md --help\n```\n\n### Atalhos no visualizador\n\n| Atalho | Ação |\n|---|---|\n| `Ctrl/Cmd+O` | Abrir pasta (modo local/web) |\n| `Ctrl/Cmd+K` | Filtrar arquivos |\n| `Ctrl/Cmd+B` | Recolher/mostrar árvore |\n| `Ctrl/Cmd+J` | Ocultar/mostrar sumário |\n| `P` | Modo apresentação (slides separados por `---`) |\n| Setas / Espaço | Navegar slides (na apresentação) |\n| `Esc` | Sair da apresentação |\n| `F` | Tela cheia (na apresentação) |\n\n## Recursos\n\n- Hot-reload no servidor (SSE + chokidar): ao salvar o `.md` aberto, a leitura atualiza sem perder o scroll; criar/renomear/apagar atualiza a árvore\n- Hot-reload leve na web estática: poll de `lastModified` do arquivo aberto\n- KaTeX (`$...$`, `$$...$$`)\n- Mermaid (blocos ` ```mermaid `)\n- Destaque de código (highlight.js)\n- Tema claro/escuro, painéis redimensionáveis, sumário\n- Modo apresentação (slides por `---`)\n\n## Como funciona\n\n- CLI: servidor HTTP (Node puro) serve a pasta e `public/viewer.html`\n- `GET /__livemd/tree` devolve a árvore em JSON (ignora `node_modules`, `.git`, ocultos)\n- `GET /__livemd/events` é SSE; o watcher empurra `change` / `add` / `unlink`\n- Web (Vercel): `scripts/build-web.mjs` copia o viewer para `web/index.html` e injeta `window.__LIVE_MD_STATIC__=true`, pulando o modo servidor\n\n## Binários standalone (escolha técnica)\n\nUsamos **`@yao-pkg/pkg`** (não Node SEA nem `bun build --compile`):\n\n- Empacota o CLI CommonJS + `chokidar` sem reescrever para um único bundle SEA\n- Cross-compile dos quatro alvos a partir do CI Linux\n- Embute `public/viewer.html` via `pkg.assets` (o `server.js` continua usando `__dirname`)\n\n```bash\nnpm install\nnpm run build:binaries   # saída em dist/\n```\n\n## Versionamento\n\nSemVer + [CHANGELOG.md](./CHANGELOG.md) (Keep a Changelog).\n\n```bash\n# bump + tag (escolha patch|minor|major)\nnpm version patch -m \"chore: release %s\"\ngit push --follow-tags\n```\n\nO push da tag `v*` dispara `.github/workflows/release.yml` (smoke test, binários, GitHub Release e `npm publish` se `NPM_TOKEN` existir).\n\n### Secret `NPM_TOKEN`\n\n1. Em npmjs.com: Access Tokens > Generate (Automation)\n2. No GitHub: Settings > Secrets and variables > Actions > New repository secret\n3. Nome: `NPM_TOKEN`, valor: o token\n\nSem o secret, o release ainda publica os binários no GitHub; só o passo npm é ignorado.\n\n## Publicar\n\nComandos manuais (não rode automaticamente por este guia; confirme antes):\n\n### (a) Web no Vercel\n\n```bash\nnpm run build:web\nnpx vercel              # preview; siga o link do projeto\nnpx vercel --prod       # produção\n```\n\nOu importe o repositório no dashboard Vercel (Framework: Other; Build: `node scripts/build-web.mjs`; Output: `web`).\n\n### (b) Release com binários + npm\n\n```bash\nnpm run smoke\nnpm version patch -m \"chore: release %s\"   # ou minor/major\ngit push --follow-tags                     # dispara o workflow na tag v*\n# opcional, local:\nnpm publish --access public\n```\n\n## Segurança\n\nPor padrão escuta só em `127.0.0.1`. Path traversal é bloqueado (403). Use `--host 0.0.0.0` apenas em rede confiável. No modo web, os arquivos nunca saem da máquina.\n\n## Estrutura\n\n```\nlive-md/\n  bin/live-md.js           # CLI\n  server.js                # estático + árvore + SSE + watcher\n  public/viewer.html       # fonte única do visualizador (dual-mode)\n  scripts/build-web.mjs    # gera web/index.html\n  scripts/build-binaries.mjs\n  scripts/smoke.mjs\n  web/                     # saída estática (index.html gerado)\n  vercel.json\n  .github/workflows/release.yml\n```\n\n## Licença\n\nMIT.\n","readmeFilename":"README.md","_rev":"1-9b616dcd7cd799872e93f3093b232423"}