@noclaf/cli 0.4.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 (120) hide show
  1. package/README.md +221 -0
  2. package/dist/auth.js +66 -0
  3. package/dist/auth.js.map +1 -0
  4. package/dist/cli/commands/auth.js +76 -0
  5. package/dist/cli/commands/auth.js.map +1 -0
  6. package/dist/cli/commands/init.js +291 -0
  7. package/dist/cli/commands/init.js.map +1 -0
  8. package/dist/cli/commands/skills.js +22 -0
  9. package/dist/cli/commands/skills.js.map +1 -0
  10. package/dist/cli/commands/sync.js +170 -0
  11. package/dist/cli/commands/sync.js.map +1 -0
  12. package/dist/cli/copy/auth.json +6 -0
  13. package/dist/cli/copy/flows.json +6 -0
  14. package/dist/cli/copy/init.json +19 -0
  15. package/dist/cli/copy/sync.json +3 -0
  16. package/dist/cli/copy.js +23 -0
  17. package/dist/cli/copy.js.map +1 -0
  18. package/dist/cli/flows/clients.js +108 -0
  19. package/dist/cli/flows/clients.js.map +1 -0
  20. package/dist/cli/flows/dependencies.js +68 -0
  21. package/dist/cli/flows/dependencies.js.map +1 -0
  22. package/dist/cli/flows/sections.js +45 -0
  23. package/dist/cli/flows/sections.js.map +1 -0
  24. package/dist/cli/ui/render.js +167 -0
  25. package/dist/cli/ui/render.js.map +1 -0
  26. package/dist/cli.js +25 -0
  27. package/dist/cli.js.map +1 -0
  28. package/dist/config.js +96 -0
  29. package/dist/config.js.map +1 -0
  30. package/dist/constants.js +10 -0
  31. package/dist/constants.js.map +1 -0
  32. package/dist/database.types.js +11 -0
  33. package/dist/database.types.js.map +1 -0
  34. package/dist/lib/active-project.js +28 -0
  35. package/dist/lib/active-project.js.map +1 -0
  36. package/dist/lib/client-configs.js +179 -0
  37. package/dist/lib/client-configs.js.map +1 -0
  38. package/dist/lib/client-install.js +40 -0
  39. package/dist/lib/client-install.js.map +1 -0
  40. package/dist/lib/colors.js +67 -0
  41. package/dist/lib/colors.js.map +1 -0
  42. package/dist/lib/cowork-extension.js +131 -0
  43. package/dist/lib/cowork-extension.js.map +1 -0
  44. package/dist/lib/dependencies.js +159 -0
  45. package/dist/lib/dependencies.js.map +1 -0
  46. package/dist/lib/duration.js +5 -0
  47. package/dist/lib/duration.js.map +1 -0
  48. package/dist/lib/file-merge.js +33 -0
  49. package/dist/lib/file-merge.js.map +1 -0
  50. package/dist/lib/hooks.js +231 -0
  51. package/dist/lib/hooks.js.map +1 -0
  52. package/dist/lib/project-context.js +105 -0
  53. package/dist/lib/project-context.js.map +1 -0
  54. package/dist/lib/prompts.js +62 -0
  55. package/dist/lib/prompts.js.map +1 -0
  56. package/dist/lib/provision.js +222 -0
  57. package/dist/lib/provision.js.map +1 -0
  58. package/dist/lib/require-config.js +31 -0
  59. package/dist/lib/require-config.js.map +1 -0
  60. package/dist/lib/sections.js +85 -0
  61. package/dist/lib/sections.js.map +1 -0
  62. package/dist/lib/skill-serve.js +71 -0
  63. package/dist/lib/skill-serve.js.map +1 -0
  64. package/dist/lib/skills-cache.js +89 -0
  65. package/dist/lib/skills-cache.js.map +1 -0
  66. package/dist/lib/skills.js +219 -0
  67. package/dist/lib/skills.js.map +1 -0
  68. package/dist/lib/targets.js +150 -0
  69. package/dist/lib/targets.js.map +1 -0
  70. package/dist/lib/task-history.js +14 -0
  71. package/dist/lib/task-history.js.map +1 -0
  72. package/dist/lib/telemetry.js +32 -0
  73. package/dist/lib/telemetry.js.map +1 -0
  74. package/dist/lib/tool-result.js +12 -0
  75. package/dist/lib/tool-result.js.map +1 -0
  76. package/dist/lib/version-check.js +88 -0
  77. package/dist/lib/version-check.js.map +1 -0
  78. package/dist/logo.js +17 -0
  79. package/dist/logo.js.map +1 -0
  80. package/dist/mcp-server.js +162 -0
  81. package/dist/mcp-server.js.map +1 -0
  82. package/dist/spinner.js +12 -0
  83. package/dist/spinner.js.map +1 -0
  84. package/dist/supabase.js +95 -0
  85. package/dist/supabase.js.map +1 -0
  86. package/dist/tools/comment-task.js +80 -0
  87. package/dist/tools/comment-task.js.map +1 -0
  88. package/dist/tools/create-task.js +194 -0
  89. package/dist/tools/create-task.js.map +1 -0
  90. package/dist/tools/end-allocation.js +59 -0
  91. package/dist/tools/end-allocation.js.map +1 -0
  92. package/dist/tools/end-task-allocation.js +51 -0
  93. package/dist/tools/end-task-allocation.js.map +1 -0
  94. package/dist/tools/get-active-allocation.js +106 -0
  95. package/dist/tools/get-active-allocation.js.map +1 -0
  96. package/dist/tools/get-context.js +47 -0
  97. package/dist/tools/get-context.js.map +1 -0
  98. package/dist/tools/get-task.js +223 -0
  99. package/dist/tools/get-task.js.map +1 -0
  100. package/dist/tools/index.js +34 -0
  101. package/dist/tools/index.js.map +1 -0
  102. package/dist/tools/list-my-allocations.js +87 -0
  103. package/dist/tools/list-my-allocations.js.map +1 -0
  104. package/dist/tools/list-projects.js +34 -0
  105. package/dist/tools/list-projects.js.map +1 -0
  106. package/dist/tools/list-tasks.js +213 -0
  107. package/dist/tools/list-tasks.js.map +1 -0
  108. package/dist/tools/move-task.js +98 -0
  109. package/dist/tools/move-task.js.map +1 -0
  110. package/dist/tools/set-project.js +47 -0
  111. package/dist/tools/set-project.js.map +1 -0
  112. package/dist/tools/start-allocation.js +45 -0
  113. package/dist/tools/start-allocation.js.map +1 -0
  114. package/dist/tools/start-task-allocation.js +141 -0
  115. package/dist/tools/start-task-allocation.js.map +1 -0
  116. package/dist/tools/update-task.js +256 -0
  117. package/dist/tools/update-task.js.map +1 -0
  118. package/dist/version.js +16 -0
  119. package/dist/version.js.map +1 -0
  120. package/package.json +62 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/lib/version-check.ts"],"names":[],"mappings":"AAAA,OAAO,cAAmC,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,SAAS,OAAO;IACd,iFAAiF;IACjF,2FAA2F;IAC3F,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IACvD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAsC,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAEvC;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,OAAO,cAAc,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,UAAU,EAAE,CAAC,CAAC;AAClE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;QACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,oEAAoE;IACtE,CAAC;AACH,CAAC;AASD,yEAAyE;AACzE,SAAS,QAAQ,CAAC,CAAS,EAAE,CAAS;IACpC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACvE,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACvE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7C,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IAChD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,SAAS,GAAG,IAAI;IACnD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;QACtB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;QAC9D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,8BAA8B,GAAG,CAAC,IAAI,SAAS,EAAE;YACvE,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;SACxC,CAAC,CAAC;QACH,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAyB,CAAC;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;IACpG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB;IACrC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;QACrC,MAAM,MAAM,GAA2B,QAAQ,CAAC,MAAM,CAAC;QACvD,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC;YAC/C,OAAO,CAAC,KAAK,CACX,wCAAwC,MAAM,CAAC,OAAO,MAAM,MAAM,CAAC,MAAM,IAAI;gBAC3E,oCAAoC,CACvC,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;AACH,CAAC"}
package/dist/logo.js ADDED
@@ -0,0 +1,17 @@
1
+ export const LOGO = `
2
+ _ _ _ __
3
+ | \\ | | ___ ___| | __ _ / _|
4
+ | \\| |/ _ \\ / __| |/ _\` | |_
5
+ | |\\ | (_) | (__| | (_| | _|
6
+ |_|_\\_|\\___/ \\___|_|\\__,_|_|_ _
7
+ / _ \\ _ __ ___ _ __ __ _| |_(_) ___ _ __
8
+ | | | | '_ \\ / _ \\ '__/ _\` | __| |/ _ \\| '_ \\
9
+ | |_| | |_) | __/ | | (_| | |_| | (_) | | | |
10
+ \\___/| .__/ \\___|_| \\__,_|\\__|_|\\___/|_| |_|
11
+ / ___||_| _ ___| |_ ___ _ __ ___
12
+ \\___ \\| | | / __| __/ _ \\ '_ \` _ \\
13
+ ___) | |_| \\__ \\ || __/ | | | | |
14
+ |____/ \\__, |___/\\__\\___|_| |_| |_|
15
+ |___/
16
+ `;
17
+ //# sourceMappingURL=logo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logo.js","sourceRoot":"","sources":["../src/logo.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;CAenB,CAAC"}
@@ -0,0 +1,162 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
5
+ import { VERSION } from './version.js';
6
+ import { loadProjectConfig } from './config.js';
7
+ import { createAuthenticatedClient } from './supabase.js';
8
+ import { tools, toolDefinitions } from './tools/index.js';
9
+ import { errorResult } from './lib/tool-result.js';
10
+ import { notifyMcpServerIfUpdate } from './lib/version-check.js';
11
+ import { filterSkillsForSurface } from './lib/skills.js';
12
+ import { loadSkills, skillResourceDescriptors, readSkillResource, skillPromptDescriptors, buildSkillPrompt, } from './lib/skill-serve.js';
13
+ import { provision } from './lib/provision.js';
14
+ import { provisionHooks } from './lib/hooks.js';
15
+ import { claudeTarget, codexTarget } from './lib/targets.js';
16
+ import { ensureSkillsCache } from './lib/skills-cache.js';
17
+ import { track } from './lib/telemetry.js';
18
+ async function main() {
19
+ let projectConfig = null;
20
+ try {
21
+ projectConfig = loadProjectConfig();
22
+ }
23
+ catch (err) {
24
+ console.error(`[noclaf-cli] noclaf.json inválido: ${err.message}`);
25
+ }
26
+ // Skills vêm de um repo aberto → garante o cache local (~/.noclaf/skills) antes
27
+ // de servir/auto-pull. Baixa só se ausente; best-effort (offline → degrada).
28
+ try {
29
+ const r = await ensureSkillsCache();
30
+ if (r.status === 'fetched') {
31
+ console.error(`[noclaf-cli] skills baixadas (${r.repo}@${r.ref})`);
32
+ }
33
+ else if (r.status === 'failed') {
34
+ console.error(`[noclaf-cli] aviso: skills indisponíveis: ${r.error}`);
35
+ }
36
+ }
37
+ catch (err) {
38
+ console.error(`[noclaf-cli] aviso: cache de skills pulado: ${err.message}`);
39
+ }
40
+ let session = null;
41
+ try {
42
+ session = await createAuthenticatedClient();
43
+ console.error(`[noclaf-cli] autenticado como ${session.user.email}`);
44
+ }
45
+ catch (err) {
46
+ console.error(`[noclaf-cli] aviso: ${err.message}`);
47
+ }
48
+ const server = new Server({ name: 'noclaf-cli', version: VERSION }, { capabilities: { tools: {}, resources: {}, prompts: {} } });
49
+ // Surface deste worker (pra filtro de visibilidade `clients:`). Cowork seta
50
+ // NOCLAF_CLIENT=cowork; Claude Code costuma deixar vazio → sem filtro (mostra tudo).
51
+ const surface = process.env.NOCLAF_CLIENT || null;
52
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
53
+ tools: toolDefinitions,
54
+ }));
55
+ // Resources: o conhecimento (skills/commands/agents) do pacote @noclaf/skills.
56
+ // Deixa o worker de IA ler os artefatos sob demanda, mesmo sem rodar `noclaf sync`.
57
+ server.setRequestHandler(ListResourcesRequestSchema, async () => {
58
+ try {
59
+ const { docs } = loadSkills();
60
+ return { resources: skillResourceDescriptors(filterSkillsForSurface(docs, surface)) };
61
+ }
62
+ catch (err) {
63
+ console.error(`[noclaf-cli] aviso: skills indisponíveis: ${err.message}`);
64
+ return { resources: [] };
65
+ }
66
+ });
67
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
68
+ const { docs, rawByPath } = loadSkills();
69
+ const r = readSkillResource(request.params.uri, filterSkillsForSurface(docs, surface), rawByPath);
70
+ return { contents: [{ uri: r.uri, mimeType: r.mimeType, text: r.text }] };
71
+ });
72
+ // Prompts: commands/skills como prompts invocáveis. Funciona no Claude Code E no
73
+ // Cowork (que não lê `~/.claude`) — é o caminho de slash-command lá.
74
+ server.setRequestHandler(ListPromptsRequestSchema, async () => {
75
+ try {
76
+ const { docs } = loadSkills();
77
+ return { prompts: skillPromptDescriptors(filterSkillsForSurface(docs, surface)) };
78
+ }
79
+ catch (err) {
80
+ console.error(`[noclaf-cli] aviso: prompts indisponíveis: ${err.message}`);
81
+ return { prompts: [] };
82
+ }
83
+ });
84
+ server.setRequestHandler(GetPromptRequestSchema, async (request) => {
85
+ const visible = filterSkillsForSurface(loadSkills().docs, surface);
86
+ const { description, text } = buildSkillPrompt(request.params.name, request.params.arguments, visible);
87
+ // Telemetria de uso (Cowork): qual skill/command foi invocado (id estável + nome).
88
+ track(session?.supabase ?? null, {
89
+ type: 'prompt',
90
+ client: surface ?? 'unknown',
91
+ id: visible.find((d) => d.id === request.params.name)?.uid ?? null,
92
+ name: request.params.name,
93
+ });
94
+ return {
95
+ description,
96
+ messages: [{ role: 'user', content: { type: 'text', text } }],
97
+ };
98
+ });
99
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
100
+ const tool = tools[request.params.name];
101
+ if (!tool) {
102
+ return errorResult(`Tool desconhecida: ${request.params.name}`);
103
+ }
104
+ if (!session) {
105
+ return errorResult('Não autenticado. Rode `noclaf login` antes de iniciar o Claude Code.');
106
+ }
107
+ const ctx = {
108
+ supabase: session.supabase,
109
+ user: session.user,
110
+ config: projectConfig,
111
+ };
112
+ try {
113
+ return await tool.handler(request.params.arguments ?? {}, ctx);
114
+ }
115
+ catch (err) {
116
+ return errorResult(`Erro inesperado em ${request.params.name}: ${err.message}`);
117
+ }
118
+ });
119
+ notifyMcpServerIfUpdate();
120
+ const transport = new StdioServerTransport();
121
+ await server.connect(transport);
122
+ console.error('[noclaf-cli] servidor iniciado (stdio)');
123
+ // Auto-pull: a cada start, refresca os arquivos nativos (idempotente via manifesto;
124
+ // desliga com NOCLAF_AUTO_PULL=0). No Cowork as skills chegam por resources/prompts,
125
+ // não por arquivo nativo — então pulamos.
126
+ const autoPull = process.env.NOCLAF_AUTO_PULL;
127
+ const client = process.env.NOCLAF_CLIENT;
128
+ const isCowork = client === 'cowork';
129
+ if (!isCowork && autoPull !== '0' && autoPull !== 'false') {
130
+ // Cliente nativo do worker: Codex escreve `~/.codex` (skills traduzidas),
131
+ // qualquer outro cai pro Claude Code (`~/.claude`).
132
+ const target = client === 'codex' ? codexTarget : claudeTarget;
133
+ try {
134
+ const result = provision({ target, sections: projectConfig?.sections });
135
+ const changed = result.files.filter((f) => f.action === 'create' || f.action === 'update');
136
+ const pruned = result.files.filter((f) => f.action === 'prune');
137
+ if (changed.length > 0 || pruned.length > 0) {
138
+ console.error(`[noclaf-cli] auto-pull: ${changed.length} atualizados, ` +
139
+ `${pruned.length} removidos em ${result.targetDir}. Reinicie o cliente pra carregar.`);
140
+ }
141
+ // Hooks (só Claude Code): re-registra os gatilhos no settings.json.
142
+ if (target === claudeTarget) {
143
+ const h = provisionHooks({
144
+ surface: claudeTarget.surface,
145
+ sections: projectConfig?.sections,
146
+ });
147
+ if (h.installed.length > 0 || h.prunedScripts.length > 0) {
148
+ console.error(`[noclaf-cli] auto-pull: ${h.installed.length} hooks, ` +
149
+ `${h.prunedScripts.length} removidos em ${h.settingsPath}.`);
150
+ }
151
+ }
152
+ }
153
+ catch (err) {
154
+ console.error(`[noclaf-cli] auto-pull pulou: ${err.message}`);
155
+ }
156
+ }
157
+ }
158
+ main().catch((err) => {
159
+ console.error(`[noclaf-cli] erro fatal: ${err.message}`);
160
+ process.exit(1);
161
+ });
162
+ //# sourceMappingURL=mcp-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { spinner as clackSpinner } from '@clack/prompts';
2
+ export function startSpinner(message) {
3
+ const s = clackSpinner();
4
+ s.start(message);
5
+ return {
6
+ succeed: (msg) => s.stop(msg ?? message),
7
+ fail: (msg) => s.error(msg ?? message),
8
+ stop: (msg) => (msg ? s.stop(msg) : s.clear()),
9
+ message: (msg) => s.message(msg),
10
+ };
11
+ }
12
+ //# sourceMappingURL=spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../src/spinner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAgBzD,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,CAAC,GAAG,YAAY,EAAE,CAAC;IACzB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,OAAO;QACL,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC;QACxC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC;QACtC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QAC9C,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;KACjC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,95 @@
1
+ import { createClient } from '@supabase/supabase-js';
2
+ import { SUPABASE_URL, SUPABASE_ANON_KEY } from './constants.js';
3
+ import { loadCredentials, exchangePatForJwt } from './auth.js';
4
+ /**
5
+ * Lê o `exp` (epoch em segundos) do payload de um JWT. Retorna 0 se não der pra
6
+ * parsear — o chamador trata 0 como "sem validade conhecida" e cai no fallback.
7
+ */
8
+ function jwtExp(token) {
9
+ try {
10
+ const payload = token.split('.')[1];
11
+ if (!payload)
12
+ return 0;
13
+ const json = JSON.parse(Buffer.from(payload, 'base64url').toString('utf8'));
14
+ return typeof json.exp === 'number' ? json.exp : 0;
15
+ }
16
+ catch {
17
+ return 0;
18
+ }
19
+ }
20
+ /** Validade absoluta (epoch em s) da troca: usa o `exp` do JWT; se ilegível, deriva do `expires_in`. */
21
+ function computeExp(exchange) {
22
+ const fromJwt = jwtExp(exchange.access_token);
23
+ if (fromJwt > 0)
24
+ return fromJwt;
25
+ return Math.floor(Date.now() / 1000) + (exchange.expires_in ?? 0);
26
+ }
27
+ /**
28
+ * Carrega PAT, troca por JWT e retorna client Supabase autenticado.
29
+ *
30
+ * O JWT do mcp-token-exchange tem `exp` fixo e o client não tem refresh
31
+ * (autoRefreshToken:false). Chumbar o token num header estático fazia toda chamada
32
+ * falhar com "JWT expired" depois do exp, até reconectar o MCP (que reinicia o
33
+ * processo → nova troca). Em vez disso injetamos um JWT fresco por request via fetch
34
+ * custom, re-trocando o PAT (durável e re-trocável) de duas formas:
35
+ * - **proativa**: quando falta <300s pro exp (margem larga que absorve skew de relógio);
36
+ * - **reativa (one-shot)**: se o servidor devolver 401 (ex.: skew mandou um JWT já
37
+ * expirado), força uma troca fresca e repete a MESMA request UMA vez.
38
+ * Assim a sessão dura indefinidamente sem reconnect, mesmo com relógio dessincronizado.
39
+ *
40
+ * Throw se não há PAT salvo, ou se a troca inicial falhar.
41
+ */
42
+ export async function createAuthenticatedClient() {
43
+ const creds = await loadCredentials();
44
+ if (!creds) {
45
+ throw new Error('Nenhum token encontrado. Rode `noclaf login <PAT>` antes.');
46
+ }
47
+ const { pat } = creds;
48
+ const first = await exchangePatForJwt(pat);
49
+ let token = first.access_token;
50
+ let exp = computeExp(first);
51
+ // Re-troca o PAT por um JWT novo, deduplicando trocas concorrentes numa única
52
+ // promise pra não disparar N requests ao token-exchange quando várias tools
53
+ // chamam junto. Usado tanto pela checagem proativa quanto pelo retry reativo.
54
+ let refreshing = null;
55
+ function refreshOnce() {
56
+ if (!refreshing) {
57
+ refreshing = (async () => {
58
+ const fresh = await exchangePatForJwt(pat);
59
+ token = fresh.access_token;
60
+ exp = computeExp(fresh);
61
+ })().finally(() => {
62
+ refreshing = null;
63
+ });
64
+ }
65
+ return refreshing;
66
+ }
67
+ // Proativo: refresca quando falta <300s pro exp (margem larga pra absorver skew).
68
+ async function validToken() {
69
+ const now = Math.floor(Date.now() / 1000);
70
+ if (exp - 300 > now)
71
+ return token;
72
+ await refreshOnce();
73
+ return token;
74
+ }
75
+ const authFetch = async (input, init, retried = false) => {
76
+ const headers = new Headers(init?.headers);
77
+ headers.set('Authorization', `Bearer ${await validToken()}`);
78
+ const res = await fetch(input, { ...init, headers });
79
+ // Reativo (one-shot): se o servidor rejeita o token (401) — ex.: skew mandou um
80
+ // JWT já expirado — força uma troca fresca e repete a MESMA request uma vez.
81
+ if (res.status === 401 && !retried) {
82
+ await refreshOnce();
83
+ return authFetch(input, init, true);
84
+ }
85
+ return res;
86
+ };
87
+ const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY, {
88
+ auth: { persistSession: false, autoRefreshToken: false },
89
+ // Cast: nosso wrapper não implementa `fetch.preconnect` (que o supabase-js
90
+ // nunca chama), mas o tipo `Fetch` é `typeof fetch` e exige a propriedade.
91
+ global: { fetch: authFetch },
92
+ });
93
+ return { supabase, user: first.user };
94
+ }
95
+ //# sourceMappingURL=supabase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.js","sourceRoot":"","sources":["../src/supabase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import { z } from 'zod';
2
+ import { jsonResult, errorResult } from '../lib/tool-result.js';
3
+ import { resolveProjectConfig, isErrorResult } from '../lib/require-config.js';
4
+ import { insertTaskHistory } from '../lib/task-history.js';
5
+ const ArgsSchema = z
6
+ .object({
7
+ task_id: z.string().uuid(),
8
+ content: z
9
+ .string()
10
+ .trim()
11
+ .min(1, 'Comentário não pode estar vazio.')
12
+ .max(5000, 'Comentário não pode passar de 5000 caracteres.'),
13
+ project_id: z.string().uuid().optional(),
14
+ })
15
+ .strict();
16
+ export const definition = {
17
+ name: 'nos_comment_task',
18
+ description: 'Adiciona um comentário em uma tarefa. O comentário fica visível pros humanos na UI ' +
19
+ 'junto com os outros comentários da task.',
20
+ inputSchema: {
21
+ type: 'object',
22
+ properties: {
23
+ task_id: { type: 'string', format: 'uuid' },
24
+ content: { type: 'string', minLength: 1, maxLength: 5000 },
25
+ project_id: {
26
+ type: 'string',
27
+ format: 'uuid',
28
+ description: 'Override do projeto. Se omitido, usa o projeto ativo (nos_set_project) ou o default.',
29
+ },
30
+ },
31
+ required: ['task_id', 'content'],
32
+ additionalProperties: false,
33
+ },
34
+ };
35
+ export async function handler(args, ctx) {
36
+ const parsed = ArgsSchema.safeParse(args);
37
+ if (!parsed.success) {
38
+ return errorResult(`Argumento inválido: ${parsed.error.message}`);
39
+ }
40
+ const { task_id, content } = parsed.data;
41
+ const cfg = resolveProjectConfig(ctx, parsed.data.project_id);
42
+ if (isErrorResult(cfg))
43
+ return cfg;
44
+ const { supabase } = ctx;
45
+ // Valida task no escopo do projeto antes de comentar
46
+ const taskRes = await supabase
47
+ .from('tasks')
48
+ .select('id')
49
+ .eq('id', task_id)
50
+ .eq('project_id', cfg.project_id)
51
+ .maybeSingle();
52
+ if (taskRes.error)
53
+ return errorResult(`Erro ao validar tarefa: ${taskRes.error.message}`);
54
+ if (!taskRes.data)
55
+ return errorResult('Tarefa não encontrada ou fora do projeto atual.');
56
+ const insertRes = await supabase
57
+ .from('task_comments')
58
+ .insert({
59
+ task_id,
60
+ author_id: ctx.user.id,
61
+ content,
62
+ })
63
+ .select('id, task_id, created_at')
64
+ .single();
65
+ if (insertRes.error)
66
+ return errorResult(`Erro ao gravar comentário: ${insertRes.error.message}`);
67
+ await insertTaskHistory(supabase, {
68
+ task_id,
69
+ user_id: ctx.user.id,
70
+ action: 'commented',
71
+ field: null,
72
+ new_value: content.slice(0, 200),
73
+ });
74
+ return jsonResult({
75
+ comment_id: insertRes.data.id,
76
+ task_id: insertRes.data.task_id,
77
+ created_at: insertRes.data.created_at,
78
+ });
79
+ }
80
+ //# sourceMappingURL=comment-task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment-task.js","sourceRoot":"","sources":["../../src/tools/comment-task.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,194 @@
1
+ import { z } from 'zod';
2
+ import { jsonResult, errorResult } from '../lib/tool-result.js';
3
+ import { resolveProjectConfig, isErrorResult } from '../lib/require-config.js';
4
+ import { insertTaskHistory } from '../lib/task-history.js';
5
+ const TASK_STATUS = [
6
+ 'backlog',
7
+ 'todo',
8
+ 'doing',
9
+ 'code_review',
10
+ 'rejected',
11
+ 'qa',
12
+ 'done',
13
+ 'production',
14
+ ];
15
+ const TASK_PRIORITY = ['none', 'lowest', 'low', 'medium', 'high', 'urgent'];
16
+ const TASK_TYPE = ['story', 'bug', 'task', 'epic', 'subtask', 'meeting'];
17
+ const ArgsSchema = z
18
+ .object({
19
+ title: z.string().min(1).max(200),
20
+ description: z.string().default(''),
21
+ priority: z.enum(TASK_PRIORITY).default('none'),
22
+ type: z.enum(TASK_TYPE).default('task'),
23
+ status: z.enum(TASK_STATUS).default('todo'),
24
+ end_date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
25
+ sprint: z.string().default('active'),
26
+ assignee_user_ids: z.array(z.string().uuid()).optional(),
27
+ label_ids: z.array(z.string().uuid()).optional(),
28
+ link_to_current_repository: z.boolean().default(true),
29
+ additional_repository_ids: z.array(z.string().uuid()).optional(),
30
+ project_id: z.string().uuid().optional(),
31
+ })
32
+ .strict();
33
+ export const definition = {
34
+ name: 'nos_create_task',
35
+ description: 'Cria uma nova tarefa no projeto atual. Por padrão: status=todo, sprint=active, ' +
36
+ 'type=task, assignee=você. Pra colocar no backlog fora de sprint, passe ' +
37
+ 'status="backlog" e sprint="none". O reporter é sempre o usuário autenticado.',
38
+ inputSchema: {
39
+ type: 'object',
40
+ properties: {
41
+ title: { type: 'string', minLength: 1, maxLength: 200 },
42
+ description: { type: 'string' },
43
+ priority: { type: 'string', enum: [...TASK_PRIORITY] },
44
+ type: { type: 'string', enum: [...TASK_TYPE] },
45
+ status: { type: 'string', enum: [...TASK_STATUS] },
46
+ end_date: { type: 'string', description: 'Data ISO (YYYY-MM-DD).' },
47
+ sprint: {
48
+ type: 'string',
49
+ description: '"active", "none" ou UUID. Default "none".',
50
+ },
51
+ assignee_user_ids: { type: 'array', items: { type: 'string', format: 'uuid' } },
52
+ label_ids: { type: 'array', items: { type: 'string', format: 'uuid' } },
53
+ link_to_current_repository: {
54
+ type: 'boolean',
55
+ description: 'Vincula automaticamente ao repositório do noclaf.json. Default true.',
56
+ },
57
+ additional_repository_ids: { type: 'array', items: { type: 'string', format: 'uuid' } },
58
+ project_id: {
59
+ type: 'string',
60
+ format: 'uuid',
61
+ description: 'Override do projeto. Se omitido, usa o projeto ativo (nos_set_project) ou o default.',
62
+ },
63
+ },
64
+ required: ['title'],
65
+ additionalProperties: false,
66
+ },
67
+ };
68
+ export async function handler(args, ctx) {
69
+ const parsed = ArgsSchema.safeParse(args);
70
+ if (!parsed.success) {
71
+ return errorResult(`Argumento inválido: ${parsed.error.message}`);
72
+ }
73
+ const input = parsed.data;
74
+ const cfg = resolveProjectConfig(ctx, input.project_id);
75
+ if (isErrorResult(cfg))
76
+ return cfg;
77
+ const { supabase } = ctx;
78
+ // Resolver sprint_id
79
+ let sprintId = null;
80
+ if (input.sprint === 'active') {
81
+ const sprintRes = await supabase
82
+ .from('sprints')
83
+ .select('id')
84
+ .eq('project_id', cfg.project_id)
85
+ .eq('status', 'ativa')
86
+ .maybeSingle();
87
+ if (sprintRes.error)
88
+ return errorResult(`Erro ao buscar sprint ativa: ${sprintRes.error.message}`);
89
+ if (!sprintRes.data)
90
+ return errorResult('Não há sprint ativa no projeto.');
91
+ sprintId = sprintRes.data.id;
92
+ }
93
+ else if (input.sprint !== 'none') {
94
+ if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(input.sprint)) {
95
+ return errorResult('Argumento "sprint" deve ser "active", "none" ou um UUID válido.');
96
+ }
97
+ const sprintRes = await supabase
98
+ .from('sprints')
99
+ .select('id, project_id')
100
+ .eq('id', input.sprint)
101
+ .maybeSingle();
102
+ if (sprintRes.error)
103
+ return errorResult(`Erro ao validar sprint: ${sprintRes.error.message}`);
104
+ if (!sprintRes.data || sprintRes.data.project_id !== cfg.project_id) {
105
+ return errorResult('Sprint informada não pertence ao projeto atual.');
106
+ }
107
+ sprintId = sprintRes.data.id;
108
+ }
109
+ // Insert principal
110
+ const insertRes = await supabase
111
+ .from('tasks')
112
+ .insert({
113
+ title: input.title,
114
+ description: input.description,
115
+ status: input.status,
116
+ priority: input.priority,
117
+ type: input.type,
118
+ project_id: cfg.project_id,
119
+ reporter_id: ctx.user.id,
120
+ sprint_id: sprintId,
121
+ end_date: input.end_date ?? null,
122
+ })
123
+ .select('id, key, title, status, priority, type, sprint_id, end_date, created_at')
124
+ .single();
125
+ if (insertRes.error)
126
+ return errorResult(`Erro ao criar tarefa: ${insertRes.error.message}`);
127
+ const task = insertRes.data;
128
+ const warnings = [];
129
+ // Vinculações secundárias (paralelo)
130
+ const assigneeIds = input.assignee_user_ids ?? [ctx.user.id];
131
+ const repoIds = [];
132
+ if (input.link_to_current_repository && cfg.repository_id) {
133
+ repoIds.push(cfg.repository_id);
134
+ }
135
+ for (const r of input.additional_repository_ids ?? []) {
136
+ if (!repoIds.includes(r))
137
+ repoIds.push(r);
138
+ }
139
+ const secondaryOps = [];
140
+ if (assigneeIds.length > 0) {
141
+ secondaryOps.push((async () => {
142
+ const res = await supabase
143
+ .from('task_assignees')
144
+ .insert(assigneeIds.map((user_id) => ({ task_id: task.id, user_id })));
145
+ return { label: 'assignees', error: res.error?.message ?? null };
146
+ })());
147
+ }
148
+ if ((input.label_ids ?? []).length > 0) {
149
+ secondaryOps.push((async () => {
150
+ const res = await supabase
151
+ .from('task_label_assignments')
152
+ .insert(input.label_ids.map((label_id) => ({ task_id: task.id, label_id })));
153
+ return { label: 'labels', error: res.error?.message ?? null };
154
+ })());
155
+ }
156
+ if (repoIds.length > 0) {
157
+ secondaryOps.push((async () => {
158
+ const res = await supabase
159
+ .from('task_repositories')
160
+ .insert(repoIds.map((repository_id) => ({ task_id: task.id, repository_id })));
161
+ return { label: 'repositories', error: res.error?.message ?? null };
162
+ })());
163
+ }
164
+ const results = await Promise.all(secondaryOps);
165
+ for (const r of results) {
166
+ if (r.error)
167
+ warnings.push(`Falha ao vincular ${r.label}: ${r.error}`);
168
+ }
169
+ await insertTaskHistory(supabase, {
170
+ task_id: task.id,
171
+ user_id: ctx.user.id,
172
+ action: 'created',
173
+ field: 'mcp',
174
+ new_value: task.title,
175
+ });
176
+ return jsonResult({
177
+ id: task.id,
178
+ key: task.key,
179
+ title: task.title,
180
+ status: task.status,
181
+ priority: task.priority,
182
+ type: task.type,
183
+ sprint_id: task.sprint_id,
184
+ end_date: task.end_date,
185
+ created_at: task.created_at,
186
+ linked: {
187
+ assignee_user_ids: assigneeIds,
188
+ label_ids: input.label_ids ?? [],
189
+ repository_ids: repoIds,
190
+ },
191
+ warnings: warnings.length > 0 ? warnings : undefined,
192
+ });
193
+ }
194
+ //# sourceMappingURL=create-task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-task.js","sourceRoot":"","sources":["../../src/tools/create-task.ts"],"names":[],"mappings":"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"}