SDK de plugins
Construa a peça que falta, dentro do KeelOps.
Um plugin é uma pasta de JavaScript que o KeelOps carrega no seu próprio processo: usa a sua autenticação, as suas permissões e o seu aspeto, lê os seus dados, e aparece onde se trabalha — no menu, na página de um projeto, no detalhe de uma tarefa, na barra superior. Nenhum segundo servidor, nenhum token para distribuir, nenhuma dependência para instalar. O SDK é livre (AGPL), e um plugin declara no manifesto se requer a edição pro.
O que pode construir
Aquilo que só a vós faz falta, com todo o resto do KeelOps à volta.
Uma página no menu
Uma entrada com o seu ícone, uma página que se abre dentro da aplicação e herda as suas cores, o tema claro ou escuro e a língua de quem a vê.
Dentro do trabalho
Um comando na página de um projeto, um painel no detalhe de uma tarefa, um botão entre os anexos de uma proposta, uma caixa no dia: as âncoras levam o plugin aonde é preciso.
Dados seus
Tabelas próprias na mesma base de dados, com as suas migrações, nos dois motores — SQLite e MariaDB. A cópia de segurança do KeelOps leva-as consigo.
Relatórios e notas de versão
O trabalho fechado torna-se um documento que se lê, escrito pelos modelos de IA no seu servidor: para os utilizadores, para a administração, para os comerciais.
Ferramentas para os assistentes
Um plugin oferece ferramentas aos outros, através do núcleo: assim o Claude, o ChatGPT e o Mistral leem os dados de qualidade do QABox, com as permissões de quem pergunta.
O trabalho do núcleo, com as suas regras
Criar uma tarefa, anexar um documento gerado, ter um grupo de pessoas: o plugin passa pelas portas do núcleo, com as permissões, as notificações e o histórico de sempre.
Um exemplo
O mapa de tarefas: um plugin dentro da página de um projeto.
Não tem entrada no menu: abre-se a partir do menu ⋯ de um projeto. Lê as tarefas com as permissões de quem vê, extrai os temas do texto com os modelos locais, e desenha-as como uma rede — hierarquia, janelas de tempo, quem trabalhou com quem, e as ligações que sugere acrescentar.

IA local
O trabalho feito torna-se um documento que se lê.
O KeelOps sabe o que foi feito, para quem, em que semana. Um modelo que corre no seu servidor — Ollama, nada que saia da empresa — transforma-o em texto para quem o tem de ler.
- Notas de versão para os utilizadores de um produto, semana a semana, divididas em novidades e correções.
- O mês de um cliente para a administração: pedidos abertos, trabalho realizado, horas por atividade, dito por palavras.
- A semana das propostas para os comerciais: o que avançou, o que está parado, a quem voltar a ligar.
- As não conformidades do mês para a qualidade, com as ações que as fecharam.
O modelo escreve as frases; o que entra no documento e os números decide-os o código. Sem modelo o documento sai na mesma, com os títulos no lugar das frases, e di-lo. É a mesma receita das notas de versão que o KeelOps já gera — ao lado, uma verdadeira, enviada aos utilizadores de um produto.

Por onde começar
Um plugin em vinte linhas.
Um manifesto que diz quem é e onde aparece, e uma função create(ctx) que recebe do núcleo a base de dados, a sessão e as portas, e devolve as suas rotas. Acrescenta-se o nome a PLUGINS, reinicia-se, e a entrada está no menu.
// plugins/Hello/plugin.mjs
export const manifest = { nome: "Hello", versione: "0.1.0", ui: { voce: "Hello", icona: "puzzle" } };
export async function create(ctx) {
const { json } = await import(`${ctx.sdkDir}/http.mjs`);
return {
routes: [
["GET", /^\/api\/summary$/, async (req, res) => {
const user = await ctx.sessionUser(req); // the real KeelOps session
if (!user) return json(res, 401, { error: "no session" });
const row = await ctx.db.get( // the KeelOps database, read-only
"SELECT COUNT(*) AS open FROM Task t JOIN TaskStatus s ON s.id = t.statusId " +
"WHERE t.assigneeId = ? AND s.isClosed = 0 AND t.deletedAt IS NULL", user.id);
json(res, 200, { name: user.name, open: row.open });
}],
],
staticDir: new URL("./ui", import.meta.url).pathname, // a page, inside the app
};
}
O código e os comentários dos plugins são em inglês, como a documentação; as páginas traduzem-se nas cinco línguas do KeelOps com um único mecanismo, fornecido pelo SDK.
As regras
Dentro do processo, dentro das regras.
Base de dados vedada
As leituras passam por uma ligação que não sabe escrever; as escritas só nas tabelas do plugin, e o portão lê cada instrução antes de a deixar passar.
A sessão do KeelOps
Cada rota passa pela guarda de sessão do núcleo. Os clientes do portal não chegam aos plugins, e um plugin mostra apenas o que a pessoa pode ver.
Tudo pelo SDK
Nenhum acesso direto à base de dados, ao ambiente do servidor ou aos modelos: um teste no núcleo lê o código-fonte de cada plugin e para num import proibido.
Liga-se e desliga-se
Na página Sistema, o administrador vê versão, licença e descrição de cada plugin e desliga-o sem reiniciar. Desligado, desaparece; os seus dados ficam.
A documentação.
Guias passo a passo, exemplos, as regras e a referência completa da API, em onze capítulos. Está em inglês, a língua de quem escreve código.