@noclaf/cli 0.4.14 → 0.4.15
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/dist/auth.js +2 -1
- package/dist/auth.js.map +1 -1
- package/dist/brand.js +82 -0
- package/dist/brand.js.map +1 -0
- package/dist/cli/commands/auth.js +91 -58
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/init/auth-step.js +48 -0
- package/dist/cli/commands/init/auth-step.js.map +1 -0
- package/dist/cli/commands/init/clients-step.js +76 -0
- package/dist/cli/commands/init/clients-step.js.map +1 -0
- package/dist/cli/commands/init/context-step.js +66 -0
- package/dist/cli/commands/init/context-step.js.map +1 -0
- package/dist/cli/commands/init/index.js +67 -0
- package/dist/cli/commands/init/index.js.map +1 -0
- package/dist/cli/commands/init/project-step.js +105 -0
- package/dist/cli/commands/init/project-step.js.map +1 -0
- package/dist/cli/commands/init/provision-step.js +76 -0
- package/dist/cli/commands/init/provision-step.js.map +1 -0
- package/dist/cli/flows/clients.js +27 -17
- package/dist/cli/flows/clients.js.map +1 -1
- package/dist/cli.js +5 -5
- package/dist/cli.js.map +1 -1
- package/dist/config.js +19 -11
- package/dist/config.js.map +1 -1
- package/dist/constants.js +7 -8
- package/dist/constants.js.map +1 -1
- package/dist/lib/autopull.js +13 -0
- package/dist/lib/autopull.js.map +1 -0
- package/dist/lib/client-configs.js +37 -25
- package/dist/lib/client-configs.js.map +1 -1
- package/dist/lib/cowork-extension.js +42 -30
- package/dist/lib/cowork-extension.js.map +1 -1
- package/dist/lib/dependencies.js +83 -247
- package/dist/lib/dependencies.js.map +1 -1
- package/dist/lib/dependency-install.js +163 -0
- package/dist/lib/dependency-install.js.map +1 -0
- package/dist/lib/exec-delegate.js +2 -2
- package/dist/lib/exec-delegate.js.map +1 -1
- package/dist/lib/exec-engines.js +7 -6
- package/dist/lib/exec-engines.js.map +1 -1
- package/dist/lib/provision-apply.js +214 -0
- package/dist/lib/provision-apply.js.map +1 -0
- package/dist/lib/provision-collect.js +47 -0
- package/dist/lib/provision-collect.js.map +1 -0
- package/dist/lib/provision.js +8 -253
- package/dist/lib/provision.js.map +1 -1
- package/dist/lib/require-config.js +3 -2
- package/dist/lib/require-config.js.map +1 -1
- package/dist/lib/skills-cache.js +9 -8
- package/dist/lib/skills-cache.js.map +1 -1
- package/dist/lib/skills.js +30 -16
- package/dist/lib/skills.js.map +1 -1
- package/dist/lib/telemetry.js +2 -1
- package/dist/lib/telemetry.js.map +1 -1
- package/dist/lib/version-check.js +3 -2
- package/dist/lib/version-check.js.map +1 -1
- package/dist/mcp-server.js +107 -79
- package/dist/mcp-server.js.map +1 -1
- package/dist/tools/comment-task.js +32 -32
- package/dist/tools/comment-task.js.map +1 -1
- package/dist/tools/create-task.js +92 -101
- package/dist/tools/create-task.js.map +1 -1
- package/dist/tools/delegate-exec.js +4 -3
- package/dist/tools/delegate-exec.js.map +1 -1
- package/dist/tools/end-allocation.js +19 -32
- package/dist/tools/end-allocation.js.map +1 -1
- package/dist/tools/end-task-allocation.js +17 -26
- package/dist/tools/end-task-allocation.js.map +1 -1
- package/dist/tools/exec-status.js +4 -3
- package/dist/tools/exec-status.js.map +1 -1
- package/dist/tools/get-active-allocation.js +53 -60
- package/dist/tools/get-active-allocation.js.map +1 -1
- package/dist/tools/get-context.js +4 -3
- package/dist/tools/get-context.js.map +1 -1
- package/dist/tools/get-task.js +144 -142
- package/dist/tools/get-task.js.map +1 -1
- package/dist/tools/list-my-allocations.js +35 -43
- package/dist/tools/list-my-allocations.js.map +1 -1
- package/dist/tools/list-projects.js +3 -2
- package/dist/tools/list-projects.js.map +1 -1
- package/dist/tools/list-tasks.js +117 -124
- package/dist/tools/list-tasks.js.map +1 -1
- package/dist/tools/move-task.js +37 -39
- package/dist/tools/move-task.js.map +1 -1
- package/dist/tools/plan.js +3 -2
- package/dist/tools/plan.js.map +1 -1
- package/dist/tools/record-delivery.js +4 -3
- package/dist/tools/record-delivery.js.map +1 -1
- package/dist/tools/set-project.js +9 -4
- package/dist/tools/set-project.js.map +1 -1
- package/dist/tools/start-allocation.js +16 -26
- package/dist/tools/start-allocation.js.map +1 -1
- package/dist/tools/start-task-allocation.js +72 -92
- package/dist/tools/start-task-allocation.js.map +1 -1
- package/dist/tools/update-task.js +149 -168
- package/dist/tools/update-task.js.map +1 -1
- package/dist/tools/validate-plan.js +3 -2
- package/dist/tools/validate-plan.js.map +1 -1
- package/package.json +1 -1
- package/dist/cli/commands/init.js +0 -336
- package/dist/cli/commands/init.js.map +0 -1
- package/dist/logo.js +0 -17
- package/dist/logo.js.map +0 -1
package/dist/tools/move-task.js
CHANGED
|
@@ -2,6 +2,7 @@ import { z } from 'zod';
|
|
|
2
2
|
import { jsonResult, errorResult } from '../lib/tool-result.js';
|
|
3
3
|
import { resolveProjectConfig, isErrorResult } from '../lib/require-config.js';
|
|
4
4
|
import { insertTaskHistory } from '../lib/task-history.js';
|
|
5
|
+
import { brand } from '../brand.js';
|
|
5
6
|
const TASK_STATUS = [
|
|
6
7
|
'backlog',
|
|
7
8
|
'todo',
|
|
@@ -20,9 +21,9 @@ const ArgsSchema = z
|
|
|
20
21
|
})
|
|
21
22
|
.strict();
|
|
22
23
|
export const definition = {
|
|
23
|
-
name:
|
|
24
|
+
name: `${brand.toolPrefix}move_task`,
|
|
24
25
|
description: 'Atalho pra mudar o status de uma tarefa (move entre colunas do Kanban). ' +
|
|
25
|
-
|
|
26
|
+
`Equivale a \`${brand.toolPrefix}update_task\` passando só o campo status. ` +
|
|
26
27
|
'⚠️ Mover para status terminal (done/qa/code_review/rejected/production) NÃO para o timer. ' +
|
|
27
28
|
'Se há task_allocation ativa nessa task, pergunte ao usuário se quer encerrar o timer junto.',
|
|
28
29
|
inputSchema: {
|
|
@@ -33,49 +34,53 @@ export const definition = {
|
|
|
33
34
|
project_id: {
|
|
34
35
|
type: 'string',
|
|
35
36
|
format: 'uuid',
|
|
36
|
-
description:
|
|
37
|
+
description: `Override do projeto. Se omitido, usa o projeto ativo (${brand.toolPrefix}set_project) ou o default.`,
|
|
37
38
|
},
|
|
38
39
|
},
|
|
39
40
|
required: ['task_id', 'status'],
|
|
40
41
|
additionalProperties: false,
|
|
41
42
|
},
|
|
42
43
|
};
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
44
|
+
/** Monta o payload de resposta do move_task, decidindo previous_status/already_in_status. Pura. */
|
|
45
|
+
export function buildMoveTaskResult(current, taskId, status) {
|
|
46
|
+
const alreadyInStatus = current.status === status;
|
|
47
|
+
return {
|
|
48
|
+
task_id: taskId,
|
|
49
|
+
key: current.key,
|
|
50
|
+
title: current.title,
|
|
51
|
+
status,
|
|
52
|
+
previous_status: alreadyInStatus ? status : current.status,
|
|
53
|
+
already_in_status: alreadyInStatus,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
async function loadTaskForMove(supabase, taskId, projectId) {
|
|
53
57
|
const currentRes = await supabase
|
|
54
58
|
.from('tasks')
|
|
55
59
|
.select('id, key, title, status')
|
|
56
|
-
.eq('id',
|
|
57
|
-
.eq('project_id',
|
|
60
|
+
.eq('id', taskId)
|
|
61
|
+
.eq('project_id', projectId)
|
|
58
62
|
.maybeSingle();
|
|
59
63
|
if (currentRes.error)
|
|
60
64
|
return errorResult(`Erro ao buscar tarefa: ${currentRes.error.message}`);
|
|
61
65
|
if (!currentRes.data)
|
|
62
66
|
return errorResult('Tarefa não encontrada ou fora do projeto atual.');
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
}
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
67
|
+
return currentRes.data;
|
|
68
|
+
}
|
|
69
|
+
export async function handler(args, ctx) {
|
|
70
|
+
const parsed = ArgsSchema.safeParse(args);
|
|
71
|
+
if (!parsed.success)
|
|
72
|
+
return errorResult(`Argumento inválido: ${parsed.error.message}`);
|
|
73
|
+
const { task_id, status } = parsed.data;
|
|
74
|
+
const cfg = resolveProjectConfig(ctx, parsed.data.project_id);
|
|
75
|
+
if (isErrorResult(cfg))
|
|
76
|
+
return cfg;
|
|
77
|
+
const { supabase } = ctx;
|
|
78
|
+
const current = await loadTaskForMove(supabase, task_id, cfg.project_id);
|
|
79
|
+
if (isErrorResult(current))
|
|
80
|
+
return current;
|
|
81
|
+
if (current.status === status)
|
|
82
|
+
return jsonResult(buildMoveTaskResult(current, task_id, status));
|
|
83
|
+
const updateRes = await supabase.from('tasks').update({ status }).eq('id', task_id).eq('project_id', cfg.project_id);
|
|
79
84
|
if (updateRes.error)
|
|
80
85
|
return errorResult(`Erro ao mover tarefa: ${updateRes.error.message}`);
|
|
81
86
|
await insertTaskHistory(supabase, {
|
|
@@ -86,13 +91,6 @@ export async function handler(args, ctx) {
|
|
|
86
91
|
old_value: current.status,
|
|
87
92
|
new_value: status,
|
|
88
93
|
});
|
|
89
|
-
return jsonResult(
|
|
90
|
-
task_id,
|
|
91
|
-
key: current.key,
|
|
92
|
-
title: current.title,
|
|
93
|
-
status,
|
|
94
|
-
previous_status: current.status,
|
|
95
|
-
already_in_status: false,
|
|
96
|
-
});
|
|
94
|
+
return jsonResult(buildMoveTaskResult(current, task_id, status));
|
|
97
95
|
}
|
|
98
96
|
//# sourceMappingURL=move-task.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"move-task.js","sourceRoot":"","sources":["../../src/tools/move-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"move-task.js","sourceRoot":"","sources":["../../src/tools/move-task.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/plan.js
CHANGED
|
@@ -3,6 +3,7 @@ import { existsSync } from 'node:fs';
|
|
|
3
3
|
import { jsonResult, errorResult } from '../lib/tool-result.js';
|
|
4
4
|
import { runPlan } from '../lib/plan-delegate.js';
|
|
5
5
|
import { ENGINES, PLAN_ENGINE } from '../lib/exec-engines.js';
|
|
6
|
+
import { brand } from '../brand.js';
|
|
6
7
|
const ArgsSchema = z
|
|
7
8
|
.object({
|
|
8
9
|
project: z.string().min(1),
|
|
@@ -11,10 +12,10 @@ const ArgsSchema = z
|
|
|
11
12
|
})
|
|
12
13
|
.strict();
|
|
13
14
|
export const definition = {
|
|
14
|
-
name:
|
|
15
|
+
name: `${brand.cliToolPrefix}plan`,
|
|
15
16
|
description: 'Roda o engine PENSANTE (claude ou codex local, na assinatura — sem API) sobre a raiz do ' +
|
|
16
17
|
'projeto e escreve/refina o `plan.md` de rascunho pré-SDD. NÃO implementa código, não cria ' +
|
|
17
|
-
|
|
18
|
+
`worktree e não roda checks — pra isso use \`${brand.cliToolPrefix}delegate_exec\`. Se o \`plan.md\` não existe, ` +
|
|
18
19
|
'semeia a partir de um template; se existe, refina o conteúdo atual.',
|
|
19
20
|
inputSchema: {
|
|
20
21
|
type: 'object',
|
package/dist/tools/plan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/tools/plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGrC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/tools/plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGrC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,MAAM,UAAU,GAAG,CAAC;KACjB,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE;CACnC,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,IAAI,EAAE,GAAG,KAAK,CAAC,aAAa,MAAM;IAClC,WAAW,EACT,0FAA0F;QAC1F,4FAA4F;QAC5F,+CAA+C,KAAK,CAAC,aAAa,gDAAgD;QAClH,qEAAqE;IACvE,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,0DAA0D;aACxE;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,2DAA2D;aACzE;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC;gBAClB,WAAW,EAAE,oCAAoC,WAAW,GAAG;aAChE;SACF;QACD,QAAQ,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC;QACpC,oBAAoB,EAAE,KAAK;KAC5B;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAa,EAAE,IAAiB;IAC5D,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,WAAW,CAAC,uBAAuB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IACrD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,WAAW,CAAC,2BAA2B,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/D,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,IAAI,mBAAmB,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,UAAU,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AAC5E,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { jsonResult, errorResult } from '../lib/tool-result.js';
|
|
3
3
|
import { resolveProjectConfig, isErrorResult } from '../lib/require-config.js';
|
|
4
|
+
import { brand, env } from '../brand.js';
|
|
4
5
|
const ArgsSchema = z
|
|
5
6
|
.object({
|
|
6
7
|
title: z.string().min(1),
|
|
@@ -11,7 +12,7 @@ const ArgsSchema = z
|
|
|
11
12
|
})
|
|
12
13
|
.strict();
|
|
13
14
|
export const definition = {
|
|
14
|
-
name:
|
|
15
|
+
name: `${brand.toolPrefix}record_delivery`,
|
|
15
16
|
description: 'Registra uma ENTREGA do loop de build (um ticket concluído / PR aberto) na analítica ' +
|
|
16
17
|
'de entrega do NOS. Chamado pelo `/build` no fecho. Guarda título, PR, iterações e ' +
|
|
17
18
|
'vincula à tarefa/projeto. Uma chamada por ticket entregue.',
|
|
@@ -35,7 +36,7 @@ export const definition = {
|
|
|
35
36
|
project_id: {
|
|
36
37
|
type: 'string',
|
|
37
38
|
format: 'uuid',
|
|
38
|
-
description:
|
|
39
|
+
description: `Override do projeto. Se omitido, usa o ativo (${brand.toolPrefix}set_project) ou o default.`,
|
|
39
40
|
},
|
|
40
41
|
},
|
|
41
42
|
required: ['title'],
|
|
@@ -57,7 +58,7 @@ export async function handler(args, ctx) {
|
|
|
57
58
|
title: parsed.data.title,
|
|
58
59
|
pr_url: parsed.data.pr_url ?? null,
|
|
59
60
|
iterations: parsed.data.iterations ?? null,
|
|
60
|
-
client:
|
|
61
|
+
client: env('CLIENT') ?? null,
|
|
61
62
|
};
|
|
62
63
|
// `deliveries` ainda não está nos types gerados (rode `npm run gen:types` após a
|
|
63
64
|
// migration) — usamos o client destipado só pra este insert.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-delivery.js","sourceRoot":"","sources":["../../src/tools/record-delivery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"record-delivery.js","sourceRoot":"","sources":["../../src/tools/record-delivery.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,25 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { jsonResult, errorResult } from '../lib/tool-result.js';
|
|
3
3
|
import { setActiveProjectId } from '../lib/active-project.js';
|
|
4
|
+
import { brand } from '../brand.js';
|
|
4
5
|
const ArgsSchema = z
|
|
5
6
|
.object({
|
|
6
7
|
project_id: z.string().uuid(),
|
|
7
8
|
})
|
|
8
9
|
.strict();
|
|
9
10
|
export const definition = {
|
|
10
|
-
name:
|
|
11
|
+
name: `${brand.toolPrefix}set_project`,
|
|
11
12
|
description: 'Define o projeto ativo da sessão (em memória, dura enquanto o servidor estiver ' +
|
|
12
13
|
'rodando). As tools de tarefa/alocação passam a operar nesse projeto, até você trocar ' +
|
|
13
|
-
|
|
14
|
+
`de novo. Use \`${brand.toolPrefix}list_projects\` antes para descobrir os ids.`,
|
|
14
15
|
inputSchema: {
|
|
15
16
|
type: 'object',
|
|
16
17
|
properties: {
|
|
17
|
-
project_id: {
|
|
18
|
+
project_id: {
|
|
19
|
+
type: 'string',
|
|
20
|
+
format: 'uuid',
|
|
21
|
+
description: `UUID do projeto (de ${brand.toolPrefix}list_projects).`,
|
|
22
|
+
},
|
|
18
23
|
},
|
|
19
24
|
required: ['project_id'],
|
|
20
25
|
additionalProperties: false,
|
|
@@ -35,7 +40,7 @@ export async function handler(args, ctx) {
|
|
|
35
40
|
if (error)
|
|
36
41
|
return errorResult(`Erro ao validar projeto: ${error.message}`);
|
|
37
42
|
if (!data) {
|
|
38
|
-
return errorResult(
|
|
43
|
+
return errorResult(`Projeto não encontrado ou sem acesso. Confira o id em \`${brand.toolPrefix}list_projects\`.`);
|
|
39
44
|
}
|
|
40
45
|
setActiveProjectId(project_id);
|
|
41
46
|
return jsonResult({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set-project.js","sourceRoot":"","sources":["../../src/tools/set-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"set-project.js","sourceRoot":"","sources":["../../src/tools/set-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,MAAM,UAAU,GAAG,CAAC;KACjB,MAAM,CAAC;IACN,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;CAC9B,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,IAAI,EAAE,GAAG,KAAK,CAAC,UAAU,aAAa;IACtC,WAAW,EACT,iFAAiF;QACjF,uFAAuF;QACvF,kBAAkB,KAAK,CAAC,UAAU,8CAA8C;IAClF,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,uBAAuB,KAAK,CAAC,UAAU,iBAAiB;aACtE;SACF;QACD,QAAQ,EAAE,CAAC,YAAY,CAAC;QACxB,oBAAoB,EAAE,KAAK;KAC5B;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAa,EAAE,GAAgB;IAC3D,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,WAAW,CAAC,uBAAuB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IAEnC,gFAAgF;IAChF,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,GAAG,CAAC,QAAQ;SACvC,IAAI,CAAC,UAAU,CAAC;SAChB,MAAM,CAAC,UAAU,CAAC;SAClB,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC;SACpB,WAAW,EAAE,CAAC;IAEjB,IAAI,KAAK;QAAE,OAAO,WAAW,CAAC,4BAA4B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3E,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,WAAW,CAAC,2DAA2D,KAAK,CAAC,UAAU,kBAAkB,CAAC,CAAC;IACpH,CAAC;IAED,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAE/B,OAAO,UAAU,CAAC;QAChB,iBAAiB,EAAE,IAAI,CAAC,EAAE;QAC1B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,0BAA0B,IAAI,CAAC,IAAI,IAAI;KACjD,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { jsonResult, errorResult } from '../lib/tool-result.js';
|
|
2
2
|
import { durationSeconds } from '../lib/duration.js';
|
|
3
|
+
import { brand } from '../brand.js';
|
|
3
4
|
export const definition = {
|
|
4
|
-
name:
|
|
5
|
+
name: `${brand.toolPrefix}start_allocation`,
|
|
5
6
|
description: 'Inicia uma alocação (bate o ponto) para o usuário atual. Se já existe uma alocação ' +
|
|
6
7
|
'ativa, retorna ela sem criar duplicada.',
|
|
7
8
|
inputSchema: {
|
|
@@ -10,36 +11,25 @@ export const definition = {
|
|
|
10
11
|
additionalProperties: false,
|
|
11
12
|
},
|
|
12
13
|
};
|
|
14
|
+
/** Monta o payload de status de alocação (nova ou já ativa). Pura. */
|
|
15
|
+
export function formatAllocationStatus(row, alreadyActive) {
|
|
16
|
+
return {
|
|
17
|
+
allocation_id: row.id,
|
|
18
|
+
start_time: row.start_time,
|
|
19
|
+
elapsed_seconds: durationSeconds(row.start_time, null),
|
|
20
|
+
already_active: alreadyActive,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
13
23
|
export async function handler(_args, ctx) {
|
|
14
24
|
const { supabase } = ctx;
|
|
15
|
-
const activeRes = await supabase
|
|
16
|
-
.from('allocations')
|
|
17
|
-
.select('id, start_time')
|
|
18
|
-
.eq('user_id', ctx.user.id)
|
|
19
|
-
.is('end_time', null)
|
|
20
|
-
.maybeSingle();
|
|
25
|
+
const activeRes = await supabase.from('allocations').select('id, start_time').eq('user_id', ctx.user.id).is('end_time', null).maybeSingle();
|
|
21
26
|
if (activeRes.error)
|
|
22
27
|
return errorResult(`Erro ao buscar alocação ativa: ${activeRes.error.message}`);
|
|
23
|
-
if (activeRes.data)
|
|
24
|
-
return jsonResult(
|
|
25
|
-
|
|
26
|
-
start_time: activeRes.data.start_time,
|
|
27
|
-
elapsed_seconds: durationSeconds(activeRes.data.start_time, null),
|
|
28
|
-
already_active: true,
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
const insertRes = await supabase
|
|
32
|
-
.from('allocations')
|
|
33
|
-
.insert({ user_id: ctx.user.id })
|
|
34
|
-
.select('id, start_time')
|
|
35
|
-
.single();
|
|
28
|
+
if (activeRes.data)
|
|
29
|
+
return jsonResult(formatAllocationStatus(activeRes.data, true));
|
|
30
|
+
const insertRes = await supabase.from('allocations').insert({ user_id: ctx.user.id }).select('id, start_time').single();
|
|
36
31
|
if (insertRes.error)
|
|
37
32
|
return errorResult(`Erro ao iniciar alocação: ${insertRes.error.message}`);
|
|
38
|
-
return jsonResult(
|
|
39
|
-
allocation_id: insertRes.data.id,
|
|
40
|
-
start_time: insertRes.data.start_time,
|
|
41
|
-
elapsed_seconds: durationSeconds(insertRes.data.start_time, null),
|
|
42
|
-
already_active: false,
|
|
43
|
-
});
|
|
33
|
+
return jsonResult(formatAllocationStatus(insertRes.data, false));
|
|
44
34
|
}
|
|
45
35
|
//# sourceMappingURL=start-allocation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-allocation.js","sourceRoot":"","sources":["../../src/tools/start-allocation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"start-allocation.js","sourceRoot":"","sources":["../../src/tools/start-allocation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,IAAI,EAAE,GAAG,KAAK,CAAC,UAAU,kBAAkB;IAC3C,WAAW,EACT,qFAAqF;QACrF,yCAAyC;IAC3C,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,EAAE;QACd,oBAAoB,EAAE,KAAK;KAC5B;CACF,CAAC;AAEF,sEAAsE;AACtE,MAAM,UAAU,sBAAsB,CACpC,GAAuC,EACvC,aAAsB;IAEtB,OAAO;QACL,aAAa,EAAE,GAAG,CAAC,EAAE;QACrB,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,eAAe,EAAE,eAAe,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC;QACtD,cAAc,EAAE,aAAa;KAC9B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAAc,EAAE,GAAgB;IAC5D,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;IAEzB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5I,IAAI,SAAS,CAAC,KAAK;QAAE,OAAO,WAAW,CAAC,kCAAkC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACrG,IAAI,SAAS,CAAC,IAAI;QAAE,OAAO,UAAU,CAAC,sBAAsB,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAEpF,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,MAAM,EAAE,CAAC;IACxH,IAAI,SAAS,CAAC,KAAK;QAAE,OAAO,WAAW,CAAC,6BAA6B,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAEhG,OAAO,UAAU,CAAC,sBAAsB,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -2,6 +2,7 @@ import { z } from 'zod';
|
|
|
2
2
|
import { jsonResult, errorResult } from '../lib/tool-result.js';
|
|
3
3
|
import { resolveProjectConfig, isErrorResult } from '../lib/require-config.js';
|
|
4
4
|
import { durationSeconds } from '../lib/duration.js';
|
|
5
|
+
import { brand } from '../brand.js';
|
|
5
6
|
const ArgsSchema = z
|
|
6
7
|
.object({
|
|
7
8
|
task_id: z.string().uuid(),
|
|
@@ -10,7 +11,7 @@ const ArgsSchema = z
|
|
|
10
11
|
})
|
|
11
12
|
.strict();
|
|
12
13
|
export const definition = {
|
|
13
|
-
name:
|
|
14
|
+
name: `${brand.toolPrefix}start_task_allocation`,
|
|
14
15
|
description: 'Começa a cronometrar tempo numa task específica. Se não há alocação ativa (ponto do dia), ' +
|
|
15
16
|
'abre uma. Se já existe outra task_allocation ativa, fecha ela e abre essa — ' +
|
|
16
17
|
'transição entre tasks é atômica, basta chamar isso na próxima task.',
|
|
@@ -22,120 +23,99 @@ export const definition = {
|
|
|
22
23
|
project_id: {
|
|
23
24
|
type: 'string',
|
|
24
25
|
format: 'uuid',
|
|
25
|
-
description:
|
|
26
|
+
description: `Override do projeto. Se omitido, usa o projeto ativo (${brand.toolPrefix}set_project) ou o default.`,
|
|
26
27
|
},
|
|
27
28
|
},
|
|
28
29
|
required: ['task_id'],
|
|
29
30
|
additionalProperties: false,
|
|
30
31
|
},
|
|
31
32
|
};
|
|
33
|
+
/** Monta o resumo da task_allocation anterior fechada, calculando a duração. Pura. */
|
|
34
|
+
export function buildClosedPreviousSummary(prev, closed, prevTaskKey) {
|
|
35
|
+
return {
|
|
36
|
+
task_allocation_id: prev.id,
|
|
37
|
+
task_id: prev.task_id,
|
|
38
|
+
task_key: prevTaskKey,
|
|
39
|
+
duration_seconds: durationSeconds(closed.start_time, closed.end_time),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/** Monta o payload de resposta do start_task_allocation. Pura. */
|
|
43
|
+
export function formatStartTaskAllocationResult(taskAllocation, task, closedPrevious, allocationWasCreated) {
|
|
44
|
+
return {
|
|
45
|
+
task_allocation_id: taskAllocation.id,
|
|
46
|
+
task: { id: task.id, key: task.key, title: task.title },
|
|
47
|
+
started_at: taskAllocation.start_time,
|
|
48
|
+
is_overtime: taskAllocation.is_overtime,
|
|
49
|
+
closed_previous: closedPrevious,
|
|
50
|
+
allocation_was_created: allocationWasCreated,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/** Garante uma allocation (ponto) ativa pro usuário — reaproveita ou cria. */
|
|
54
|
+
async function ensureActiveAllocation(supabase, userId) {
|
|
55
|
+
const activeAllocRes = await supabase.from('allocations').select('id').eq('user_id', userId).is('end_time', null).maybeSingle();
|
|
56
|
+
if (activeAllocRes.error)
|
|
57
|
+
return errorResult(`Erro ao buscar alocação ativa: ${activeAllocRes.error.message}`);
|
|
58
|
+
if (activeAllocRes.data)
|
|
59
|
+
return { allocationId: activeAllocRes.data.id, wasCreated: false };
|
|
60
|
+
const newAlloc = await supabase.from('allocations').insert({ user_id: userId }).select('id').single();
|
|
61
|
+
if (newAlloc.error)
|
|
62
|
+
return errorResult(`Erro ao iniciar alocação: ${newAlloc.error.message}`);
|
|
63
|
+
return { allocationId: newAlloc.data.id, wasCreated: true };
|
|
64
|
+
}
|
|
65
|
+
/** Fecha a task_allocation ativa anterior do usuário, se existir. */
|
|
66
|
+
async function closePreviousTaskAllocation(supabase, userId, now) {
|
|
67
|
+
const activeRes = await supabase
|
|
68
|
+
.from('task_allocations')
|
|
69
|
+
.select('id, task_id, start_time')
|
|
70
|
+
.eq('user_id', userId)
|
|
71
|
+
.is('end_time', null)
|
|
72
|
+
.maybeSingle();
|
|
73
|
+
if (activeRes.error)
|
|
74
|
+
return errorResult(`Erro ao buscar task_allocation ativa: ${activeRes.error.message}`);
|
|
75
|
+
if (!activeRes.data)
|
|
76
|
+
return null;
|
|
77
|
+
const prev = activeRes.data;
|
|
78
|
+
const closeRes = await supabase
|
|
79
|
+
.from('task_allocations')
|
|
80
|
+
.update({ end_time: now })
|
|
81
|
+
.eq('id', prev.id)
|
|
82
|
+
.select('id, start_time, end_time')
|
|
83
|
+
.single();
|
|
84
|
+
if (closeRes.error)
|
|
85
|
+
return errorResult(`Erro ao fechar task_allocation anterior: ${closeRes.error.message}`);
|
|
86
|
+
// Pega o key da task anterior pra retorno (best-effort)
|
|
87
|
+
const prevTask = await supabase.from('tasks').select('id, key').eq('id', prev.task_id).maybeSingle();
|
|
88
|
+
return buildClosedPreviousSummary(prev, closeRes.data, prevTask.data?.key ?? null);
|
|
89
|
+
}
|
|
32
90
|
export async function handler(args, ctx) {
|
|
33
91
|
const parsed = ArgsSchema.safeParse(args);
|
|
34
|
-
if (!parsed.success)
|
|
92
|
+
if (!parsed.success)
|
|
35
93
|
return errorResult(`Argumento inválido: ${parsed.error.message}`);
|
|
36
|
-
}
|
|
37
94
|
const { task_id, is_overtime } = parsed.data;
|
|
38
95
|
const cfg = resolveProjectConfig(ctx, parsed.data.project_id);
|
|
39
96
|
if (isErrorResult(cfg))
|
|
40
97
|
return cfg;
|
|
41
98
|
const { supabase } = ctx;
|
|
42
99
|
const now = new Date().toISOString();
|
|
43
|
-
|
|
44
|
-
const taskRes = await supabase
|
|
45
|
-
.from('tasks')
|
|
46
|
-
.select('id, key, title, project_id')
|
|
47
|
-
.eq('id', task_id)
|
|
48
|
-
.eq('project_id', cfg.project_id)
|
|
49
|
-
.maybeSingle();
|
|
100
|
+
const taskRes = await supabase.from('tasks').select('id, key, title, project_id').eq('id', task_id).eq('project_id', cfg.project_id).maybeSingle();
|
|
50
101
|
if (taskRes.error)
|
|
51
102
|
return errorResult(`Erro ao buscar tarefa: ${taskRes.error.message}`);
|
|
52
|
-
if (!taskRes.data)
|
|
103
|
+
if (!taskRes.data)
|
|
53
104
|
return errorResult('Tarefa não encontrada ou fora do projeto vinculado a este diretório.');
|
|
54
|
-
}
|
|
55
105
|
const task = taskRes.data;
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
.eq('user_id', ctx.user.id)
|
|
63
|
-
.is('end_time', null)
|
|
64
|
-
.maybeSingle();
|
|
65
|
-
if (activeAllocRes.error) {
|
|
66
|
-
return errorResult(`Erro ao buscar alocação ativa: ${activeAllocRes.error.message}`);
|
|
67
|
-
}
|
|
68
|
-
if (activeAllocRes.data) {
|
|
69
|
-
allocationId = activeAllocRes.data.id;
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
const newAlloc = await supabase
|
|
73
|
-
.from('allocations')
|
|
74
|
-
.insert({ user_id: ctx.user.id })
|
|
75
|
-
.select('id')
|
|
76
|
-
.single();
|
|
77
|
-
if (newAlloc.error)
|
|
78
|
-
return errorResult(`Erro ao iniciar alocação: ${newAlloc.error.message}`);
|
|
79
|
-
allocationId = newAlloc.data.id;
|
|
80
|
-
allocationWasCreated = true;
|
|
81
|
-
}
|
|
82
|
-
// Fecha task_allocation ativa anterior (se existir)
|
|
83
|
-
const activeTaskAllocRes = await supabase
|
|
84
|
-
.from('task_allocations')
|
|
85
|
-
.select('id, task_id, start_time')
|
|
86
|
-
.eq('user_id', ctx.user.id)
|
|
87
|
-
.is('end_time', null)
|
|
88
|
-
.maybeSingle();
|
|
89
|
-
if (activeTaskAllocRes.error) {
|
|
90
|
-
return errorResult(`Erro ao buscar task_allocation ativa: ${activeTaskAllocRes.error.message}`);
|
|
91
|
-
}
|
|
92
|
-
let closedPrevious = null;
|
|
93
|
-
if (activeTaskAllocRes.data) {
|
|
94
|
-
const prev = activeTaskAllocRes.data;
|
|
95
|
-
const closeRes = await supabase
|
|
96
|
-
.from('task_allocations')
|
|
97
|
-
.update({ end_time: now })
|
|
98
|
-
.eq('id', prev.id)
|
|
99
|
-
.select('id, start_time, end_time')
|
|
100
|
-
.single();
|
|
101
|
-
if (closeRes.error) {
|
|
102
|
-
return errorResult(`Erro ao fechar task_allocation anterior: ${closeRes.error.message}`);
|
|
103
|
-
}
|
|
104
|
-
// Pega o key da task anterior pra retorno (best-effort)
|
|
105
|
-
const prevTask = await supabase
|
|
106
|
-
.from('tasks')
|
|
107
|
-
.select('id, key')
|
|
108
|
-
.eq('id', prev.task_id)
|
|
109
|
-
.maybeSingle();
|
|
110
|
-
closedPrevious = {
|
|
111
|
-
task_allocation_id: prev.id,
|
|
112
|
-
task_id: prev.task_id,
|
|
113
|
-
task_key: prevTask.data?.key ?? null,
|
|
114
|
-
duration_seconds: durationSeconds(closeRes.data.start_time, closeRes.data.end_time),
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
// Insert nova task_allocation
|
|
106
|
+
const alloc = await ensureActiveAllocation(supabase, ctx.user.id);
|
|
107
|
+
if (isErrorResult(alloc))
|
|
108
|
+
return alloc;
|
|
109
|
+
const closedPrevious = await closePreviousTaskAllocation(supabase, ctx.user.id, now);
|
|
110
|
+
if (isErrorResult(closedPrevious))
|
|
111
|
+
return closedPrevious;
|
|
118
112
|
const insertRes = await supabase
|
|
119
113
|
.from('task_allocations')
|
|
120
|
-
.insert({
|
|
121
|
-
allocation_id: allocationId,
|
|
122
|
-
task_id,
|
|
123
|
-
user_id: ctx.user.id,
|
|
124
|
-
start_time: now,
|
|
125
|
-
is_overtime,
|
|
126
|
-
})
|
|
114
|
+
.insert({ allocation_id: alloc.allocationId, task_id, user_id: ctx.user.id, start_time: now, is_overtime })
|
|
127
115
|
.select('id, start_time, is_overtime')
|
|
128
116
|
.single();
|
|
129
|
-
if (insertRes.error)
|
|
117
|
+
if (insertRes.error)
|
|
130
118
|
return errorResult(`Erro ao iniciar task_allocation: ${insertRes.error.message}`);
|
|
131
|
-
|
|
132
|
-
return jsonResult({
|
|
133
|
-
task_allocation_id: insertRes.data.id,
|
|
134
|
-
task: { id: task.id, key: task.key, title: task.title },
|
|
135
|
-
started_at: insertRes.data.start_time,
|
|
136
|
-
is_overtime: insertRes.data.is_overtime,
|
|
137
|
-
closed_previous: closedPrevious,
|
|
138
|
-
allocation_was_created: allocationWasCreated,
|
|
139
|
-
});
|
|
119
|
+
return jsonResult(formatStartTaskAllocationResult(insertRes.data, task, closedPrevious, alloc.wasCreated));
|
|
140
120
|
}
|
|
141
121
|
//# sourceMappingURL=start-task-allocation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-task-allocation.js","sourceRoot":"","sources":["../../src/tools/start-task-allocation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"start-task-allocation.js","sourceRoot":"","sources":["../../src/tools/start-task-allocation.ts"],"names":[],"mappings":"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"}
|