aitk-cli 0.2.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 (118) hide show
  1. package/README.md +147 -0
  2. package/dist/bin/aitk.d.ts +3 -0
  3. package/dist/bin/aitk.d.ts.map +1 -0
  4. package/dist/bin/aitk.js +108 -0
  5. package/dist/bin/aitk.js.map +1 -0
  6. package/dist/commands/completions.d.ts +3 -0
  7. package/dist/commands/completions.d.ts.map +1 -0
  8. package/dist/commands/completions.js +244 -0
  9. package/dist/commands/completions.js.map +1 -0
  10. package/dist/commands/config.d.ts +3 -0
  11. package/dist/commands/config.d.ts.map +1 -0
  12. package/dist/commands/config.js +108 -0
  13. package/dist/commands/config.js.map +1 -0
  14. package/dist/commands/init.d.ts +3 -0
  15. package/dist/commands/init.d.ts.map +1 -0
  16. package/dist/commands/init.js +232 -0
  17. package/dist/commands/init.js.map +1 -0
  18. package/dist/commands/install.d.ts +3 -0
  19. package/dist/commands/install.d.ts.map +1 -0
  20. package/dist/commands/install.js +250 -0
  21. package/dist/commands/install.js.map +1 -0
  22. package/dist/commands/list.d.ts +3 -0
  23. package/dist/commands/list.d.ts.map +1 -0
  24. package/dist/commands/list.js +78 -0
  25. package/dist/commands/list.js.map +1 -0
  26. package/dist/commands/login.d.ts +3 -0
  27. package/dist/commands/login.d.ts.map +1 -0
  28. package/dist/commands/login.js +362 -0
  29. package/dist/commands/login.js.map +1 -0
  30. package/dist/commands/logout.d.ts +3 -0
  31. package/dist/commands/logout.d.ts.map +1 -0
  32. package/dist/commands/logout.js +10 -0
  33. package/dist/commands/logout.js.map +1 -0
  34. package/dist/commands/publish.d.ts +3 -0
  35. package/dist/commands/publish.d.ts.map +1 -0
  36. package/dist/commands/publish.js +245 -0
  37. package/dist/commands/publish.js.map +1 -0
  38. package/dist/commands/remove.d.ts +3 -0
  39. package/dist/commands/remove.d.ts.map +1 -0
  40. package/dist/commands/remove.js +150 -0
  41. package/dist/commands/remove.js.map +1 -0
  42. package/dist/commands/search.d.ts +3 -0
  43. package/dist/commands/search.d.ts.map +1 -0
  44. package/dist/commands/search.js +77 -0
  45. package/dist/commands/search.js.map +1 -0
  46. package/dist/commands/status.d.ts +3 -0
  47. package/dist/commands/status.d.ts.map +1 -0
  48. package/dist/commands/status.js +177 -0
  49. package/dist/commands/status.js.map +1 -0
  50. package/dist/commands/sync.d.ts +3 -0
  51. package/dist/commands/sync.d.ts.map +1 -0
  52. package/dist/commands/sync.js +178 -0
  53. package/dist/commands/sync.js.map +1 -0
  54. package/dist/commands/team.d.ts +3 -0
  55. package/dist/commands/team.d.ts.map +1 -0
  56. package/dist/commands/team.js +236 -0
  57. package/dist/commands/team.js.map +1 -0
  58. package/dist/commands/update.d.ts +3 -0
  59. package/dist/commands/update.d.ts.map +1 -0
  60. package/dist/commands/update.js +311 -0
  61. package/dist/commands/update.js.map +1 -0
  62. package/dist/core/api-client.d.ts +44 -0
  63. package/dist/core/api-client.d.ts.map +1 -0
  64. package/dist/core/api-client.js +111 -0
  65. package/dist/core/api-client.js.map +1 -0
  66. package/dist/core/auth.d.ts +12 -0
  67. package/dist/core/auth.d.ts.map +1 -0
  68. package/dist/core/auth.js +48 -0
  69. package/dist/core/auth.js.map +1 -0
  70. package/dist/core/config.d.ts +13 -0
  71. package/dist/core/config.d.ts.map +1 -0
  72. package/dist/core/config.js +42 -0
  73. package/dist/core/config.js.map +1 -0
  74. package/dist/core/lockfile.d.ts +22 -0
  75. package/dist/core/lockfile.d.ts.map +1 -0
  76. package/dist/core/lockfile.js +75 -0
  77. package/dist/core/lockfile.js.map +1 -0
  78. package/dist/core/manifest.d.ts +12 -0
  79. package/dist/core/manifest.d.ts.map +1 -0
  80. package/dist/core/manifest.js +57 -0
  81. package/dist/core/manifest.js.map +1 -0
  82. package/dist/core/resolver.d.ts +52 -0
  83. package/dist/core/resolver.d.ts.map +1 -0
  84. package/dist/core/resolver.js +108 -0
  85. package/dist/core/resolver.js.map +1 -0
  86. package/dist/index.d.ts +8 -0
  87. package/dist/index.d.ts.map +1 -0
  88. package/dist/index.js +8 -0
  89. package/dist/index.js.map +1 -0
  90. package/dist/installers/base-installer.d.ts +19 -0
  91. package/dist/installers/base-installer.d.ts.map +1 -0
  92. package/dist/installers/base-installer.js +4 -0
  93. package/dist/installers/base-installer.js.map +1 -0
  94. package/dist/installers/config-installer.d.ts +10 -0
  95. package/dist/installers/config-installer.d.ts.map +1 -0
  96. package/dist/installers/config-installer.js +108 -0
  97. package/dist/installers/config-installer.js.map +1 -0
  98. package/dist/installers/hook-installer.d.ts +10 -0
  99. package/dist/installers/hook-installer.d.ts.map +1 -0
  100. package/dist/installers/hook-installer.js +41 -0
  101. package/dist/installers/hook-installer.js.map +1 -0
  102. package/dist/installers/mcp-installer.d.ts +14 -0
  103. package/dist/installers/mcp-installer.d.ts.map +1 -0
  104. package/dist/installers/mcp-installer.js +152 -0
  105. package/dist/installers/mcp-installer.js.map +1 -0
  106. package/dist/installers/skill-installer.d.ts +10 -0
  107. package/dist/installers/skill-installer.d.ts.map +1 -0
  108. package/dist/installers/skill-installer.js +41 -0
  109. package/dist/installers/skill-installer.js.map +1 -0
  110. package/dist/installers/template-installer.d.ts +16 -0
  111. package/dist/installers/template-installer.d.ts.map +1 -0
  112. package/dist/installers/template-installer.js +123 -0
  113. package/dist/installers/template-installer.js.map +1 -0
  114. package/dist/utils/logger.d.ts +66 -0
  115. package/dist/utils/logger.d.ts.map +1 -0
  116. package/dist/utils/logger.js +211 -0
  117. package/dist/utils/logger.js.map +1 -0
  118. package/package.json +81 -0
@@ -0,0 +1,311 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { writeFileSync, existsSync, mkdirSync, rmSync } from 'node:fs';
5
+ import { join } from 'node:path';
6
+ import { tmpdir } from 'node:os';
7
+ import { execSync } from 'node:child_process';
8
+ import { createApiClient } from '../core/api-client.js';
9
+ import { readManifest, writeManifest, addArtifactToManifest, } from '../core/manifest.js';
10
+ import { SkillInstaller } from '../installers/skill-installer.js';
11
+ import { McpInstaller } from '../installers/mcp-installer.js';
12
+ import { ConfigInstaller } from '../installers/config-installer.js';
13
+ import { HookInstaller } from '../installers/hook-installer.js';
14
+ import { logger } from '../utils/logger.js';
15
+ /** Parseia o argumento no formato scope/name */
16
+ function parseArtifactArg(artifact) {
17
+ const match = artifact.match(/^([^/]+)\/([^@]+)$/);
18
+ if (!match)
19
+ return null;
20
+ const [, scope, name] = match;
21
+ return { scope, name };
22
+ }
23
+ /** Retorna o instalador adequado para o tipo do artefato */
24
+ function getInstaller(type) {
25
+ const installers = {
26
+ skill: new SkillInstaller(),
27
+ mcp: new McpInstaller(),
28
+ config: new ConfigInstaller(),
29
+ hook: new HookInstaller(),
30
+ };
31
+ const installer = installers[type];
32
+ if (!installer) {
33
+ throw new Error(`Tipo de artefato "${type}" ainda nao possui instalador.\n` +
34
+ `Tipos suportados: ${Object.keys(installers).join(', ')}`);
35
+ }
36
+ return installer;
37
+ }
38
+ /** Formata bytes para exibicao legivel */
39
+ function formatBytes(bytes) {
40
+ if (bytes < 1024)
41
+ return `${bytes} B`;
42
+ if (bytes < 1024 * 1024)
43
+ return `${(bytes / 1024).toFixed(1)} KB`;
44
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
45
+ }
46
+ /** Extrai um tarball para um diretorio temporario */
47
+ function extractTarball(tarballPath) {
48
+ const extractDir = join(tmpdir(), `aitk-update-${Date.now()}`);
49
+ mkdirSync(extractDir, { recursive: true });
50
+ execSync(`tar -xzf "${tarballPath}" -C "${extractDir}"`, {
51
+ stdio: 'pipe',
52
+ });
53
+ return extractDir;
54
+ }
55
+ /** Limpa arquivos temporarios */
56
+ function cleanup(...paths) {
57
+ for (const p of paths) {
58
+ try {
59
+ if (existsSync(p)) {
60
+ rmSync(p, { recursive: true, force: true });
61
+ }
62
+ }
63
+ catch {
64
+ // Ignora erros de limpeza
65
+ }
66
+ }
67
+ }
68
+ /** Extrai a versao numerica de uma version range (ex: ^1.0.0 -> 1.0.0) */
69
+ function extractVersion(versionRange) {
70
+ return versionRange.replace(/^[\^~>=<]+/, '');
71
+ }
72
+ /** Verifica atualizacoes disponiveis para os artefatos */
73
+ async function checkUpdates(artifacts, isDev) {
74
+ const client = createApiClient();
75
+ const updates = [];
76
+ for (const [slug, versionRange] of Object.entries(artifacts)) {
77
+ const parsed = parseArtifactArg(slug);
78
+ if (!parsed)
79
+ continue;
80
+ try {
81
+ const response = await client.getArtifact(parsed.scope, parsed.name);
82
+ const artifact = response.data;
83
+ const currentVersion = extractVersion(versionRange);
84
+ if (artifact.latestVersion && artifact.latestVersion !== currentVersion) {
85
+ updates.push({
86
+ scope: parsed.scope,
87
+ name: parsed.name,
88
+ currentVersion,
89
+ latestVersion: artifact.latestVersion,
90
+ type: artifact.type,
91
+ isDev,
92
+ });
93
+ }
94
+ }
95
+ catch {
96
+ // Ignora artefatos que nao foram encontrados na API
97
+ }
98
+ }
99
+ return updates;
100
+ }
101
+ /** Atualiza um unico artefato para a versao mais recente */
102
+ async function updateSingleArtifact(update, tool) {
103
+ const fullName = `${update.scope}/${update.name}`;
104
+ const totalSteps = 4;
105
+ const tmpFiles = [];
106
+ try {
107
+ // Passo 1: Baixar nova versao
108
+ const spinner1 = ora({
109
+ text: `${logger.stepIndicator(1, totalSteps)} Baixando ${chalk.cyan(fullName)}@${chalk.green(update.latestVersion)}...`,
110
+ color: 'cyan',
111
+ }).start();
112
+ const client = createApiClient();
113
+ const { buffer, size } = await client.downloadVersion(update.scope, update.name, update.latestVersion);
114
+ // Salva o tarball em diretorio temporario
115
+ const tmpDir = join(tmpdir(), `aitk-update-${Date.now()}`);
116
+ mkdirSync(tmpDir, { recursive: true });
117
+ tmpFiles.push(tmpDir);
118
+ const tarballPath = join(tmpDir, `${update.scope}-${update.name}-${update.latestVersion}.tgz`);
119
+ writeFileSync(tarballPath, Buffer.from(buffer));
120
+ spinner1.succeed(`${logger.stepIndicator(1, totalSteps)} Download completo ${chalk.gray(`(${formatBytes(size)})`)}`);
121
+ // Passo 2: Extrair e reinstalar
122
+ const spinner2 = ora({
123
+ text: `${logger.stepIndicator(2, totalSteps)} Instalando arquivos...`,
124
+ color: 'cyan',
125
+ }).start();
126
+ const extractDir = extractTarball(tarballPath);
127
+ tmpFiles.push(extractDir);
128
+ const installer = getInstaller(update.type);
129
+ const installManifest = {
130
+ name: update.name,
131
+ scope: update.scope,
132
+ version: update.latestVersion,
133
+ type: update.type,
134
+ description: '',
135
+ toolTargets: [tool],
136
+ files: [],
137
+ install: {},
138
+ };
139
+ // Remove versao antiga antes de instalar a nova
140
+ await installer.uninstall(installManifest, process.cwd(), tool);
141
+ // Instala a nova versao
142
+ const result = await installer.install(installManifest, extractDir, process.cwd(), tool);
143
+ if (!result.success) {
144
+ spinner2.fail(`${logger.stepIndicator(2, totalSteps)} Falha na instalacao`);
145
+ if (result.message) {
146
+ logger.error(result.message);
147
+ }
148
+ return false;
149
+ }
150
+ spinner2.succeed(`${logger.stepIndicator(2, totalSteps)} Arquivos instalados em ${chalk.gray(result.installedPath)}`);
151
+ // Passo 3: Atualizar manifesto
152
+ const spinner3 = ora({
153
+ text: `${logger.stepIndicator(3, totalSteps)} Atualizando aitk.json...`,
154
+ color: 'cyan',
155
+ }).start();
156
+ let projectManifest = readManifest();
157
+ if (projectManifest) {
158
+ const artifactSlug = `${update.scope}/${update.name}`;
159
+ const versionRange = `^${update.latestVersion}`;
160
+ projectManifest = addArtifactToManifest(projectManifest, artifactSlug, versionRange, update.isDev);
161
+ writeManifest(projectManifest);
162
+ }
163
+ spinner3.succeed(`${logger.stepIndicator(3, totalSteps)} Manifesto atualizado`);
164
+ // Passo 4: Verificacao
165
+ const spinner4 = ora({
166
+ text: `${logger.stepIndicator(4, totalSteps)} Verificando...`,
167
+ color: 'cyan',
168
+ }).start();
169
+ if (existsSync(result.installedPath)) {
170
+ spinner4.succeed(`${logger.stepIndicator(4, totalSteps)} ${chalk.cyan(fullName)} atualizado: ${chalk.gray(update.currentVersion)} ${chalk.white('->')} ${chalk.green.bold(update.latestVersion)}`);
171
+ }
172
+ else {
173
+ spinner4.warn(`${logger.stepIndicator(4, totalSteps)} Diretorio de instalacao nao encontrado`);
174
+ }
175
+ return true;
176
+ }
177
+ catch (error) {
178
+ logger.error(`Erro ao atualizar ${fullName}: ${error instanceof Error ? error.message : 'Erro desconhecido'}`);
179
+ return false;
180
+ }
181
+ finally {
182
+ cleanup(...tmpFiles);
183
+ }
184
+ }
185
+ export const updateCommand = new Command('update')
186
+ .description('Atualizar artefatos instalados para a versao mais recente')
187
+ .argument('[artifact]', 'Artefato no formato scope/nome (opcional — atualiza todos se omitido)')
188
+ .option('--tool <tool>', 'Ferramenta alvo (padrao: lido do manifesto)')
189
+ .action(async (artifact, options) => {
190
+ try {
191
+ // Le o manifesto do projeto
192
+ const manifest = readManifest();
193
+ if (!manifest) {
194
+ logger.blank();
195
+ logger.warn('Nenhum aitk.json encontrado neste diretorio.');
196
+ logger.print(chalk.gray(` Execute ${chalk.cyan('aitk install <artefato>')} para comecar.`));
197
+ logger.blank();
198
+ return;
199
+ }
200
+ const tool = (options?.tool || manifest.tool || 'claude-code');
201
+ logger.blank();
202
+ // Se um artefato especifico foi fornecido, atualiza apenas ele
203
+ if (artifact) {
204
+ const parsed = parseArtifactArg(artifact);
205
+ if (!parsed) {
206
+ logger.error('Formato invalido. Use: scope/nome');
207
+ logger.print(chalk.gray(` Exemplo: ${chalk.cyan('aitk update official/code-review')}`));
208
+ logger.blank();
209
+ return;
210
+ }
211
+ const slug = `${parsed.scope}/${parsed.name}`;
212
+ const currentRange = manifest.artifacts[slug] || manifest.devArtifacts?.[slug];
213
+ if (!currentRange) {
214
+ logger.error(`Artefato ${chalk.cyan(slug)} nao esta instalado.`);
215
+ logger.print(chalk.gray(` Use ${chalk.cyan('aitk list')} para ver artefatos instalados.`));
216
+ logger.blank();
217
+ return;
218
+ }
219
+ const isDev = !manifest.artifacts[slug];
220
+ logger.print(` ${chalk.white.bold('Verificando atualizacao para')} ${chalk.cyan.bold(slug)}...`);
221
+ logger.blank();
222
+ // Consulta a API para verificar a versao mais recente
223
+ const spinner = ora({
224
+ text: 'Consultando registry...',
225
+ color: 'cyan',
226
+ }).start();
227
+ const client = createApiClient();
228
+ const response = await client.getArtifact(parsed.scope, parsed.name);
229
+ const artifactData = response.data;
230
+ const currentVersion = extractVersion(currentRange);
231
+ if (!artifactData.latestVersion || artifactData.latestVersion === currentVersion) {
232
+ spinner.succeed(`${chalk.cyan(slug)} ja esta na versao mais recente ${chalk.green(`v${currentVersion}`)}`);
233
+ logger.blank();
234
+ return;
235
+ }
236
+ spinner.succeed(`Atualizacao disponivel: ${chalk.gray(currentVersion)} ${chalk.white('->')} ${chalk.green.bold(artifactData.latestVersion)}`);
237
+ logger.blank();
238
+ // Executa a atualizacao
239
+ const success = await updateSingleArtifact({
240
+ scope: parsed.scope,
241
+ name: parsed.name,
242
+ currentVersion,
243
+ latestVersion: artifactData.latestVersion,
244
+ type: artifactData.type,
245
+ isDev,
246
+ }, tool);
247
+ if (success) {
248
+ logger.blank();
249
+ logger.success(`${slug} atualizado com sucesso!`);
250
+ }
251
+ logger.blank();
252
+ return;
253
+ }
254
+ // Atualizar todos os artefatos
255
+ logger.print(` ${chalk.white.bold('Verificando atualizacoes...')}`);
256
+ logger.blank();
257
+ const spinner = ora({
258
+ text: 'Consultando registry...',
259
+ color: 'cyan',
260
+ }).start();
261
+ // Verifica atualizacoes para artifacts e devArtifacts
262
+ const prodUpdates = await checkUpdates(manifest.artifacts, false);
263
+ const devUpdates = await checkUpdates(manifest.devArtifacts || {}, true);
264
+ const allUpdates = [...prodUpdates, ...devUpdates];
265
+ if (allUpdates.length === 0) {
266
+ spinner.succeed(chalk.green('Todos os artefatos estao atualizados!'));
267
+ logger.blank();
268
+ return;
269
+ }
270
+ spinner.succeed(`${chalk.yellow(String(allUpdates.length))} atualizacao(oes) disponivel(is)`);
271
+ logger.blank();
272
+ // Mostra quais serao atualizados
273
+ for (const update of allUpdates) {
274
+ logger.print(` ${chalk.cyan(`${update.scope}/${update.name}`)} ${chalk.gray(update.currentVersion)} ${chalk.white('->')} ${chalk.green.bold(update.latestVersion)}`);
275
+ }
276
+ logger.blank();
277
+ // Executa as atualizacoes
278
+ let successCount = 0;
279
+ let failCount = 0;
280
+ for (const update of allUpdates) {
281
+ logger.print(chalk.gray(` ── ${update.scope}/${update.name} ${'─'.repeat(30)}`));
282
+ logger.blank();
283
+ const success = await updateSingleArtifact(update, tool);
284
+ if (success) {
285
+ successCount++;
286
+ }
287
+ else {
288
+ failCount++;
289
+ }
290
+ logger.blank();
291
+ }
292
+ // Resumo final
293
+ const summaryBox = logger.box([
294
+ chalk.white.bold('Resumo da atualizacao'),
295
+ '',
296
+ `${chalk.green(`${successCount} atualizado(s)`)}${failCount > 0 ? chalk.red(` | ${failCount} falha(s)`) : ''}`,
297
+ '',
298
+ chalk.gray(`Use ${chalk.cyan('aitk status')} para verificar o estado atual.`),
299
+ ]);
300
+ logger.print(summaryBox);
301
+ logger.blank();
302
+ }
303
+ catch (error) {
304
+ logger.blank();
305
+ logger.error('Erro ao atualizar artefatos');
306
+ logger.error(error instanceof Error ? error.message : 'Erro desconhecido');
307
+ logger.blank();
308
+ process.exitCode = 1;
309
+ }
310
+ });
311
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { Artifact, ArtifactVersion, ApiResponse, SearchParams } from '@tarcisiojunior/shared';
2
+ /** Cliente HTTP para comunicação com a API */
3
+ export declare class ApiClient {
4
+ private baseUrl;
5
+ private token?;
6
+ constructor();
7
+ /** Faz uma requisição à API com JSON */
8
+ request<T>(path: string, options?: RequestInit): Promise<T>;
9
+ /** Faz uma requisição raw (sem Content-Type fixo, retorna Response) */
10
+ private rawRequest;
11
+ /** Buscar artefatos */
12
+ search(params: SearchParams): Promise<ApiResponse<Artifact[]>>;
13
+ /** Obter detalhes de um artefato */
14
+ getArtifact(scope: string, name: string): Promise<ApiResponse<Artifact>>;
15
+ /** Criar um novo artefato no registry */
16
+ createArtifact(data: {
17
+ scope: string;
18
+ name: string;
19
+ type: string;
20
+ description: string;
21
+ visibility?: string;
22
+ keywords?: string[];
23
+ categories?: string[];
24
+ toolTargets?: string[];
25
+ repository?: string;
26
+ license?: string;
27
+ }): Promise<ApiResponse<Artifact>>;
28
+ /** Publicar nova versão de um artefato (multipart/form-data) */
29
+ publishVersion(scope: string, name: string, formData: FormData): Promise<ApiResponse<ArtifactVersion>>;
30
+ /** Listar versões de um artefato */
31
+ getVersions(scope: string, name: string): Promise<ApiResponse<ArtifactVersion[]>>;
32
+ /** Fazer download do tarball de uma versão (retorna o buffer binário) */
33
+ downloadVersion(scope: string, name: string, version: string): Promise<{
34
+ buffer: ArrayBuffer;
35
+ size: number;
36
+ }>;
37
+ /** Verificar saúde da API */
38
+ health(): Promise<{
39
+ status: string;
40
+ }>;
41
+ }
42
+ /** Cria uma instância do cliente API */
43
+ export declare function createApiClient(): ApiClient;
44
+ //# sourceMappingURL=api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/core/api-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAInG,8CAA8C;AAC9C,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAC,CAAS;;IAQvB,wCAAwC;IAClC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,CAAC,CAAC;IAuBrE,uEAAuE;YACzD,UAAU;IAsBxB,uBAAuB;IACjB,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;IAWpE,oCAAoC;IAC9B,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAI9E,yCAAyC;IACnC,cAAc,CAAC,IAAI,EAAE;QACzB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAOlC,gEAAgE;IAC1D,cAAc,CAClB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IAUxC,oCAAoC;IAC9B,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC,CAAC;IAIvF,yEAAyE;IACnE,eAAe,CACnB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAmBjD,6BAA6B;IACvB,MAAM,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAG5C;AAED,wCAAwC;AACxC,wBAAgB,eAAe,IAAI,SAAS,CAE3C"}
@@ -0,0 +1,111 @@
1
+ import { getConfig } from './config.js';
2
+ import { getAuth } from './auth.js';
3
+ /** Cliente HTTP para comunicação com a API */
4
+ export class ApiClient {
5
+ baseUrl;
6
+ token;
7
+ constructor() {
8
+ const config = getConfig();
9
+ this.baseUrl = `${config.registry}/api/v1`;
10
+ this.token = getAuth()?.token;
11
+ }
12
+ /** Faz uma requisição à API com JSON */
13
+ async request(path, options = {}) {
14
+ const headers = {
15
+ 'Content-Type': 'application/json',
16
+ ...(options.headers || {}),
17
+ };
18
+ if (this.token) {
19
+ headers['X-API-Token'] = this.token;
20
+ }
21
+ const response = await fetch(`${this.baseUrl}${path}`, {
22
+ ...options,
23
+ headers,
24
+ });
25
+ if (!response.ok) {
26
+ const body = await response.json().catch(() => ({ error: { message: response.statusText } }));
27
+ throw new Error(body.error?.message || `Erro HTTP ${response.status}`);
28
+ }
29
+ return response.json();
30
+ }
31
+ /** Faz uma requisição raw (sem Content-Type fixo, retorna Response) */
32
+ async rawRequest(path, options = {}) {
33
+ const headers = {
34
+ ...(options.headers || {}),
35
+ };
36
+ if (this.token) {
37
+ headers['X-API-Token'] = this.token;
38
+ }
39
+ const response = await fetch(`${this.baseUrl}${path}`, {
40
+ ...options,
41
+ headers,
42
+ });
43
+ if (!response.ok) {
44
+ const body = await response.json().catch(() => ({ error: { message: response.statusText } }));
45
+ throw new Error(body.error?.message || `Erro HTTP ${response.status}`);
46
+ }
47
+ return response;
48
+ }
49
+ /** Buscar artefatos */
50
+ async search(params) {
51
+ const searchParams = new URLSearchParams();
52
+ if (params.q)
53
+ searchParams.set('q', params.q);
54
+ if (params.type)
55
+ searchParams.set('type', params.type);
56
+ if (params.tool)
57
+ searchParams.set('tool', params.tool);
58
+ if (params.page)
59
+ searchParams.set('page', String(params.page));
60
+ if (params.perPage)
61
+ searchParams.set('per_page', String(params.perPage));
62
+ return this.request(`/artifacts/search?${searchParams.toString()}`);
63
+ }
64
+ /** Obter detalhes de um artefato */
65
+ async getArtifact(scope, name) {
66
+ return this.request(`/artifacts/${scope}/${name}`);
67
+ }
68
+ /** Criar um novo artefato no registry */
69
+ async createArtifact(data) {
70
+ return this.request('/artifacts', {
71
+ method: 'POST',
72
+ body: JSON.stringify(data),
73
+ });
74
+ }
75
+ /** Publicar nova versão de um artefato (multipart/form-data) */
76
+ async publishVersion(scope, name, formData) {
77
+ // Usa rawRequest para não definir Content-Type (o fetch define automaticamente com boundary)
78
+ const response = await this.rawRequest(`/artifacts/${scope}/${name}/versions`, {
79
+ method: 'POST',
80
+ body: formData,
81
+ });
82
+ return response.json();
83
+ }
84
+ /** Listar versões de um artefato */
85
+ async getVersions(scope, name) {
86
+ return this.request(`/artifacts/${scope}/${name}/versions`);
87
+ }
88
+ /** Fazer download do tarball de uma versão (retorna o buffer binário) */
89
+ async downloadVersion(scope, name, version) {
90
+ // O endpoint redireciona para URL assinada; seguimos o redirect
91
+ const response = await fetch(`${this.baseUrl}/artifacts/${scope}/${name}/versions/${version}/download`, {
92
+ headers: this.token ? { 'X-API-Token': this.token } : {},
93
+ redirect: 'follow',
94
+ });
95
+ if (!response.ok) {
96
+ const body = await response.json().catch(() => ({ error: { message: response.statusText } }));
97
+ throw new Error(body.error?.message || `Erro ao baixar: HTTP ${response.status}`);
98
+ }
99
+ const buffer = await response.arrayBuffer();
100
+ return { buffer, size: buffer.byteLength };
101
+ }
102
+ /** Verificar saúde da API */
103
+ async health() {
104
+ return this.request('/health');
105
+ }
106
+ }
107
+ /** Cria uma instância do cliente API */
108
+ export function createApiClient() {
109
+ return new ApiClient();
110
+ }
111
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/core/api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { CliAuth } from '@tarcisiojunior/shared';
2
+ /** Lê os dados de autenticação */
3
+ export declare function getAuth(): CliAuth | null;
4
+ /** Salva os dados de autenticação */
5
+ export declare function saveAuth(auth: CliAuth): void;
6
+ /** Remove os dados de autenticação */
7
+ export declare function clearAuth(): void;
8
+ /** Verifica se está autenticado */
9
+ export declare function isAuthenticated(): boolean;
10
+ /** Retorna o token de autenticação ou lança erro */
11
+ export declare function requireAuth(): CliAuth;
12
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/core/auth.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAYtD,kCAAkC;AAClC,wBAAgB,OAAO,IAAI,OAAO,GAAG,IAAI,CAWxC;AAED,qCAAqC;AACrC,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAG5C;AAED,sCAAsC;AACtC,wBAAgB,SAAS,IAAI,IAAI,CAIhC;AAED,mCAAmC;AACnC,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED,oDAAoD;AACpD,wBAAgB,WAAW,IAAI,OAAO,CAMrC"}
@@ -0,0 +1,48 @@
1
+ import { readFileSync, writeFileSync, unlinkSync, existsSync, mkdirSync } from 'node:fs';
2
+ import { join, dirname } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ const AUTH_FILE = join(homedir(), '.aitk', 'auth.json');
5
+ /** Garante que o diretório de autenticação existe */
6
+ function ensureAuthDir() {
7
+ const dir = dirname(AUTH_FILE);
8
+ if (!existsSync(dir)) {
9
+ mkdirSync(dir, { recursive: true });
10
+ }
11
+ }
12
+ /** Lê os dados de autenticação */
13
+ export function getAuth() {
14
+ if (!existsSync(AUTH_FILE)) {
15
+ return null;
16
+ }
17
+ try {
18
+ const content = readFileSync(AUTH_FILE, 'utf-8');
19
+ return JSON.parse(content);
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ }
25
+ /** Salva os dados de autenticação */
26
+ export function saveAuth(auth) {
27
+ ensureAuthDir();
28
+ writeFileSync(AUTH_FILE, JSON.stringify(auth, null, 2));
29
+ }
30
+ /** Remove os dados de autenticação */
31
+ export function clearAuth() {
32
+ if (existsSync(AUTH_FILE)) {
33
+ unlinkSync(AUTH_FILE);
34
+ }
35
+ }
36
+ /** Verifica se está autenticado */
37
+ export function isAuthenticated() {
38
+ return getAuth() !== null;
39
+ }
40
+ /** Retorna o token de autenticação ou lança erro */
41
+ export function requireAuth() {
42
+ const auth = getAuth();
43
+ if (!auth) {
44
+ throw new Error('Não autenticado. Execute "aitk login" primeiro.');
45
+ }
46
+ return auth;
47
+ }
48
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/core/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGlC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;AAExD,qDAAqD;AACrD,SAAS,aAAa;IACpB,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC/B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,OAAO;IACrB,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,QAAQ,CAAC,IAAa;IACpC,aAAa,EAAE,CAAC;IAChB,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,SAAS;IACvB,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,UAAU,CAAC,SAAS,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,eAAe;IAC7B,OAAO,OAAO,EAAE,KAAK,IAAI,CAAC;AAC5B,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,WAAW;IACzB,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,13 @@
1
+ /** Configuração do CLI */
2
+ export interface CliConfig {
3
+ registry: string;
4
+ defaultScope?: string;
5
+ defaultTool: string;
6
+ cacheDir: string;
7
+ cacheMaxSize: string;
8
+ }
9
+ /** Lê a configuração atual */
10
+ export declare function getConfig(): CliConfig;
11
+ /** Salva a configuração */
12
+ export declare function saveConfig(config: Partial<CliConfig>): void;
13
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAQA,0BAA0B;AAC1B,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAiBD,8BAA8B;AAC9B,wBAAgB,SAAS,IAAI,SAAS,CAcrC;AAED,2BAA2B;AAC3B,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CAK3D"}
@@ -0,0 +1,42 @@
1
+ import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ /** Diretório de configuração do CLI */
5
+ const CONFIG_DIR = join(homedir(), '.aitk');
6
+ const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
7
+ /** Configuração padrão */
8
+ const DEFAULT_CONFIG = {
9
+ registry: 'https://aitk.dev',
10
+ defaultTool: 'claude-code',
11
+ cacheDir: join(CONFIG_DIR, 'cache'),
12
+ cacheMaxSize: '500MB',
13
+ };
14
+ /** Garante que o diretório de configuração existe */
15
+ function ensureConfigDir() {
16
+ if (!existsSync(CONFIG_DIR)) {
17
+ mkdirSync(CONFIG_DIR, { recursive: true });
18
+ }
19
+ }
20
+ /** Lê a configuração atual */
21
+ export function getConfig() {
22
+ ensureConfigDir();
23
+ if (!existsSync(CONFIG_FILE)) {
24
+ writeFileSync(CONFIG_FILE, JSON.stringify(DEFAULT_CONFIG, null, 2));
25
+ return DEFAULT_CONFIG;
26
+ }
27
+ try {
28
+ const content = readFileSync(CONFIG_FILE, 'utf-8');
29
+ return { ...DEFAULT_CONFIG, ...JSON.parse(content) };
30
+ }
31
+ catch {
32
+ return DEFAULT_CONFIG;
33
+ }
34
+ }
35
+ /** Salva a configuração */
36
+ export function saveConfig(config) {
37
+ ensureConfigDir();
38
+ const current = getConfig();
39
+ const merged = { ...current, ...config };
40
+ writeFileSync(CONFIG_FILE, JSON.stringify(merged, null, 2));
41
+ }
42
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,uCAAuC;AACvC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;AAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAWpD,0BAA0B;AAC1B,MAAM,cAAc,GAAc;IAChC,QAAQ,EAAE,kBAAkB;IAC5B,WAAW,EAAE,aAAa;IAC1B,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;IACnC,YAAY,EAAE,OAAO;CACtB,CAAC;AAEF,qDAAqD;AACrD,SAAS,eAAe;IACtB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,8BAA8B;AAC9B,MAAM,UAAU,SAAS;IACvB,eAAe,EAAE,CAAC;IAElB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACpE,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,cAAc,CAAC;IACxB,CAAC;AACH,CAAC;AAED,2BAA2B;AAC3B,MAAM,UAAU,UAAU,CAAC,MAA0B;IACnD,eAAe,EAAE,CAAC;IAClB,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC;IACzC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC"}