@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.
Files changed (125) hide show
  1. package/README.md +66 -56
  2. package/dist/adapters/supabase/allocation-gateway.js +236 -0
  3. package/dist/adapters/supabase/allocation-gateway.js.map +1 -0
  4. package/dist/adapters/supabase/analytics-gateway.js +18 -0
  5. package/dist/adapters/supabase/analytics-gateway.js.map +1 -0
  6. package/dist/{supabase.js → adapters/supabase/client.js} +5 -4
  7. package/dist/adapters/supabase/client.js.map +1 -0
  8. package/dist/adapters/supabase/context-gateway.js +23 -0
  9. package/dist/adapters/supabase/context-gateway.js.map +1 -0
  10. package/dist/adapters/supabase/gateway.js +18 -0
  11. package/dist/adapters/supabase/gateway.js.map +1 -0
  12. package/dist/adapters/supabase/task-gateway.js +494 -0
  13. package/dist/adapters/supabase/task-gateway.js.map +1 -0
  14. package/dist/brand.js +4 -1
  15. package/dist/brand.js.map +1 -1
  16. package/dist/cli/commands/auth.js +2 -2
  17. package/dist/cli/commands/auth.js.map +1 -1
  18. package/dist/cli/commands/completion.js +17 -14
  19. package/dist/cli/commands/completion.js.map +1 -1
  20. package/dist/cli/commands/exec.js +38 -27
  21. package/dist/cli/commands/exec.js.map +1 -1
  22. package/dist/cli/commands/init/auth-step.js +1 -1
  23. package/dist/cli/commands/init/auth-step.js.map +1 -1
  24. package/dist/cli/commands/init/context-step.js +10 -7
  25. package/dist/cli/commands/init/context-step.js.map +1 -1
  26. package/dist/cli/commands/init/index.js +2 -1
  27. package/dist/cli/commands/init/index.js.map +1 -1
  28. package/dist/cli/commands/init/project-step.js.map +1 -1
  29. package/dist/cli/commands/plan.js +2 -2
  30. package/dist/cli/commands/plan.js.map +1 -1
  31. package/dist/cli/commands/skills.js +3 -2
  32. package/dist/cli/commands/skills.js.map +1 -1
  33. package/dist/cli/commands/sync.js +11 -8
  34. package/dist/cli/commands/sync.js.map +1 -1
  35. package/dist/cli/commands/validate-plan.js +2 -2
  36. package/dist/cli/commands/validate-plan.js.map +1 -1
  37. package/dist/cli/flows/clients.js +2 -2
  38. package/dist/cli/flows/clients.js.map +1 -1
  39. package/dist/cli/flows/completion.js +6 -5
  40. package/dist/cli/flows/completion.js.map +1 -1
  41. package/dist/cli/flows/user-config.js +4 -3
  42. package/dist/cli/flows/user-config.js.map +1 -1
  43. package/dist/cli/ui/render.js +4 -1
  44. package/dist/cli/ui/render.js.map +1 -1
  45. package/dist/config.js +28 -10
  46. package/dist/config.js.map +1 -1
  47. package/dist/core/ports.js +2 -0
  48. package/dist/core/ports.js.map +1 -0
  49. package/dist/core/types.js +7 -0
  50. package/dist/core/types.js.map +1 -0
  51. package/dist/lib/cowork-extension.js +1 -1
  52. package/dist/lib/cowork-extension.js.map +1 -1
  53. package/dist/lib/exec-delegate.js +72 -22
  54. package/dist/lib/exec-delegate.js.map +1 -1
  55. package/dist/lib/exec-engines.js +21 -3
  56. package/dist/lib/exec-engines.js.map +1 -1
  57. package/dist/lib/exec-events.js +80 -0
  58. package/dist/lib/exec-events.js.map +1 -0
  59. package/dist/lib/exec-translators.js +175 -0
  60. package/dist/lib/exec-translators.js.map +1 -0
  61. package/dist/lib/harness.js +36 -3
  62. package/dist/lib/harness.js.map +1 -1
  63. package/dist/lib/plan-delegate.js +15 -3
  64. package/dist/lib/plan-delegate.js.map +1 -1
  65. package/dist/lib/project-context.js +2 -1
  66. package/dist/lib/project-context.js.map +1 -1
  67. package/dist/lib/provision.js +2 -1
  68. package/dist/lib/provision.js.map +1 -1
  69. package/dist/lib/rules.js +47 -0
  70. package/dist/lib/rules.js.map +1 -1
  71. package/dist/lib/skills.js +4 -4
  72. package/dist/lib/skills.js.map +1 -1
  73. package/dist/lib/task-history.js +2 -1
  74. package/dist/lib/task-history.js.map +1 -1
  75. package/dist/lib/telemetry.js.map +1 -1
  76. package/dist/lib/validate-plan-delegate.js +2 -1
  77. package/dist/lib/validate-plan-delegate.js.map +1 -1
  78. package/dist/mcp-server.js +4 -5
  79. package/dist/mcp-server.js.map +1 -1
  80. package/dist/session-factory.js +19 -0
  81. package/dist/session-factory.js.map +1 -0
  82. package/dist/tools/add-checklist.js +63 -0
  83. package/dist/tools/add-checklist.js.map +1 -0
  84. package/dist/tools/attach-pr.js +97 -0
  85. package/dist/tools/attach-pr.js.map +1 -0
  86. package/dist/tools/comment-task.js +32 -40
  87. package/dist/tools/comment-task.js.map +1 -1
  88. package/dist/tools/create-task.js +15 -71
  89. package/dist/tools/create-task.js.map +1 -1
  90. package/dist/tools/end-allocation.js +9 -17
  91. package/dist/tools/end-allocation.js.map +1 -1
  92. package/dist/tools/end-task-allocation.js +9 -14
  93. package/dist/tools/end-task-allocation.js.map +1 -1
  94. package/dist/tools/get-active-allocation.js +9 -39
  95. package/dist/tools/get-active-allocation.js.map +1 -1
  96. package/dist/tools/get-context.js +4 -4
  97. package/dist/tools/get-context.js.map +1 -1
  98. package/dist/tools/get-task.js +10 -96
  99. package/dist/tools/get-task.js.map +1 -1
  100. package/dist/tools/index.js +4 -0
  101. package/dist/tools/index.js.map +1 -1
  102. package/dist/tools/list-my-allocations.js +9 -17
  103. package/dist/tools/list-my-allocations.js.map +1 -1
  104. package/dist/tools/list-projects.js +3 -3
  105. package/dist/tools/list-projects.js.map +1 -1
  106. package/dist/tools/list-tasks.js +25 -138
  107. package/dist/tools/list-tasks.js.map +1 -1
  108. package/dist/tools/move-task.js +17 -31
  109. package/dist/tools/move-task.js.map +1 -1
  110. package/dist/tools/plan.js +2 -2
  111. package/dist/tools/plan.js.map +1 -1
  112. package/dist/tools/record-delivery.js +51 -22
  113. package/dist/tools/record-delivery.js.map +1 -1
  114. package/dist/tools/set-project.js +12 -12
  115. package/dist/tools/set-project.js.map +1 -1
  116. package/dist/tools/start-allocation.js +7 -10
  117. package/dist/tools/start-allocation.js.map +1 -1
  118. package/dist/tools/start-task-allocation.js +14 -60
  119. package/dist/tools/start-task-allocation.js.map +1 -1
  120. package/dist/tools/update-task.js +31 -129
  121. package/dist/tools/update-task.js.map +1 -1
  122. package/dist/tools/validate-plan.js +2 -2
  123. package/dist/tools/validate-plan.js.map +1 -1
  124. package/package.json +2 -1
  125. 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
- | Comando | Descrição |
49
- | ---------------------------------------------------- | -------------------------------------------------------- |
50
- | `noclaf init` | Faz tudo: autentica, vincula projeto, configura clientes |
51
- | `noclaf login [pat]` | Salva o PAT (interativo se omitido) |
52
- | `noclaf logout` | Apaga as credenciais |
53
- | `noclaf whoami` | Mostra o usuário autenticado |
54
- | `noclaf skills status` | Lista os docs do repo aberto de skills (via cache) |
55
- | `noclaf sync` | Atualiza o cache de skills e provisiona skills/commands/agents/hooks pros clientes configurados; checa atualização do CLI |
56
- | `noclaf clean-legacy` | Remove commands/skills **legados** (substituídos) de `~/.claude` e `~/.codex` (`--dry-run`, `-y`) |
57
- | `noclaf completion [bash\|zsh\|fish]` | Imprime o script de autocomplete do shell (`tab` → sugestões) |
58
- | `noclaf --version` | Imprime a versão |
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
- 16 tools no MCP, divididas em cinco grupos.
79
-
80
- ### Projeto
81
-
82
- | Tool | O que faz |
83
- | ------------------- | ------------------------------------------------------------------------ |
84
- | `nos_get_context` | Snapshot do projeto ativo: nome, repos, sprint ativa, membros, você |
85
- | `nos_list_projects` | Lista os projetos que você acessa (marca o ativo) |
86
- | `nos_set_project` | Define o **projeto ativo da sessão** (só em memória, dura enquanto o servidor roda) |
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 (`nos_set_project`) →
90
- > default opcional de CLI de código (`noclaf.json`/`NOCLAF_PROJECT_ID`).
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
- > e não é gravado em disco — ao reiniciar volta ao default. No Cowork, onde não há
94
- > `noclaf.json`, é sempre assim que se escolhe o projeto: `nos_list_projects` →
95
- > `nos_set_project`. (Como um processo do Claude Desktop pode ser compartilhado entre
96
- > conversas, passe `project_id` direto na chamada quando quiser garantir o escopo de
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 './constants.js';
3
- import { loadCredentials, exchangePatForJwt } from './auth.js';
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('Nenhum token encontrado. Rode `noclaf login <PAT>` antes.');
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=supabase.js.map
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"}