Knowl

Memória local-first sempre atual para agentes de IA

Documentação

Knowl — persistent memory across sessions for Claude Code, Cursor and Codex, over MCP

Local-first. Tipado. E aposentado no momento em que deixar de ser verdade.

npm CI license node MCP

Scores 90 on MemoryAgentBench FactConsolidation single-hop at 262K 0 API keys needed 27 MCP tools 100% local, no egress

A decision recorded as active, a replacement typed at the command line, the predecessor struck through and marked superseded, then the benchmark result and the full capability set — 98% against 47% on conflict resolution, 27 MCP tools, no API key

Início rápido · Por que a substituição · O que é armazenado · Recursos · Configuração do agente · Visualizador · Requisitos · Referência completa →


Agentes de codificação começam cada sessão em branco, então as equipes anotam as coisas — e essas anotações só crescem. Seis meses depois, o armazenamento ainda relata o banco de dados do qual você migrou na primavera passada, porque nada nunca informou a ele que aquela decisão havia terminado.

Knowl é memória persistente entre sessões para Claude Code, Cursor e Codex: um armazenamento local ao repositório de átomos de conhecimento tipados — decisões, restrições, arquitetura, fatos, metas, estado e habilidades — lidos e gravados por meio de um servidor de memória MCP ou pela CLI knowl, onde uma substituição aposenta seu predecessor no momento da gravação em vez de ficar ao lado dele.

Início rápido

Requer Node.js 22 ou posterior.

npm install -g @dat999zx/knowl
cd your-project
knowl init

knowl init cria .knowl/, instala os arquivos de orientação do projeto, atualiza .gitignore e oferece configuração de MCP e ciclo de vida para quaisquer agentes que detectar — Claude Code, Codex, Cursor, Gemini CLI, Claude Desktop. Também aquece o modelo de incorporação local, mas nunca depende de que esse download seja bem-sucedido.

Registre algo que vale a pena manter:

knowl decide "Use SQLite" "Use SQLite for local project memory." \
  --reasoning "Keeps storage repository-local and simple to operate." \
  --alternatives PostgreSQL MongoDB \
  --tags database local-first

Leia de volta, pela CLI ou por qualquer agente conectado:

knowl query "why sqlite"     # search project memory
knowl state                  # the active memory, as a hierarchy
knowl status                 # repository, memory, AI, and workspace status
knowl doctor                 # check setup, retrieval, and agent registration

Em seguida, inicie uma nova sessão de agente para que o host capture sua orientação e o registro MCP. A CLI e knowl_query leem o mesmo armazenamento sob as mesmas regras de governança.

A ideia: memória que se aposenta sozinha

A maioria dos sistemas de memória é somente de acréscimo. Armazenar "migramos para SQLite" deixa "usamos PostgreSQL" ativo e recuperável, então o agente obtém ambos e escolhe por classificação. Knowl trata uma gravação sobre o mesmo assunto como uma correção: o predecessor é marcado como superseded, sai da recuperação normal e permanece consultável por meio de knowl timeline.

A write naming a subject the store already holds: the replacement takes the active lane, the predecessor is stamped superseded and moved into history, and a later query sweep matches only the current decision

Esse único comportamento é a maior parte da diferença de precisão. No MemoryAgentBench corpus de Resolução de Conflitos — 455 fatos, 100 perguntas sobre qual fato é atual, recuperação top-5, sem leitor de LLM:

Conflict-resolution retrieval ablation: supersession on reached 98 percent top-1 with 2 stale returns; supersession off reached 47 percent top-1 with 62 stale returns
ConfiguraçãoTop-1Retornos desatualizadosÁtomos ativos
Substituição ATIVADA98,0%2 / 100306
Substituição DESATIVADA47,0%62 / 100455

Mesmo corpus, mesmo classificador, mesmo caminho de consulta. A única variável é se o fato desatualizado ainda está ativo. Esta é uma medição em nível de recuperação no próprio harness do Knowl: pergunta se o fato atual volta primeiro, sem modelo no loop.

Verificado de ponta a ponta, no harness do próprio benchmark

Como um número que você mesmo pontua vale menos do que um que outra pessoa pontua, a mesma afirmação foi re-executada dentro do harness do MemoryAgentBench, pontuada pelo seu próprio código, com um LLM lendo o que Knowl retornou — a configuração mais difícil, totalmente de ponta a ponta, no maior contexto que a tarefa oferece:

MemoryAgentBench FactConsolidation single-hop at 262K context, substring exact match, gpt-4o-mini reader: Knowl 90, GPT-4o long-context 60, BM25 56, NV-Embed-v2 55, HippoRAG-v2 54, GPT-4o-mini long-context 45, Cognee 28, MemGPT 28, Mem0 18
SistemaFactConsolidation-SH @262K
Knowl90
GPT-4o (contexto longo)60
BM2556
NV-Embed-v255
HippoRAG-v254
GPT-4o-mini (contexto longo)45
Cognee28
MemGPT28
Mem018

18.332 fatos, 100 perguntas, correspondência exata de substring. Cada linha usa gpt-4o-mini como leitor, incluindo o Knowl — o artigo declara isso para todos os agentes RAG e de memória, então estas são comparações justas. O número do Knowl foi medido aqui; todos os outros números são do artigo MemoryAgentBench, Tabela 2. Sistemas que o artigo não avalia nesta tarefa não são listados.

Desativar a substituição nesse mesmo harness reduz o Knowl para 73, e a diferença se mantém em uma mudança de 40× no tamanho do corpus:

Supersession ablation in MemoryAgentBench's own harness: at 262K context, supersession on scores 90 and off scores 73, a 17 point gap; at 6K context, on scores 94 and off scores 78, a 16 point gap
ContextoSubstituição ATIVADADESATIVADADiferença
262K9073+17
6K9478+16

As duas seções medem coisas diferentes e não são comparáveis entre si: 98% é recuperação top-1 em 6K sem leitor, 90 é precisão de ponta a ponta em 262K com um. Apenas a segunda é comparável aos sistemas publicados acima. Veja benchmarks para o protocolo, os resultados verificados e o que a tarefa não cobre — incluindo multi-hop, onde Knowl pontua 7 contra um teto de recuperação de 14 pontos.

A substituição é uma correção, não uma exclusão: o item, suas afirmações e seu histórico sobrevivem.

Não é uma maquete — a mesma sequência contra a CLI publicada, gravada a partir de demo.tape:

Terminal recording: knowl decide records a database decision, a second decide on the same subject reports Superseded older decision, and knowl status then reports one active item and one superseded

O que é armazenado

Cada átomo tem exatamente uma de sete categorias:

CategoriaUse para
factVerdades estáveis do projeto, convenções e comportamento verificado
decisionUma opção selecionada com raciocínio e alternativas
goalUm resultado pretendido que orienta o trabalho futuro
constraintUma regra ou limite que deve continuar valendo
architectureComo os componentes estão organizados e interagem
stateProgresso atual, prontidão, bloqueadores ou status operacional
skillUm procedimento reutilizável ou descrição de fluxo de trabalho aprendido
A decision atom with its governed fields: status, freshness, confidence, tags, source commit, affected paths, and evidence — one evidence locator shown gone stale

Junto ao conteúdo, cada átomo mantém um status (active, deprecated, rejected, archived, superseded), um sinalizador de atualidade, confiança, tags, commit de origem, caminhos afetados e evidências opcionais apontando para arquivos, commits, testes, comandos, URLs ou símbolos de código indexados. Evidências de arquivo e símbolo ficam desatualizadas por conta própria quando o código se move, que é como um átomo admite que pode estar desatualizado em vez de afirmar uma versão do repositório que não existe mais.

O que Knowl deliberadamente não armazena são suas conversas. A captura do ciclo de vida registra eventos limitados e resumos — nunca prompts, transcrições, stdout ou variáveis de ambiente. A busca por transcrição bruta existe como um índice opcional, desativado por padrão sobre arquivos que o host já gravou.

Referência do modelo de conhecimento

Conectando um agente

Claude Code
Claude Code
MCP · ciclo de vida · subagentes
Codex
Codex
MCP · ciclo de vida · subagentes
Cursor
Cursor
MCP · ciclo de vida
Gemini CLI
Gemini CLI
MCP · loop manual
Claude Desktop
Claude Desktop
MCP · loop manual

knowl serve expõe o armazenamento via MCP stdio; knowl init o registra para você. O fluxo de trabalho que a orientação instalada pede que os agentes sigam é curto:

  1. Consulte a memória com as palavras que nomeiam o assunto antes de ler arquivos do repositório.
  2. Use um resultado ativo diretamente; inspecione arquivos apenas em caso de ausência, conflito ou resultado desatualizado.
  3. Armazene descobertas duráveis, metas declaradas e diagnósticos recorrentes conforme avança, e corrija memória contradita em vez de duplicá-la.

Na prática, isso se parece com isto — uma nova sessão, sem contexto, nada colado:

You     why did we pick SQLite over Postgres?

Agent   → knowl_query "sqlite postgres database choice"
        ← decision · Use SQLite · active · fresh
          "Keeps storage repository-local and simple to operate."
          alternatives: PostgreSQL, MongoDB
          tags: database, local-first

        SQLite keeps the store repository-local and simple to operate.
        Postgres and MongoDB were both considered and rejected on that
        basis.

O agente respondeu antes de abrir um único arquivo, e sabia as opções que você rejeitou — o que o código não pode informar, porque alternativas rejeitadas não deixam rastro em um código-fonte.

HostMCPCiclo de vida automáticoSubagentesNotas
Claude CodeSimSimSimA orientação de prompt também é instalada
CodexSimSimSimTurnos principais compartilham uma sessão de memória
CursorSimSimNãoFinaliza por turno
Gemini CLISimNãoNãoMCP mais o loop de trabalho manual
Claude DesktopSimNãoNãoMCP mais o loop de trabalho manual
Session lifecycle: bootstrap injects relevant memory, capture records bounded events, checkpoints record milestones, finalization distills durable candidates

Onde hooks estão disponíveis, eles controlam o ciclo de vida da sessão: contexto de inicialização, captura, checkpoints e finalização acontecem sem que o agente seja solicitado. Onde não estão, knowl task run, task start, task checkpoint e task finish cobrem o mesmo terreno manualmente.

knowl init grava o registro MCP para cada host que detecta. Para conectar um manualmente, a entrada é a mesma em todos os lugares:

{
  "mcpServers": {
    "knowl": { "command": "knowl", "args": ["serve"] }
  }
}

Use knowl.cmd como comando no Windows. Codex lê a mesma entrada sob mcp_servers.

Ferramentas e recursos MCP · Referência do ciclo de vida

Para que serve o Knowl

Knowl faz um trabalho: manter a verdade de engenharia de um repositório precisa para os agentes que trabalham nele. Não preferências de usuário, não histórico de chat — as decisões, restrições e arquitetura de um código-fonte, e quais delas ainda são verdadeiras hoje.

One question answered four times over two years: append-only keeps every answer true forever so a query today matches four contradicting ones, while a governed store ends each replaced answer and matches one

Três escolhas decorrem disso:

  • Tipado, não texto livre. Uma decisão carrega raciocínio e as alternativas que você rejeitou. Uma restrição é uma regra que deve continuar valendo. Espera-se que um átomo state fique desatualizado. A recuperação pode classificar com base nessas diferenças; não pode classificar com base em parágrafos em um arquivo de notas.
  • Governado, não somente de acréscimo. Status, atualidade, proveniência, identidade de conflito e substituição permitem que o armazenamento diga que algo deixou de ser verdade. Essa é toda a diferença entre memória e uma pilha cada vez maior de notas.
  • Local ao repositório, não um serviço. O banco de dados fica ao lado do código que descreve. Sem conta, sem egresso, sem fornecedor entre você e seu próprio histórico de projeto.

Knowl deliberadamente não é uma camada de personalização. Não tem opinião sobre seus usuários e não mantém transcrições próprias.

Recursos

Tudo abaixo funciona pela CLI e por qualquer agente conectado via MCP, contra o mesmo banco de dados local. Sem conta, sem servidor, sem chave de API. Cada item vincula à referência completa para o detalhe — e para os limites.

♻️ Conhecimento que se corrige

Sete tipos de átomos tipados, onde uma gravação sobre o mesmo assunto aposenta seu predecessor em vez de ficar ao lado dele. Esse único comportamento é a diferença de 90 contra 73. Evidências anexadas a um arquivo ou símbolo ficam desatualizadas por conta própria quando o código se move. conflicts · timeline · query --as-of · pr --since · index-code

🎯 Recuperação otimizada para agentes

Primária por vetores com fallback limitado de BM25, reordenada por atualidade, status e confiança, para que a resposta atual vença em vez da meramente semelhante. O modelo de embeddings é local e opcional — sem ele, você ainda tem recuperação por palavras-chave, e nada sai da máquina.

query · context --token-budget · config set-model · access

⏱️ Trabalho que sobrevive à sessão

No Claude Code, Codex e Cursor, os hooks gerenciam inicialização, captura, checkpoints e finalização sem que o agente seja solicitado. Uma finalização limpa destila até oito candidatos duráveis. Estacione um fluxo de trabalho sob uma chave e retome-o em qualquer sessão, de qualquer diretório.

task run · handoff · park · resume <key>

🔗 Espaços de trabalho

Seu repositório de API aprendeu algo que o repositório de frontend precisa. Vincule-os e uma consulta se expande, enquanto cada repositório mantém seu próprio banco de dados e seu próprio limite de propriedade. Abra um átomo compartilhado por pares na íntegra por ID, ou finalize o trabalho desse repositório daqui nomeando-o na chamada. O conhecimento que um repositório já possui é compartilhado somente quando você o promove.

workspace init · workspace add · workspace promote --apply

📦 Procedimentos reutilizáveis

Empacote um procedimento com seus scripts sob .knowl/skills/ e leia-o antes de ele ser executado. Combine vários átomos em um resumo de arquitetura de forma determinística, sem envolvimento de provedor de IA.

skill list · skill read · skill run · synthesize

💾 Seus dados e como recuperá-los

Exportação e importação JSONL com soma de verificação e quatro políticas explícitas para quando o mesmo átomo mudou em dois lugares. A restauração verifica esquema, tamanho, SHA-256 e integridade do SQLite antes de tocar em qualquer coisa e tira um snapshot pré-restauração primeiro.

export · import --on-divergence · snapshot create · gc · doctor

Os comandos que valem a pena conhecer no primeiro dia:

knowl query "auth design"              # search project memory
knowl state                            # the active memory, as a hierarchy
knowl conflicts                        # items that contradict each other
knowl timeline <item-id>               # every version an atom ever had
knowl context --token-budget 1500      # a fixed-size briefing for an agent
knowl pr --since origin/main           # knowledge your diff may invalidate
knowl doctor                           # setup, retrieval, and registration
Conhecimento que se corrige — sete tipos de átomos tipados e uma gravação que aposenta o que substitui
  • Sete tipos de átomoslistados acima. Estrutura em vez de um arquivo de anotações que só cresce.
  • Substituição automática — uma gravação do mesmo assunto aposenta seu predecessor. Esta é a diferença de 90 vs. 73 acima.
  • Identidade de conflito — marque um átomo como exclusivo e o Knowl recusa uma segunda resposta ativa para a mesma pergunta, em vez de manter ambas silenciosamente. knowl conflicts
  • Histórico completo — cada versão que um átomo já teve sobrevive como uma asserção imutável. knowl timeline <item-id>
  • Viagem no tempo — pergunte o que o projeto acreditava em uma data passada: knowl query "auth design" --as-of 2026-01-01T00:00:00Z
  • Evidências — anexe arquivos, símbolos, commits, testes, comandos ou URLs a um átomo. Evidências de arquivo e símbolo ficam desatualizadas sozinhas quando o código muda.
  • Detecção de desvioknowl pr --since origin/main sinaliza conhecimento que seu diff pode ter invalidado, antes de você mesclá-lo.
  • Inteligência de código — índice incremental Tree-sitter sobre .ts / .tsx / .js / .jsx, para que evidências possam apontar para localizadores symbol://, não apenas números de linha. knowl index-code
  • Gravações seguras contra segredos — toda gravação é verificada quanto a segredos detectados, caminhos sensíveis e conteúdo superdimensionado antes de ser salva. Memória de longo prazo é o último lugar onde uma credencial deveria parar.

Modelo de conhecimento · Evidências e desvio

Recuperação otimizada para agentes — a resposta atual vence, não apenas a semelhante
  • Classificação primária por vetores com fallback limitado de BM25, reordenada por atualidade, status, confiança e recência — para que a resposta atual vença, não apenas a semelhante. (Este é o caminho de agente/MCP; um knowl query de repositório único da CLI é lexical.)
  • Funciona offline. O modelo de embeddings é local e opcional; sem ele, você ainda tem recuperação por palavras-chave. A recuperação nunca envia sua consulta para lugar nenhum.
  • Cinco predefinições de embeddings incluídas, incluindo uma multilíngue que cobre mais de 200 idiomas, além de custom para seu próprio modelo ONNX. knowl config set-model <model>
  • Suporte a identificadores exatos — nomes de arquivo, IDs de item e localizadores symbol:// ainda são encontrados mesmo quando a similaridade semântica é fraca.
  • Pacotes de contexto com orçamento de tokens — entregue a um agente um briefing de tamanho fixo com restrições fixadas primeiro, para que regras inegociáveis nunca sejam truncadas: knowl context --query "auth rollout" --token-budget 1500
  • Feedback de uso — agentes relatam se um resultado ajudou, e knowl access mostra o que é muito usado, o que está desatualizado e o que continua causando correções.

Recuperação e contexto

Trabalho que sobrevive ao fim de uma sessão — hooks, loops de trabalho, bastões de handoff e chaves de retomada
  • Ciclo de vida automático no Claude Code, Codex e Cursor — inicialização, captura, checkpoints e finalização acontecem por meio de hooks sem que o agente seja solicitado.
  • Loops de trabalho para todo o resto — knowl task start, checkpoint, finish ou envolva um único comando com knowl task run "Run tests" -- npm test.
  • Promoção no fim da sessão — uma finalização limpa destila até oito candidatos duráveis da sessão, e um comando que foi bem-sucedido três vezes se torna um átomo skill que o descreve.
  • Handoff — deixe um bastão para a próxima sessão neste repositório. Ele é entregue uma vez e depois arquivado.
  • Chaves de retomada — estacione um fluxo de trabalho sob uma chave curta que você mantém e retome-o em qualquer sessão, de qualquer diretório, quantas vezes quiser depois. knowl resume <key>
  • Busca de transcrição opcional — desativada por padrão, e desativada significa que nada existe no disco. Ative-a e a prosa de sessões passadas se torna pesquisável, para que uma falha de memória degrade para uma busca mais lenta em vez de amnésia.

Tarefas, sessões e ciclo de vida

Espaços de trabalho: muitos repositórios, uma memória compartilhada — você decide o que cada repositório compartilha

Seu repositório de API aprendeu algo que o repositório de frontend precisa. Vincule-os e uma consulta se expande — enquanto cada repositório mantém seu próprio banco de dados e seu próprio limite de propriedade.

knowl workspace init product      # create the workspace
knowl workspace add product       # run inside each repo that joins it
                                  # ...or --default-visibility repo to keep its writes private

knowl workspace promote                               # pick what to share from a list
knowl workspace promote --category decision --apply   # or name it outright

Entrar em um espaço de trabalho compartilha o que o repositório grava a partir de então e avisa quando o faz; passe --default-visibility repo para recusar. O que o repositório já sabe é compartilhado somente quando você o promove. Resultados de pares são rotulados com o repositório que os possui, e um compartilhado pode ser aberto na íntegra por ID — sem seu affectedPaths ou evidências, que são resolvidos contra um checkout em que você não está. Um par ausente ou ilegível é ignorado e divulgado, nunca um motivo para sua busca local falhar.

Gravar em um repositório irmão é deliberado, não incidental. Um agente nomeia o repositório na chamada e essa única chamada é executada como aquele repositório — seu armazenamento, sua configuração, suas regras de propriedade, carimbadas como suas — exatamente como cd lá sempre se comportou para a CLI. Não nomeie nada e um ID estrangeiro é recusado como antes. De qualquer forma, o conhecimento privado de um repositório permanece privado até ser promovido.

Espaços de trabalho

Procedimentos reutilizáveis — habilidades baseadas em arquivos que você pode inspecionar antes de executar
  • Habilidades baseadas em arquivos — empacote um procedimento com seus scripts sob .knowl/skills/ e depois inspecione-o antes de ele ser executado. knowl skill list · read · run
  • Síntese determinística — combine vários átomos em um resumo de arquitetura sem envolvimento de provedor de IA: knowl synthesize --scope storage

Habilidades e síntese

Seus dados e como recuperá-los — exportação portátil, snapshots verificados e um comando de diagnóstico
  • Exportação/importação portátil — JSONL com soma de verificação e quatro políticas de divergência explícitas para quando o mesmo átomo mudou em dois lugares. knowl export · knowl import --on-divergence newer
  • Snapshots verificadosknowl snapshot create grava um manifesto de soma de verificação; a restauração verifica versão do esquema, tamanho, SHA-256 e integridade do SQLite antes de tocar em qualquer coisa e tira um snapshot pré-restauração primeiro.
  • Coleta de lixo que pré-visualiza por padrão e protege qualquer coisa usada recentemente. knowl gc
  • knowl doctor — um comando que verifica configuração, configurações, integridade, esquema, recuperação, cobertura de vetores, registro de agentes e saúde do espaço de trabalho.
  • IA opcional — configure um provedor para knowl ask e ingestão de texto bruto. Todos os recursos acima funcionam sem um.

Portabilidade e manutenção · IA opcional

Veja: o visualizador local

knowl view inicia um inspetor somente leitura em 127.0.0.1 com um token de acesso novo por inicialização — saber a porta não é suficiente para ler qualquer coisa.

knowl view

Knowl local viewer showing the project-memory graph Knowl local viewer showing details for a selected knowledge atom

Pesquise, filtre por categoria, identifique anéis desatualizados, foque uma vizinhança e abra qualquer átomo para ler suas evidências e linha do tempo. O grafo vincula átomos por meio de tags compartilhadas e arestas derivadas de categoria — um auxílio de navegação, não um grafo causal ou de evidências. Ele mostra conteúdo local completo em todos os status, então o vínculo de loopback é o limite de privacidade: não o coloque atrás de um proxy público ou túnel.

Visualizador local

Todo o resto

27 ferramentas MCP (mais 3 quando a busca de transcrição está ativa, 1 quando conectado a um espaço de trabalho em nuvem, 1 quando vinculado a um espaço de trabalho local e 1 quando o impacto de mudanças está ativo)

e dois URIs de recurso · a CLI completa, de knowl status a knowl audit · uma auditoria de integridade somente leitura · avaliação de recuperação que você pode executar por conta própria contra a governança verificada e as suítes de regressão de 500 casos com knowl eval.

Referência da CLI · Ferramentas MCP · Benchmarks

Requisitos e dados locais

Node.js 22 ou posterior. Tudo o que o Knowl grava para um projeto fica sob .knowl/, que knowl init adiciona a .gitignore:

CaminhoContém
.knowl/config.jsonConfiguração de projeto, busca, segurança, IA e espaço de trabalho
.knowl/knowl.dbÁtomos, asserções, commits de conhecimento, índice de texto completo, feedback, embeddings
.knowl/skills/Pacotes de habilidades baseados em arquivos

Manifestos de espaço de trabalho ficam fora dos repositórios membros, porque seus caminhos de checkout são específicos da máquina. Exportações e snapshots são gravados somente quando você os solicita.

Documentação

Tudo acima é o resumo. A referência completa é um documento que cobre cada subsistema em profundidade — incluindo as partes que são deliberadamente limitadas, que é geralmente o que você realmente precisa saber.

Se você quiser saber…Vá para
O que é um átomo e o que cada campo significaModelo de conhecimento
Como uma consulta é classificada e o que desempataRecuperação e contexto
O que um hook registra e quandoTarefas, sessões, ciclo de vida
Como um átomo percebe que o código mudouEvidência e deriva
Como vários repositórios compartilham memória com segurançaWorkspaces
Como um procedimento se torna reutilizávelHabilidades e síntese
Como exportar, criar snapshot ou restaurarPortabilidade e manutenção
O que o visualizador mostra e seu limite de privacidadeVisualizador local
Como as partes se encaixam e onde estão os limites de confiançaArquitetura
Como conectar um host específicoConfiguração do agente
Como os números desta página foram medidosBenchmarks
Todos os comandos e todas as flagsReferência da CLI
Todas as ferramentas e recursos do MCPFerramentas MCP
O que precisa de um provedor e o que nunca precisaIA opcional
Exatamente o que é gravado no discoDados locais

Contribuindo

Consulte CONTRIBUTING.md para configuração, as verificações a executar antes de um pull request e as convenções que este código-fonte segue. Pede-se que os contribuidores concordem com o Contrato de Licença de Contribuidor uma única vez, no primeiro pull request.

Licença

Knowl é licenciado sob a Apache License 2.0. A Apache-2.0 não concede direitos de marca registrada.