{"id":50318729,"url":"https://github.com/psielta/notebook-cli","last_synced_at":"2026-05-29T02:02:41.833Z","repository":{"id":360453606,"uuid":"1250190462","full_name":"psielta/notebook-cli","owner":"psielta","description":"CLI em Go para gerenciar notebooks de notas locais no terminal, com Cobra e SQLite.","archived":false,"fork":false,"pushed_at":"2026-05-26T12:51:24.000Z","size":33,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-26T14:27:17.323Z","etag":null,"topics":["cli","cobra","go","portfolio","powershell","sqlite","terminal"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/psielta.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-26T11:46:35.000Z","updated_at":"2026-05-26T12:51:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/psielta/notebook-cli","commit_stats":null,"previous_names":["psielta/notebook-cli"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/psielta/notebook-cli","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/psielta%2Fnotebook-cli","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/psielta%2Fnotebook-cli/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/psielta%2Fnotebook-cli/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/psielta%2Fnotebook-cli/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/psielta","download_url":"https://codeload.github.com/psielta/notebook-cli/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/psielta%2Fnotebook-cli/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33633468,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-29T02:00:06.066Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","cobra","go","portfolio","powershell","sqlite","terminal"],"created_at":"2026-05-29T02:02:41.082Z","updated_at":"2026-05-29T02:02:41.824Z","avatar_url":"https://github.com/psielta.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Notebook CLI (`nb`)\n\n[![CI](https://github.com/psielta/notebook-cli/actions/workflows/ci.yml/badge.svg)](https://github.com/psielta/notebook-cli/actions/workflows/ci.yml)\n\nCLI em Go para criar e gerenciar notebooks de notas locais diretamente pelo terminal.\n\nO projeto funciona em Windows, Linux e macOS, com armazenamento local em SQLite, comandos curtos e uma arquitetura simples de manter.\n\n## Visao Geral\n\n`nb` organiza notas em notebooks independentes. Cada notebook pode ser selecionado como atual, e as notas podem ser adicionadas, listadas, removidas ou limpas sem sair do terminal.\n\nOs dados ficam no perfil do usuario:\n\n```powershell\n$env:USERPROFILE\\.notebook-cli\n```\n\nArquivos criados:\n\n- `notebook.db`: banco SQLite unico da aplicacao.\n- `sessions/\u003cid\u003e.current`: notebook selecionado na sessao de terminal\n  identificada por `\u003cid\u003e`. Cada janela, aba ou pane de terminal mantem sua\n  propria selecao; abrir outra sessao comeca sem notebook selecionado ate\n  rodar `nb use \u003cnome\u003e`. O `\u003cid\u003e` usa, nesta ordem: `NB_SESSION_ID`, sinais\n  de terminal herdados por wrappers (`WT_SESSION`, `TERM_SESSION_ID`,\n  `ITERM_SESSION_ID`, `TMUX_PANE`, `SSH_TTY` etc.), TTY Unix ou console\n  Windows e, por fim, a arvore de processos do shell.\n\n## Funcionalidades\n\n- Criacao e selecao de notebooks.\n- Notas com ID local por notebook.\n- IDs monotonicos: uma nota removida nao tem seu ID reutilizado.\n- Listagem completa ou das ultimas notas.\n- Limpeza com confirmacao interativa ou flag `--yes`.\n- Armazenamento local em SQLite sem dependencia de CGO.\n- Testes unitarios, integracao, comandos Cobra e E2E opcional.\n\n## Instalacao\n\n### Via npm (recomendado)\n\n```sh\nnpm install -g @psielta/notebook-cli\n```\n\nOu rode sem instalar:\n\n```sh\nnpx @psielta/notebook-cli new erp\n```\n\nA CLI e um binario Go; o pacote npm entrega binarios pre-compilados por\nplataforma como dependencias opcionais, entao a instalacao e instantanea (sem\npostinstall e sem download). Plataformas: Windows, Linux e macOS em `x64` e\n`arm64`. Depois de instalar, o comando disponivel e `nb`.\n\n### A partir do codigo (Go)\n\nRequisitos:\n\n- Go 1.22 ou superior.\n- PowerShell 7 recomendado no Windows.\n- Shell moderno no Linux/macOS (`bash`, `zsh`, `fish`, `pwsh` etc.).\n\nBuild local:\n\n```powershell\ngo build -o nb.exe ./cmd/nb\n```\n\nBuild com versao:\n\n```powershell\ngo build -ldflags \"-X notebook-cli/internal/version.Version=v1.0.0\" -o nb.exe ./cmd/nb\n```\n\nDepois, use `.\\nb.exe` no diretorio do projeto ou adicione o binario ao `PATH`.\n\n\u003e Publicacao: o processo de release (tag `vX.Y.Z` -\u003e GitHub Release + publicacao\n\u003e no npm) esta documentado em [RELEASING.md](RELEASING.md).\n\n## Uso Rapido\n\n```powershell\n.\\nb.exe new erp\n.\\nb.exe use erp\n.\\nb.exe add \"corrigir problema x\"\n.\\nb.exe add \"testar importacao de XML\"\n.\\nb.exe show\n```\n\nSaida esperada:\n\n```text\nNotebook 'erp' criado.\nUsando 'erp'.\nNota 1 adicionada.\nNota 2 adicionada.\nID  CRIADO EM            TEXTO\n1   2026-05-26 08:45:45  corrigir problema x\n2   2026-05-26 08:45:45  testar importacao de XML\n```\n\n## Comandos\n\n| Comando | Descricao |\n| --- | --- |\n| `nb new \u003cnome\u003e` | Cria um novo notebook. |\n| `nb use \u003cnome\u003e` | Define o notebook atual. |\n| `nb current` | Mostra o notebook atual. |\n| `nb list` | Lista notebooks e quantidade de notas. |\n| `nb add \"\u003ctexto\u003e\"` | Adiciona uma nota ao notebook atual. |\n| `nb show` | Lista todas as notas do notebook atual. |\n| `nb last [n]` | Mostra as ultimas `n` notas. Sem argumento, mostra a ultima. |\n| `nb remove \u003cid\u003e` | Remove uma nota pelo ID local. |\n| `nb clear [--yes]` | Remove todas as notas do notebook atual. |\n| `nb --version` | Mostra a versao do binario. |\n\n### Tasks diarias\n\nUse `nb new task` para criar e selecionar automaticamente um notebook de task\ncom nome padronizado pela data local:\n\n```powershell\nnb new task\n```\n\nExemplos de nomes gerados:\n\n```text\nT001-2026-05-27\nT002-2026-05-27\n```\n\nA sequencia e diaria e usa os notebooks ja existentes no banco local.\n\n### Atalhos para agentes de IA\n\n`nb add` aceita atalhos fixos para registrar rapidamente a etapa atual de um\nagente:\n\n| Atalho | Nota gravada |\n| --- | --- |\n| `clau-p` | `Claude planejando...` |\n| `clau-r` | `Claude revisando...` |\n| `clau-i` | `Claude implementando...` |\n| `clau-vp` | `Claude validando plano do Codex...` |\n| `clau-cp` | `Claude corrigindo plano com melhorias do Codex...` |\n| `dex-p` | `Codex planejando...` |\n| `dex-r` | `Codex revisando...` |\n| `dex-i` | `Codex implementando...` |\n| `dex-vp` | `Codex validando plano do Claude...` |\n| `dex-cp` | `Codex corrigindo plano com melhorias do Claude...` |\n| `clau-to-dex` | `Claude gerando prompt para Codex...` |\n| `dex-to-clau` | `Codex gerando prompt para Claude...` |\n\nTextos livres continuam funcionando normalmente. Apos adicionar qualquer nota,\no comando mostra a nota gravada com ID, horario e texto resolvido.\n\n### Cores\n\nA CLI usa cores ANSI automaticamente em terminal interativo e desliga cores em\nredirecionamentos, pipes, testes e quando `NO_COLOR` estiver definido.\n\n## Roadmap\n\nMelhorias planejadas para evoluir o projeto:\n\n- `nb remove last`: remover a ultima nota sem precisar copiar o ID.\n- `nb edit \u003cid\u003e`: editar o texto de uma nota existente.\n- `nb search \u003ctermo\u003e`: buscar notas por palavra ou trecho de texto.\n- `nb rename \u003cnome-atual\u003e \u003cnovo-nome\u003e`: renomear um notebook.\n- `nb export`: exportar notas para Markdown ou JSON.\n- `nb import`: importar notas a partir de JSON.\n- `nb stats`: mostrar quantidade de notebooks, notas e data da ultima nota.\n\nConcluido:\n\n- Distribuicao via npm (`npm i -g @psielta/notebook-cli`).\n- Releases no GitHub com binarios prontos para download (GoReleaser).\n\n## Arquitetura\n\nO projeto usa layout idiomatico com `cmd/` e `internal/`:\n\n```text\ncmd/nb                 entrypoint da CLI\ninternal/commands      comandos Cobra\ninternal/service       regras de negocio\ninternal/repository    persistencia com GORM\ninternal/domain        entidades Notebook e Note\ninternal/database      abertura e migracao do SQLite\ninternal/session       resolucao do identificador da sessao de terminal\ninternal/state         leitura/escrita do current por sessao\ninternal/version       versao do binario para --version e builds de release\ninternal/output        formatacao de tabelas no terminal\ninternal/testutil      helpers para testes\n```\n\nDecisoes tecnicas principais:\n\n- `github.com/spf13/cobra` para parsing dos comandos.\n- `gorm.io/gorm` com `github.com/glebarez/sqlite`, evitando CGO no Windows.\n- SQLite unico em `%USERPROFILE%\\.notebook-cli\\notebook.db`.\n- DSN com `_txlock=immediate`, `foreign_keys(1)`, `journal_mode(WAL)` e `busy_timeout(5000)`.\n- Criacao de nota em transacao unica: incrementa `NextNoteID` e insere a nota no mesmo bloco.\n- IO dos comandos via Cobra (`SetIn`, `SetOut`, `SetErr`) para facilitar testes.\n\n## Testes\n\n```powershell\ngo test ./...\ngo test -tags=e2e ./...\ngo test -coverprofile=coverage.out ./...\ngo tool cover -func=coverage.out\n```\n\nCobertura atual:\n\n- Total: 87.2%\n- `internal/repository`: 93.0%\n- `internal/service`: 95.6%\n\n## Observacoes Para Terminal\n\nPowerShell 7 ja usa UTF-8 por padrao. Em consoles antigos, rode:\n\n```powershell\nchcp 65001\n```\n\n### Compartilhando a selecao entre sessoes\n\nPor padrao, cada janela, aba ou pane de terminal tem sua propria selecao de\nnotebook atual. Isso tambem funciona quando o binario e chamado por wrappers\ncomo `npm`, `npx`, scripts `.cmd` ou `node`, desde que o terminal exponha um\nTTY, console Windows ou variaveis de sessao herdadas.\n\nPara forcar duas sessoes a compartilharem a selecao (util para automacao, CI\nou pipes), defina `NB_SESSION_ID` em cada uma:\n\n```powershell\n$env:NB_SESSION_ID = \"shared\"\nnb use erp\n```\n\nA variavel e escopada ao processo do PowerShell; nao use `setx`, pois ele\ngrava no registro do usuario e nao afeta sessoes ja abertas. Use um valor\ncurto com letras, numeros, `_`, `-` ou `.`, mas nao comece com `sh-`, que e\nreservado para sessoes detectadas automaticamente.\n\nEm Linux/macOS, use a sintaxe do seu shell:\n\n```bash\nexport NB_SESSION_ID=shared\nnb use erp\n```\n\n## Licenca\n\nDistribuido sob a licenca MIT. Veja [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpsielta%2Fnotebook-cli","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpsielta%2Fnotebook-cli","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpsielta%2Fnotebook-cli/lists"}