@noclaf/cli 0.4.18 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +66 -56
- package/dist/adapters/supabase/allocation-gateway.js +236 -0
- package/dist/adapters/supabase/allocation-gateway.js.map +1 -0
- package/dist/adapters/supabase/analytics-gateway.js +18 -0
- package/dist/adapters/supabase/analytics-gateway.js.map +1 -0
- package/dist/{supabase.js → adapters/supabase/client.js} +5 -4
- package/dist/adapters/supabase/client.js.map +1 -0
- package/dist/adapters/supabase/context-gateway.js +23 -0
- package/dist/adapters/supabase/context-gateway.js.map +1 -0
- package/dist/adapters/supabase/gateway.js +18 -0
- package/dist/adapters/supabase/gateway.js.map +1 -0
- package/dist/adapters/supabase/task-gateway.js +494 -0
- package/dist/adapters/supabase/task-gateway.js.map +1 -0
- package/dist/brand.js +4 -1
- package/dist/brand.js.map +1 -1
- package/dist/cli/commands/auth.js +2 -2
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/completion.js +17 -14
- package/dist/cli/commands/completion.js.map +1 -1
- package/dist/cli/commands/exec.js +38 -27
- package/dist/cli/commands/exec.js.map +1 -1
- package/dist/cli/commands/init/auth-step.js +1 -1
- package/dist/cli/commands/init/auth-step.js.map +1 -1
- package/dist/cli/commands/init/context-step.js +10 -7
- package/dist/cli/commands/init/context-step.js.map +1 -1
- package/dist/cli/commands/init/index.js +2 -1
- package/dist/cli/commands/init/index.js.map +1 -1
- package/dist/cli/commands/init/project-step.js.map +1 -1
- package/dist/cli/commands/plan.js +2 -2
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/skills.js +3 -2
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/sync.js +11 -8
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/commands/validate-plan.js +2 -2
- package/dist/cli/commands/validate-plan.js.map +1 -1
- package/dist/cli/flows/clients.js +2 -2
- package/dist/cli/flows/clients.js.map +1 -1
- package/dist/cli/flows/completion.js +6 -5
- package/dist/cli/flows/completion.js.map +1 -1
- package/dist/cli/flows/user-config.js +4 -3
- package/dist/cli/flows/user-config.js.map +1 -1
- package/dist/cli/ui/render.js +4 -1
- package/dist/cli/ui/render.js.map +1 -1
- package/dist/config.js +28 -10
- package/dist/config.js.map +1 -1
- package/dist/core/ports.js +2 -0
- package/dist/core/ports.js.map +1 -0
- package/dist/core/types.js +7 -0
- package/dist/core/types.js.map +1 -0
- package/dist/lib/cowork-extension.js +1 -1
- package/dist/lib/cowork-extension.js.map +1 -1
- package/dist/lib/exec-delegate.js +72 -22
- package/dist/lib/exec-delegate.js.map +1 -1
- package/dist/lib/exec-engines.js +21 -3
- package/dist/lib/exec-engines.js.map +1 -1
- package/dist/lib/exec-events.js +80 -0
- package/dist/lib/exec-events.js.map +1 -0
- package/dist/lib/exec-translators.js +175 -0
- package/dist/lib/exec-translators.js.map +1 -0
- package/dist/lib/harness.js +36 -3
- package/dist/lib/harness.js.map +1 -1
- package/dist/lib/plan-delegate.js +15 -3
- package/dist/lib/plan-delegate.js.map +1 -1
- package/dist/lib/project-context.js +2 -1
- package/dist/lib/project-context.js.map +1 -1
- package/dist/lib/provision.js +2 -1
- package/dist/lib/provision.js.map +1 -1
- package/dist/lib/rules.js +47 -0
- package/dist/lib/rules.js.map +1 -1
- package/dist/lib/skills.js +4 -4
- package/dist/lib/skills.js.map +1 -1
- package/dist/lib/task-history.js +2 -1
- package/dist/lib/task-history.js.map +1 -1
- package/dist/lib/telemetry.js.map +1 -1
- package/dist/lib/validate-plan-delegate.js +2 -1
- package/dist/lib/validate-plan-delegate.js.map +1 -1
- package/dist/mcp-server.js +4 -5
- package/dist/mcp-server.js.map +1 -1
- package/dist/session-factory.js +19 -0
- package/dist/session-factory.js.map +1 -0
- package/dist/tools/add-checklist.js +63 -0
- package/dist/tools/add-checklist.js.map +1 -0
- package/dist/tools/attach-pr.js +97 -0
- package/dist/tools/attach-pr.js.map +1 -0
- package/dist/tools/comment-task.js +32 -40
- package/dist/tools/comment-task.js.map +1 -1
- package/dist/tools/create-task.js +15 -71
- package/dist/tools/create-task.js.map +1 -1
- package/dist/tools/end-allocation.js +9 -17
- package/dist/tools/end-allocation.js.map +1 -1
- package/dist/tools/end-task-allocation.js +9 -14
- package/dist/tools/end-task-allocation.js.map +1 -1
- package/dist/tools/get-active-allocation.js +9 -39
- package/dist/tools/get-active-allocation.js.map +1 -1
- package/dist/tools/get-context.js +4 -4
- package/dist/tools/get-context.js.map +1 -1
- package/dist/tools/get-task.js +10 -96
- package/dist/tools/get-task.js.map +1 -1
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/list-my-allocations.js +9 -17
- package/dist/tools/list-my-allocations.js.map +1 -1
- package/dist/tools/list-projects.js +3 -3
- package/dist/tools/list-projects.js.map +1 -1
- package/dist/tools/list-tasks.js +25 -138
- package/dist/tools/list-tasks.js.map +1 -1
- package/dist/tools/move-task.js +17 -31
- package/dist/tools/move-task.js.map +1 -1
- package/dist/tools/plan.js +2 -2
- package/dist/tools/plan.js.map +1 -1
- package/dist/tools/record-delivery.js +51 -22
- package/dist/tools/record-delivery.js.map +1 -1
- package/dist/tools/set-project.js +12 -12
- package/dist/tools/set-project.js.map +1 -1
- package/dist/tools/start-allocation.js +7 -10
- package/dist/tools/start-allocation.js.map +1 -1
- package/dist/tools/start-task-allocation.js +14 -60
- package/dist/tools/start-task-allocation.js.map +1 -1
- package/dist/tools/update-task.js +31 -129
- package/dist/tools/update-task.js.map +1 -1
- package/dist/tools/validate-plan.js +2 -2
- package/dist/tools/validate-plan.js.map +1 -1
- package/package.json +2 -1
- package/dist/supabase.js.map +0 -1
package/README.md
CHANGED
|
@@ -45,17 +45,28 @@ Reinicie o cliente de IA depois pra carregar as tools.
|
|
|
45
45
|
|
|
46
46
|
## Comandos do CLI
|
|
47
47
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
|
55
|
-
|
|
|
56
|
-
| `
|
|
57
|
-
| `
|
|
58
|
-
| `
|
|
48
|
+
Operações do CLI, **sem o binário na frente** (declarado no cabeçalho da tabela). Tabela
|
|
49
|
+
gerada da fonte por `bun run gen:docs`.
|
|
50
|
+
|
|
51
|
+
<!-- COMMANDS:START -->
|
|
52
|
+
<!-- gerado por `bun run gen:docs` — não edite à mão. binário `noclaf`, 13 comandos. -->
|
|
53
|
+
|
|
54
|
+
| Comando | Descrição |
|
|
55
|
+
| --- | --- |
|
|
56
|
+
| `clean-legacy` | Remove commands/skills legados (substituídos) de ~/.claude e ~/.codex |
|
|
57
|
+
| `completion [shell]` | Imprime o script de autocomplete (bash\|zsh\|fish). |
|
|
58
|
+
| `exec` | Delega a implementação a um agente headless num worktree e aguarda. |
|
|
59
|
+
| `exec-status <jobId>` | Estado de um job de execução (`noclaf exec`), em JSON |
|
|
60
|
+
| `init` | Cria noclaf.json no diretório atual vinculando a um projeto do NOS |
|
|
61
|
+
| `login [pat]` | Salva o token de acesso pessoal (PAT) localmente |
|
|
62
|
+
| `logout` | Remove credenciais locais |
|
|
63
|
+
| `plan` | Roda o engine pensante sobre o projeto e escreve/refina o plan.md da raiz. |
|
|
64
|
+
| `skills` | Skills, commands e agents do noclaf (lidos do repo aberto via cache) |
|
|
65
|
+
| `skills status` | Lista os docs do repo de skills (cache local ~/.noclaf/skills) |
|
|
66
|
+
| `sync` | Instala/atualiza skills, commands e agents nos clientes configurados, a partir do bundle (idempotente); checa atualização do pacote |
|
|
67
|
+
| `validate-plan` | Lê o plan.md da raiz e roda o engine pensante para julgar se o plano precisa de uma spec antes de implementar. |
|
|
68
|
+
| `whoami` | Mostra o usuário autenticado |
|
|
69
|
+
<!-- COMMANDS:END -->
|
|
59
70
|
|
|
60
71
|
### Autocomplete (tab)
|
|
61
72
|
|
|
@@ -75,54 +86,53 @@ Recarregue o shell e `noclaf <tab>` passa a sugerir comandos, subcomandos e flag
|
|
|
75
86
|
|
|
76
87
|
## Tools disponíveis
|
|
77
88
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
|
89
|
+
Operações do MCP, com o nome **sem o prefixo** (declarado por grupo — o prefixo vem de
|
|
90
|
+
`src/brand.ts`). Tabela gerada da fonte por `bun run gen:docs`.
|
|
91
|
+
|
|
92
|
+
<!-- TOOLS:START -->
|
|
93
|
+
<!-- gerado por `bun run gen:docs` — não edite à mão. 21 tools. -->
|
|
94
|
+
|
|
95
|
+
### Tools de produto — prefixo `nos_`
|
|
96
|
+
|
|
97
|
+
| Operação | O que faz |
|
|
98
|
+
| --- | --- |
|
|
99
|
+
| `attach_pr` | Anexa a URL de um pull request a uma tarefa e a coloca em review: grava `pr_url`, seta `review_state=pending` e move o status pra `code_review`. |
|
|
100
|
+
| `comment_task` | Adiciona um comentário em uma tarefa. |
|
|
101
|
+
| `create_task` | Cria uma nova tarefa no projeto atual. |
|
|
102
|
+
| `end_allocation` | [ENCERRA O DIA] Bate ponto de SAÍDA do usuário e fecha qualquer task_allocation aberta. |
|
|
103
|
+
| `end_task_allocation` | [PARA TIMER DE TASK] Para a task_allocation ativa. |
|
|
104
|
+
| `get_active_allocation` | Retorna o estado atual de cronometragem do usuário: alocação ativa, task atual sendo cronometrada, e segmentos por task na alocação atual. |
|
|
105
|
+
| `get_context` | Retorna o contexto completo do projeto NOS ativo: dados do projeto, repositórios, sprint ativa, membros e usuário autenticado. |
|
|
106
|
+
| `get_task` | Retorna detalhes completos de uma tarefa: descrição, assignees, checklist, comentários, histórico recente, repositórios vinculados e labels. |
|
|
107
|
+
| `list_my_allocations` | Lista alocações passadas do usuário (encerradas), ordenadas por data decrescente. |
|
|
108
|
+
| `list_projects` | Lista os projetos do NOS aos quais você tem acesso. |
|
|
109
|
+
| `list_tasks` | Lista tarefas do projeto atual, filtradas pelos parâmetros opcionais. |
|
|
110
|
+
| `move_task` | Atalho pra mudar o status de uma tarefa (move entre colunas do Kanban). |
|
|
111
|
+
| `record_delivery` | Registra uma ENTREGA do loop de build (um ticket concluído / PR aberto) na analítica de entrega do NOS. |
|
|
112
|
+
| `set_project` | Define o projeto ativo da sessão (em memória, dura enquanto o servidor estiver rodando). |
|
|
113
|
+
| `start_allocation` | Inicia uma alocação (bate o ponto) para o usuário atual. |
|
|
114
|
+
| `start_task_allocation` | Começa a cronometrar tempo numa task específica. |
|
|
115
|
+
| `update_task` | Atualiza campos de uma tarefa existente. |
|
|
116
|
+
|
|
117
|
+
### Tools que espelham o CLI — prefixo `noclaf_`
|
|
118
|
+
|
|
119
|
+
| Operação | O que faz |
|
|
120
|
+
| --- | --- |
|
|
121
|
+
| `delegate_exec` | Delega a IMPLEMENTAÇÃO a um agente de execução novo (codex ou claude local, na assinatura — sem API) num worktree já criado pelo /implement. |
|
|
122
|
+
| `exec_status` | Estado de uma execução delegada (`noclaf_delegate_exec`): running \| done \| failed, com o resumo do agente, os arquivos alterados e os checks determinísticos (tamanho, lint, build, testes). |
|
|
123
|
+
| `plan` | Roda o engine PENSANTE (claude ou codex local, na assinatura — sem API) sobre a raiz do projeto e escreve/refina o `plan.md` de rascunho pré-SDD. |
|
|
124
|
+
| `validate_plan` | Lê o `plan.md` da raiz do projeto e roda o engine PENSANTE (claude ou codex local, na assinatura — sem API) para julgar se o plano é complexo o bastante para virar uma spec SDD antes de implementar. |
|
|
125
|
+
<!-- TOOLS:END -->
|
|
87
126
|
|
|
88
127
|
> **Escopo do projeto.** As tools de tarefa/alocação resolvem o projeto nesta ordem:
|
|
89
|
-
> argumento `project_id` da chamada → projeto ativo da sessão (`
|
|
90
|
-
>
|
|
128
|
+
> argumento `project_id` da chamada → projeto ativo da sessão (`set_project`) → default
|
|
129
|
+
> opcional do binding de repo (`noclaf.json`/`NOCLAF_PROJECT_ID`).
|
|
91
130
|
>
|
|
92
|
-
> O projeto ativo é **por sessão**: vive só em memória, no processo do servidor MCP,
|
|
93
|
-
>
|
|
94
|
-
>
|
|
95
|
-
>
|
|
96
|
-
>
|
|
97
|
-
> uma conversa específica.)
|
|
98
|
-
|
|
99
|
-
### Tarefas
|
|
100
|
-
|
|
101
|
-
| Tool | O que faz |
|
|
102
|
-
| ------------------ | ----------------------------------------------------------------------------- |
|
|
103
|
-
| `nos_list_tasks` | Lista tarefas filtradas por status, assignee, sprint, prioridade, tipo, busca |
|
|
104
|
-
| `nos_get_task` | Detalhes completos de uma tarefa |
|
|
105
|
-
| `nos_create_task` | Cria nova tarefa (default: status=todo, sprint=active, assignee=você) |
|
|
106
|
-
| `nos_update_task` | Atualiza campos de uma tarefa |
|
|
107
|
-
| `nos_move_task` | Atalho pra mudar o status |
|
|
108
|
-
| `nos_comment_task` | Adiciona comentário em uma tarefa |
|
|
109
|
-
|
|
110
|
-
### Alocações (ponto + cronometragem)
|
|
111
|
-
|
|
112
|
-
| Tool | O que faz |
|
|
113
|
-
| --------------------------- | ------------------------------------------------- |
|
|
114
|
-
| `nos_start_allocation` | Bate o ponto |
|
|
115
|
-
| `nos_end_allocation` | Encerra o ponto do dia |
|
|
116
|
-
| `nos_start_task_allocation` | Começa a cronometrar uma task |
|
|
117
|
-
| `nos_end_task_allocation` | Para de cronometrar a task atual |
|
|
118
|
-
| `nos_get_active_allocation` | Estado atual: ponto, task ativa, segmentos do dia |
|
|
119
|
-
| `nos_list_my_allocations` | Histórico de pontos |
|
|
120
|
-
|
|
121
|
-
### Entrega
|
|
122
|
-
|
|
123
|
-
| Tool | O que faz |
|
|
124
|
-
| --------------------- | ------------------------------------------------------------------------- |
|
|
125
|
-
| `nos_record_delivery` | Registra uma entrega do loop `/build` (ticket concluído/PR) pra analítica |
|
|
131
|
+
> O projeto ativo é **por sessão**: vive só em memória, no processo do servidor MCP, e
|
|
132
|
+
> não é gravado em disco — ao reiniciar volta ao default. No Cowork, onde não há binding
|
|
133
|
+
> de repo, é sempre assim que se escolhe o projeto: `list_projects` → `set_project`.
|
|
134
|
+
> (Como um processo do Claude Desktop pode ser compartilhado entre conversas, passe
|
|
135
|
+
> `project_id` direto na chamada quando quiser garantir o escopo de uma conversa.)
|
|
126
136
|
|
|
127
137
|
## Skills, commands e dependências
|
|
128
138
|
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/** Adaptador Supabase do `AllocationGateway` (ponto do dia + timers de task). */
|
|
2
|
+
export function allocationGateway(db) {
|
|
3
|
+
return {
|
|
4
|
+
async startAllocation(userId) {
|
|
5
|
+
const activeRes = await db
|
|
6
|
+
.from('allocations')
|
|
7
|
+
.select('id, start_time')
|
|
8
|
+
.eq('user_id', userId)
|
|
9
|
+
.is('end_time', null)
|
|
10
|
+
.maybeSingle();
|
|
11
|
+
if (activeRes.error)
|
|
12
|
+
throw new Error(`Erro ao buscar alocação ativa: ${activeRes.error.message}`);
|
|
13
|
+
if (activeRes.data)
|
|
14
|
+
return { allocation: activeRes.data, alreadyActive: true };
|
|
15
|
+
const insertRes = await db
|
|
16
|
+
.from('allocations')
|
|
17
|
+
.insert({ user_id: userId })
|
|
18
|
+
.select('id, start_time')
|
|
19
|
+
.single();
|
|
20
|
+
if (insertRes.error)
|
|
21
|
+
throw new Error(`Erro ao iniciar alocação: ${insertRes.error.message}`);
|
|
22
|
+
return { allocation: insertRes.data, alreadyActive: false };
|
|
23
|
+
},
|
|
24
|
+
async endAllocation(userId) {
|
|
25
|
+
const activeRes = await db
|
|
26
|
+
.from('allocations')
|
|
27
|
+
.select('id, start_time')
|
|
28
|
+
.eq('user_id', userId)
|
|
29
|
+
.is('end_time', null)
|
|
30
|
+
.maybeSingle();
|
|
31
|
+
if (activeRes.error)
|
|
32
|
+
throw new Error(`Erro ao buscar alocação ativa: ${activeRes.error.message}`);
|
|
33
|
+
if (!activeRes.data)
|
|
34
|
+
return null;
|
|
35
|
+
const allocationId = activeRes.data.id;
|
|
36
|
+
const now = new Date().toISOString();
|
|
37
|
+
// Fecha task_allocations abertas dessa allocation em paralelo com o close da allocation.
|
|
38
|
+
const [taskCloseRes, allocCloseRes] = await Promise.all([
|
|
39
|
+
db
|
|
40
|
+
.from('task_allocations')
|
|
41
|
+
.update({ end_time: now })
|
|
42
|
+
.eq('allocation_id', allocationId)
|
|
43
|
+
.is('end_time', null)
|
|
44
|
+
.select('id'),
|
|
45
|
+
db
|
|
46
|
+
.from('allocations')
|
|
47
|
+
.update({ end_time: now })
|
|
48
|
+
.eq('id', allocationId)
|
|
49
|
+
.select('id, start_time, end_time')
|
|
50
|
+
.single(),
|
|
51
|
+
]);
|
|
52
|
+
if (taskCloseRes.error)
|
|
53
|
+
throw new Error(`Erro ao fechar task_allocations: ${taskCloseRes.error.message}`);
|
|
54
|
+
if (allocCloseRes.error)
|
|
55
|
+
throw new Error(`Erro ao encerrar alocação: ${allocCloseRes.error.message}`);
|
|
56
|
+
return { closed: allocCloseRes.data, closedTaskAllocations: (taskCloseRes.data ?? []).length };
|
|
57
|
+
},
|
|
58
|
+
async endTaskAllocation(userId) {
|
|
59
|
+
const activeRes = await db
|
|
60
|
+
.from('task_allocations')
|
|
61
|
+
.select('id, task_id, start_time')
|
|
62
|
+
.eq('user_id', userId)
|
|
63
|
+
.is('end_time', null)
|
|
64
|
+
.maybeSingle();
|
|
65
|
+
if (activeRes.error)
|
|
66
|
+
throw new Error(`Erro ao buscar task_allocation ativa: ${activeRes.error.message}`);
|
|
67
|
+
if (!activeRes.data)
|
|
68
|
+
return null;
|
|
69
|
+
const active = activeRes.data;
|
|
70
|
+
const now = new Date().toISOString();
|
|
71
|
+
const closeRes = await db
|
|
72
|
+
.from('task_allocations')
|
|
73
|
+
.update({ end_time: now })
|
|
74
|
+
.eq('id', active.id)
|
|
75
|
+
.select('id, start_time, end_time')
|
|
76
|
+
.single();
|
|
77
|
+
if (closeRes.error)
|
|
78
|
+
throw new Error(`Erro ao parar task_allocation: ${closeRes.error.message}`);
|
|
79
|
+
// Info da task é best-effort (não falha o close se a task sumiu).
|
|
80
|
+
const taskRes = await db
|
|
81
|
+
.from('tasks')
|
|
82
|
+
.select('id, key, title')
|
|
83
|
+
.eq('id', active.task_id)
|
|
84
|
+
.maybeSingle();
|
|
85
|
+
const task = taskRes.data ?? { id: active.task_id, key: null, title: null };
|
|
86
|
+
return { closed: closeRes.data, task };
|
|
87
|
+
},
|
|
88
|
+
async listMyAllocations(userId, opts) {
|
|
89
|
+
let query = db
|
|
90
|
+
.from('allocations')
|
|
91
|
+
.select('id, start_time, end_time, auto_closed')
|
|
92
|
+
.eq('user_id', userId)
|
|
93
|
+
.not('end_time', 'is', null);
|
|
94
|
+
if (opts.from)
|
|
95
|
+
query = query.gte('start_time', `${opts.from.slice(0, 10)}T00:00:00Z`);
|
|
96
|
+
if (opts.to)
|
|
97
|
+
query = query.lte('start_time', `${opts.to.slice(0, 10)}T23:59:59Z`);
|
|
98
|
+
query = query
|
|
99
|
+
.order('start_time', { ascending: false })
|
|
100
|
+
.range(opts.offset, opts.offset + opts.limit - 1);
|
|
101
|
+
const { data, error } = await query;
|
|
102
|
+
if (error)
|
|
103
|
+
throw new Error(`Erro ao listar alocações: ${error.message}`);
|
|
104
|
+
const allocations = data ?? [];
|
|
105
|
+
if (allocations.length === 0)
|
|
106
|
+
return { allocations: [], segments: [] };
|
|
107
|
+
const segRes = await db
|
|
108
|
+
.from('task_allocations')
|
|
109
|
+
.select('allocation_id, start_time, end_time')
|
|
110
|
+
.in('allocation_id', allocations.map((a) => a.id));
|
|
111
|
+
if (segRes.error)
|
|
112
|
+
throw new Error(`Erro ao buscar segmentos: ${segRes.error.message}`);
|
|
113
|
+
return { allocations, segments: segRes.data ?? [] };
|
|
114
|
+
},
|
|
115
|
+
async getActiveAllocation(userId) {
|
|
116
|
+
const allocRes = await db
|
|
117
|
+
.from('allocations')
|
|
118
|
+
.select('id, start_time')
|
|
119
|
+
.eq('user_id', userId)
|
|
120
|
+
.is('end_time', null)
|
|
121
|
+
.maybeSingle();
|
|
122
|
+
if (allocRes.error)
|
|
123
|
+
throw new Error(`Erro ao buscar alocação ativa: ${allocRes.error.message}`);
|
|
124
|
+
if (!allocRes.data)
|
|
125
|
+
return null;
|
|
126
|
+
const allocation = allocRes.data;
|
|
127
|
+
const segmentsRes = await db
|
|
128
|
+
.from('task_allocations')
|
|
129
|
+
.select('id, task_id, start_time, end_time, is_overtime')
|
|
130
|
+
.eq('allocation_id', allocation.id)
|
|
131
|
+
.order('start_time', { ascending: true });
|
|
132
|
+
if (segmentsRes.error)
|
|
133
|
+
throw new Error(`Erro ao buscar segmentos: ${segmentsRes.error.message}`);
|
|
134
|
+
const segments = segmentsRes.data ?? [];
|
|
135
|
+
const { tasksById, projectsById } = await loadTaskAndProjectRefs(db, Array.from(new Set(segments.map((s) => s.task_id))));
|
|
136
|
+
return { allocation, segments, tasksById, projectsById };
|
|
137
|
+
},
|
|
138
|
+
async startTaskAllocation(taskId, projectId, userId, isOvertime) {
|
|
139
|
+
const taskRes = await db
|
|
140
|
+
.from('tasks')
|
|
141
|
+
.select('id, key, title, project_id')
|
|
142
|
+
.eq('id', taskId)
|
|
143
|
+
.eq('project_id', projectId)
|
|
144
|
+
.maybeSingle();
|
|
145
|
+
if (taskRes.error)
|
|
146
|
+
throw new Error(`Erro ao buscar tarefa: ${taskRes.error.message}`);
|
|
147
|
+
if (!taskRes.data)
|
|
148
|
+
return null;
|
|
149
|
+
const task = taskRes.data;
|
|
150
|
+
const now = new Date().toISOString();
|
|
151
|
+
const alloc = await ensureActiveAllocation(db, userId);
|
|
152
|
+
const previousClosed = await closePreviousTaskAllocation(db, userId, now);
|
|
153
|
+
const insertRes = await db
|
|
154
|
+
.from('task_allocations')
|
|
155
|
+
.insert({ allocation_id: alloc.allocationId, task_id: taskId, user_id: userId, start_time: now, is_overtime: isOvertime })
|
|
156
|
+
.select('id, start_time, is_overtime')
|
|
157
|
+
.single();
|
|
158
|
+
if (insertRes.error)
|
|
159
|
+
throw new Error(`Erro ao iniciar task_allocation: ${insertRes.error.message}`);
|
|
160
|
+
return {
|
|
161
|
+
taskAllocation: insertRes.data,
|
|
162
|
+
task: { id: task.id, key: task.key, title: task.title },
|
|
163
|
+
previousClosed,
|
|
164
|
+
allocationWasCreated: alloc.wasCreated,
|
|
165
|
+
};
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
async function loadTaskAndProjectRefs(db, taskIds) {
|
|
170
|
+
const tasksById = new Map();
|
|
171
|
+
const projectsById = new Map();
|
|
172
|
+
if (taskIds.length === 0)
|
|
173
|
+
return { tasksById, projectsById };
|
|
174
|
+
const tasksRes = await db.from('tasks').select('id, key, title, project_id').in('id', taskIds);
|
|
175
|
+
if (tasksRes.error)
|
|
176
|
+
throw new Error(`Erro ao buscar tarefas: ${tasksRes.error.message}`);
|
|
177
|
+
for (const t of tasksRes.data ?? []) {
|
|
178
|
+
tasksById.set(t.id, { key: t.key, title: t.title, project_id: t.project_id });
|
|
179
|
+
}
|
|
180
|
+
const projectIds = Array.from(new Set((tasksRes.data ?? []).map((t) => t.project_id)));
|
|
181
|
+
if (projectIds.length > 0) {
|
|
182
|
+
const projectsRes = await db.from('projects').select('id, name').in('id', projectIds);
|
|
183
|
+
if (projectsRes.error)
|
|
184
|
+
throw new Error(`Erro ao buscar projetos: ${projectsRes.error.message}`);
|
|
185
|
+
for (const p of projectsRes.data ?? [])
|
|
186
|
+
projectsById.set(p.id, p.name);
|
|
187
|
+
}
|
|
188
|
+
return { tasksById, projectsById };
|
|
189
|
+
}
|
|
190
|
+
/** Reaproveita a allocation (ponto) ativa do usuário ou cria uma. */
|
|
191
|
+
async function ensureActiveAllocation(db, userId) {
|
|
192
|
+
const activeAllocRes = await db
|
|
193
|
+
.from('allocations')
|
|
194
|
+
.select('id')
|
|
195
|
+
.eq('user_id', userId)
|
|
196
|
+
.is('end_time', null)
|
|
197
|
+
.maybeSingle();
|
|
198
|
+
if (activeAllocRes.error)
|
|
199
|
+
throw new Error(`Erro ao buscar alocação ativa: ${activeAllocRes.error.message}`);
|
|
200
|
+
if (activeAllocRes.data)
|
|
201
|
+
return { allocationId: activeAllocRes.data.id, wasCreated: false };
|
|
202
|
+
const newAlloc = await db.from('allocations').insert({ user_id: userId }).select('id').single();
|
|
203
|
+
if (newAlloc.error)
|
|
204
|
+
throw new Error(`Erro ao iniciar alocação: ${newAlloc.error.message}`);
|
|
205
|
+
return { allocationId: newAlloc.data.id, wasCreated: true };
|
|
206
|
+
}
|
|
207
|
+
/** Fecha a task_allocation ativa anterior do usuário, se houver. */
|
|
208
|
+
async function closePreviousTaskAllocation(db, userId, now) {
|
|
209
|
+
const activeRes = await db
|
|
210
|
+
.from('task_allocations')
|
|
211
|
+
.select('id, task_id, start_time')
|
|
212
|
+
.eq('user_id', userId)
|
|
213
|
+
.is('end_time', null)
|
|
214
|
+
.maybeSingle();
|
|
215
|
+
if (activeRes.error)
|
|
216
|
+
throw new Error(`Erro ao buscar task_allocation ativa: ${activeRes.error.message}`);
|
|
217
|
+
if (!activeRes.data)
|
|
218
|
+
return null;
|
|
219
|
+
const prev = activeRes.data;
|
|
220
|
+
const closeRes = await db
|
|
221
|
+
.from('task_allocations')
|
|
222
|
+
.update({ end_time: now })
|
|
223
|
+
.eq('id', prev.id)
|
|
224
|
+
.select('id, start_time, end_time')
|
|
225
|
+
.single();
|
|
226
|
+
if (closeRes.error)
|
|
227
|
+
throw new Error(`Erro ao fechar task_allocation anterior: ${closeRes.error.message}`);
|
|
228
|
+
// Key da task anterior é best-effort (retorno informativo).
|
|
229
|
+
const prevTask = await db.from('tasks').select('id, key').eq('id', prev.task_id).maybeSingle();
|
|
230
|
+
return {
|
|
231
|
+
prev: { id: prev.id, task_id: prev.task_id },
|
|
232
|
+
closed: { start_time: closeRes.data.start_time, end_time: closeRes.data.end_time },
|
|
233
|
+
prevTaskKey: prevTask.data?.key ?? null,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=allocation-gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allocation-gateway.js","sourceRoot":"","sources":["../../../src/adapters/supabase/allocation-gateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { track as trackUsage } from '../../lib/telemetry.js';
|
|
2
|
+
/** Adaptador Supabase do `AnalyticsGateway` (entregas + telemetria de uso). */
|
|
3
|
+
export function analyticsGateway(db) {
|
|
4
|
+
return {
|
|
5
|
+
async recordDelivery(row) {
|
|
6
|
+
// `deliveries` ainda não está nos types gerados (rode `gen:types` após a migration)
|
|
7
|
+
// — usamos o client destipado só pra este insert.
|
|
8
|
+
const raw = db;
|
|
9
|
+
const { error } = await raw.from('deliveries').insert(row);
|
|
10
|
+
if (error)
|
|
11
|
+
throw new Error(`Erro ao registrar entrega: ${error.message}`);
|
|
12
|
+
},
|
|
13
|
+
track(event) {
|
|
14
|
+
trackUsage(db, event);
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=analytics-gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics-gateway.js","sourceRoot":"","sources":["../../../src/adapters/supabase/analytics-gateway.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,IAAI,UAAU,EAAmB,MAAM,wBAAwB,CAAC;AAE9E,+EAA+E;AAC/E,MAAM,UAAU,gBAAgB,CAAC,EAAY;IAC3C,OAAO;QACL,KAAK,CAAC,cAAc,CAAC,GAAkB;YACrC,oFAAoF;YACpF,kDAAkD;YAClD,MAAM,GAAG,GAAG,EAA+B,CAAC;YAC5C,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3D,IAAI,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,KAAK,CAAC,KAAiB;YACrB,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACxB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createClient } from '@supabase/supabase-js';
|
|
2
|
-
import { SUPABASE_URL, SUPABASE_ANON_KEY } from '
|
|
3
|
-
import { loadCredentials, exchangePatForJwt } from '
|
|
2
|
+
import { SUPABASE_URL, SUPABASE_ANON_KEY } from '../../constants.js';
|
|
3
|
+
import { loadCredentials, exchangePatForJwt } from '../../auth.js';
|
|
4
|
+
import { brand } from '../../brand.js';
|
|
4
5
|
/**
|
|
5
6
|
* Lê o `exp` (epoch em segundos) do payload de um JWT. Retorna 0 se não der pra
|
|
6
7
|
* parsear — o chamador trata 0 como "sem validade conhecida" e cai no fallback.
|
|
@@ -42,7 +43,7 @@ function computeExp(exchange) {
|
|
|
42
43
|
export async function createAuthenticatedClient() {
|
|
43
44
|
const creds = await loadCredentials();
|
|
44
45
|
if (!creds) {
|
|
45
|
-
throw new Error(
|
|
46
|
+
throw new Error(`Nenhum token encontrado. Rode \`${brand.name} login <PAT>\` antes.`);
|
|
46
47
|
}
|
|
47
48
|
const { pat } = creds;
|
|
48
49
|
const first = await exchangePatForJwt(pat);
|
|
@@ -92,4 +93,4 @@ export async function createAuthenticatedClient() {
|
|
|
92
93
|
});
|
|
93
94
|
return { supabase, user: first.user };
|
|
94
95
|
}
|
|
95
|
-
//# sourceMappingURL=
|
|
96
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/adapters/supabase/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { fetchProjectContext, listMemberProjects } from '../../lib/project-context.js';
|
|
2
|
+
/** Adaptador Supabase do `ContextGateway` (projeto/contexto/membros). */
|
|
3
|
+
export function contextGateway(db) {
|
|
4
|
+
return {
|
|
5
|
+
getContext(config, user) {
|
|
6
|
+
return fetchProjectContext(db, config, user);
|
|
7
|
+
},
|
|
8
|
+
listProjects(userId) {
|
|
9
|
+
return listMemberProjects(db, userId);
|
|
10
|
+
},
|
|
11
|
+
async findProjectById(projectId) {
|
|
12
|
+
const { data, error } = await db
|
|
13
|
+
.from('projects')
|
|
14
|
+
.select('id, name')
|
|
15
|
+
.eq('id', projectId)
|
|
16
|
+
.maybeSingle();
|
|
17
|
+
if (error)
|
|
18
|
+
throw new Error(`Erro ao validar projeto: ${error.message}`);
|
|
19
|
+
return data ?? null;
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=context-gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-gateway.js","sourceRoot":"","sources":["../../../src/adapters/supabase/context-gateway.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAEvF,yEAAyE;AACzE,MAAM,UAAU,cAAc,CAAC,EAAY;IACzC,OAAO;QACL,UAAU,CAAC,MAAqB,EAAE,IAAU;YAC1C,OAAO,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAC/C,CAAC;QAED,YAAY,CAAC,MAAc;YACzB,OAAO,kBAAkB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACxC,CAAC;QAED,KAAK,CAAC,eAAe,CAAC,SAAiB;YACrC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE;iBAC7B,IAAI,CAAC,UAAU,CAAC;iBAChB,MAAM,CAAC,UAAU,CAAC;iBAClB,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC;iBACnB,WAAW,EAAE,CAAC;YACjB,IAAI,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACxE,OAAO,IAAI,IAAI,IAAI,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { contextGateway } from './context-gateway.js';
|
|
2
|
+
import { taskGateway } from './task-gateway.js';
|
|
3
|
+
import { allocationGateway } from './allocation-gateway.js';
|
|
4
|
+
import { analyticsGateway } from './analytics-gateway.js';
|
|
5
|
+
/**
|
|
6
|
+
* Adaptador Supabase da `Gateway`, composto pelos gateways de domínio. Toda query
|
|
7
|
+
* PostgREST vive nos módulos `*-gateway.ts` — este arquivo só junta as peças.
|
|
8
|
+
* Cada método lança `Error` em falha de backend; a tool traduz para `errorResult`.
|
|
9
|
+
*/
|
|
10
|
+
export function createSupabaseGateway(db) {
|
|
11
|
+
return {
|
|
12
|
+
...contextGateway(db),
|
|
13
|
+
...taskGateway(db),
|
|
14
|
+
...allocationGateway(db),
|
|
15
|
+
...analyticsGateway(db),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../../src/adapters/supabase/gateway.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,EAAY;IAChD,OAAO;QACL,GAAG,cAAc,CAAC,EAAE,CAAC;QACrB,GAAG,WAAW,CAAC,EAAE,CAAC;QAClB,GAAG,iBAAiB,CAAC,EAAE,CAAC;QACxB,GAAG,gBAAgB,CAAC,EAAE,CAAC;KACxB,CAAC;AACJ,CAAC"}
|