@noclaf/cli 0.4.13 → 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.
Files changed (109) hide show
  1. package/dist/auth.js +2 -1
  2. package/dist/auth.js.map +1 -1
  3. package/dist/brand.js +82 -0
  4. package/dist/brand.js.map +1 -0
  5. package/dist/cli/commands/auth.js +91 -58
  6. package/dist/cli/commands/auth.js.map +1 -1
  7. package/dist/cli/commands/init/auth-step.js +48 -0
  8. package/dist/cli/commands/init/auth-step.js.map +1 -0
  9. package/dist/cli/commands/init/clients-step.js +76 -0
  10. package/dist/cli/commands/init/clients-step.js.map +1 -0
  11. package/dist/cli/commands/init/context-step.js +66 -0
  12. package/dist/cli/commands/init/context-step.js.map +1 -0
  13. package/dist/cli/commands/init/index.js +67 -0
  14. package/dist/cli/commands/init/index.js.map +1 -0
  15. package/dist/cli/commands/init/project-step.js +105 -0
  16. package/dist/cli/commands/init/project-step.js.map +1 -0
  17. package/dist/cli/commands/init/provision-step.js +76 -0
  18. package/dist/cli/commands/init/provision-step.js.map +1 -0
  19. package/dist/cli/commands/validate-plan.js +42 -0
  20. package/dist/cli/commands/validate-plan.js.map +1 -0
  21. package/dist/cli/flows/clients.js +27 -17
  22. package/dist/cli/flows/clients.js.map +1 -1
  23. package/dist/cli.js +7 -5
  24. package/dist/cli.js.map +1 -1
  25. package/dist/config.js +19 -11
  26. package/dist/config.js.map +1 -1
  27. package/dist/constants.js +7 -8
  28. package/dist/constants.js.map +1 -1
  29. package/dist/lib/autopull.js +13 -0
  30. package/dist/lib/autopull.js.map +1 -0
  31. package/dist/lib/client-configs.js +37 -25
  32. package/dist/lib/client-configs.js.map +1 -1
  33. package/dist/lib/cowork-extension.js +42 -30
  34. package/dist/lib/cowork-extension.js.map +1 -1
  35. package/dist/lib/dependencies.js +83 -247
  36. package/dist/lib/dependencies.js.map +1 -1
  37. package/dist/lib/dependency-install.js +163 -0
  38. package/dist/lib/dependency-install.js.map +1 -0
  39. package/dist/lib/exec-delegate.js +2 -2
  40. package/dist/lib/exec-delegate.js.map +1 -1
  41. package/dist/lib/exec-engines.js +7 -6
  42. package/dist/lib/exec-engines.js.map +1 -1
  43. package/dist/lib/provision-apply.js +214 -0
  44. package/dist/lib/provision-apply.js.map +1 -0
  45. package/dist/lib/provision-collect.js +47 -0
  46. package/dist/lib/provision-collect.js.map +1 -0
  47. package/dist/lib/provision.js +8 -253
  48. package/dist/lib/provision.js.map +1 -1
  49. package/dist/lib/require-config.js +3 -2
  50. package/dist/lib/require-config.js.map +1 -1
  51. package/dist/lib/skills-cache.js +9 -8
  52. package/dist/lib/skills-cache.js.map +1 -1
  53. package/dist/lib/skills.js +30 -16
  54. package/dist/lib/skills.js.map +1 -1
  55. package/dist/lib/telemetry.js +2 -1
  56. package/dist/lib/telemetry.js.map +1 -1
  57. package/dist/lib/validate-plan-delegate.js +105 -0
  58. package/dist/lib/validate-plan-delegate.js.map +1 -0
  59. package/dist/lib/version-check.js +3 -2
  60. package/dist/lib/version-check.js.map +1 -1
  61. package/dist/mcp-server.js +107 -79
  62. package/dist/mcp-server.js.map +1 -1
  63. package/dist/tools/comment-task.js +32 -32
  64. package/dist/tools/comment-task.js.map +1 -1
  65. package/dist/tools/create-task.js +92 -101
  66. package/dist/tools/create-task.js.map +1 -1
  67. package/dist/tools/delegate-exec.js +4 -3
  68. package/dist/tools/delegate-exec.js.map +1 -1
  69. package/dist/tools/end-allocation.js +19 -32
  70. package/dist/tools/end-allocation.js.map +1 -1
  71. package/dist/tools/end-task-allocation.js +17 -26
  72. package/dist/tools/end-task-allocation.js.map +1 -1
  73. package/dist/tools/exec-status.js +4 -3
  74. package/dist/tools/exec-status.js.map +1 -1
  75. package/dist/tools/get-active-allocation.js +53 -60
  76. package/dist/tools/get-active-allocation.js.map +1 -1
  77. package/dist/tools/get-context.js +4 -3
  78. package/dist/tools/get-context.js.map +1 -1
  79. package/dist/tools/get-task.js +144 -142
  80. package/dist/tools/get-task.js.map +1 -1
  81. package/dist/tools/index.js +2 -0
  82. package/dist/tools/index.js.map +1 -1
  83. package/dist/tools/list-my-allocations.js +35 -43
  84. package/dist/tools/list-my-allocations.js.map +1 -1
  85. package/dist/tools/list-projects.js +3 -2
  86. package/dist/tools/list-projects.js.map +1 -1
  87. package/dist/tools/list-tasks.js +117 -124
  88. package/dist/tools/list-tasks.js.map +1 -1
  89. package/dist/tools/move-task.js +37 -39
  90. package/dist/tools/move-task.js.map +1 -1
  91. package/dist/tools/plan.js +3 -2
  92. package/dist/tools/plan.js.map +1 -1
  93. package/dist/tools/record-delivery.js +4 -3
  94. package/dist/tools/record-delivery.js.map +1 -1
  95. package/dist/tools/set-project.js +9 -4
  96. package/dist/tools/set-project.js.map +1 -1
  97. package/dist/tools/start-allocation.js +16 -26
  98. package/dist/tools/start-allocation.js.map +1 -1
  99. package/dist/tools/start-task-allocation.js +72 -92
  100. package/dist/tools/start-task-allocation.js.map +1 -1
  101. package/dist/tools/update-task.js +149 -168
  102. package/dist/tools/update-task.js.map +1 -1
  103. package/dist/tools/validate-plan.js +58 -0
  104. package/dist/tools/validate-plan.js.map +1 -0
  105. package/package.json +1 -1
  106. package/dist/cli/commands/init.js +0 -336
  107. package/dist/cli/commands/init.js.map +0 -1
  108. package/dist/logo.js +0 -17
  109. package/dist/logo.js.map +0 -1
package/dist/auth.js CHANGED
@@ -1,11 +1,12 @@
1
1
  import { mkdir, readFile, writeFile, chmod, rm } from 'node:fs/promises';
2
2
  import { dirname } from 'node:path';
3
3
  import { CREDENTIALS_FILE, PAT_REGEX, SUPABASE_ANON_KEY, TOKEN_EXCHANGE_URL, } from './constants.js';
4
+ import { env } from './brand.js';
4
5
  export async function loadCredentials(file = CREDENTIALS_FILE) {
5
6
  const stored = await readCredentialsFile(file);
6
7
  // Precedência pro ambiente: usado por Desktop Extensions / Cowork, onde o PAT
7
8
  // chega via user_config (NOCLAF_PAT) em vez de `noclaf login`.
8
- const envPat = process.env.NOCLAF_PAT?.trim();
9
+ const envPat = env('PAT')?.trim();
9
10
  if (envPat) {
10
11
  // Cache do arquivo só serve se for do mesmo PAT.
11
12
  return stored?.pat === envPat ? stored : { pat: envPat };
package/dist/auth.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
package/dist/brand.js ADDED
@@ -0,0 +1,82 @@
1
+ import { homedir } from 'node:os';
2
+ import { join } from 'node:path';
3
+ /**
4
+ * Fonte única de verdade de marca/atribuição do CLI. Rebrandear = editar este arquivo — ao
5
+ * trocar, casar em lockstep: `package.json` (`name`/`bin`/`description`/`keywords`/`repository`)
6
+ * e os docs .md que citam tools literalmente (README.md, CLAUDE.md, SKILL.md, docs/specs/**\/*.md, e o `brand.skillsRepo` externo).
7
+ */
8
+ export const brand = {
9
+ // --- Identidade / display ---
10
+ /** Nome do comando/binário principal (nome no help do CLI + `bin` do package.json). */
11
+ name: 'noclaf',
12
+ /** Nome curto do produto, mostrado a usuários e agentes. */
13
+ productName: 'NOS',
14
+ /** Nome completo do produto. */
15
+ productFullName: 'Noclaf Operation System',
16
+ /** Empresa / fornecedor. */
17
+ company: 'Falcao-Tech',
18
+ /** Pacote npm — usado nas mensagens de atualização. */
19
+ packageName: '@noclaf/cli',
20
+ /** Binário do servidor MCP (segundo `bin` do package.json). */
21
+ mcpBinName: 'noclaf-cli',
22
+ /** Chave sob a qual o servidor MCP é registrado nos configs dos clientes. */
23
+ mcpServerKey: 'noclaf',
24
+ // --- URLs / endpoints ---
25
+ /** Base do app web — onde o usuário gera o PAT. */
26
+ webUrl: 'https://nos.noclaf.com.br',
27
+ supabaseUrl: 'https://wdshvtlsjoegjvmpqobx.supabase.co',
28
+ /** COPIE o literal de `src/constants.ts:6` — não redigite. */
29
+ supabaseAnonKey: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Indkc2h2dGxzam9lZ2p2bXBxb2J4Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzU3NDA4OTQsImV4cCI6MjA5MTMxNjg5NH0.4wlAsT_D5gDiBQ19WA-q5zu105fT9TsD1NKI_tGQt-4',
30
+ // --- Filesystem / namespacing ---
31
+ /** Dir de dados no home → `~/.noclaf`. */
32
+ homeDirName: '.noclaf',
33
+ /** Arquivo de binding do projeto na raiz do repo. */
34
+ projectConfigFile: 'noclaf.json',
35
+ // --- Contratos ---
36
+ /** Prefixo das env vars: `NOCLAF` → `NOCLAF_PAT`, `NOCLAF_CLIENT`, … Contrato externo: Cowork/Codex setam `NOCLAF_CLIENT` de fora — trocar aqui exige trocar lá também. */
37
+ envPrefix: 'NOCLAF',
38
+ /** Prefixo do PAT. ATENÇÃO: o backend também valida esse formato. */
39
+ patPrefix: 'noc_',
40
+ // --- Repo de skills ---
41
+ skillsRepo: 'Falcao-Tech/noclaf-skills',
42
+ skillsRef: 'main',
43
+ // --- Prefixos dos nomes das tools MCP --- (dois por decisão de domínio: produto vs. CLI — mantidos separados no rebrand; formato validado pelos clientes MCP como `^[a-zA-Z0-9_-]{1,64}$`, só minúsculas/dígitos, termine com `_`)
44
+ /** Tools de domínio do produto: `nos_list_tasks`, `nos_move_task`, … (16 tools). */
45
+ toolPrefix: 'nos_',
46
+ /** Tools que espelham verbos do CLI: `noclaf_plan`, `noclaf_exec_status`, … (4 tools). */
47
+ cliToolPrefix: 'noclaf_',
48
+ /** Arte ASCII mostrada no `--help`. */
49
+ logo: `
50
+ _ _ _ __
51
+ | \\ | | ___ ___| | __ _ / _|
52
+ | \\| |/ _ \\ / __| |/ _\` | |_
53
+ | |\\ | (_) | (__| | (_| | _|
54
+ |_|_\\_|\\___/ \\___|_|\\__,_|_|_ _
55
+ / _ \\ _ __ ___ _ __ __ _| |_(_) ___ _ __
56
+ | | | | '_ \\ / _ \\ '__/ _\` | __| |/ _ \\| '_ \\
57
+ | |_| | |_) | __/ | | (_| | |_| | (_) | | | |
58
+ \\___/| .__/ \\___|_| \\__,_|\\__|_|\\___/|_| |_|
59
+ / ___||_| _ ___| |_ ___ _ __ ___
60
+ \\___ \\| | | / __| __/ _ \\ '_ \` _ \\
61
+ ___) | |_| \\__ \\ || __/ | | | | |
62
+ |____/ \\__, |___/\\__\\___|_| |_| |_|
63
+ |___/
64
+ `,
65
+ };
66
+ // ponytail: prefixo do PAT assumido alfanumérico + `_`; se um dia tiver metachar de
67
+ // regex, escapar antes de interpolar.
68
+ /** Regex do formato do PAT, derivada do prefixo: `noc_` + 64 hex. */
69
+ export const patRegex = new RegExp(`^${brand.patPrefix}[a-f0-9]{64}$`);
70
+ /** Caminho dentro do dir de dados: `homePath('skills')` → `~/.noclaf/skills`. */
71
+ export function homePath(...parts) {
72
+ return join(homedir(), brand.homeDirName, ...parts);
73
+ }
74
+ /** NOME completo da env var: `envName('CLIENT')` → `'NOCLAF_CLIENT'`. */
75
+ export function envName(name) {
76
+ return `${brand.envPrefix}_${name}`;
77
+ }
78
+ /** VALOR da env var prefixada: `env('PAT')` → `process.env.NOCLAF_PAT`. */
79
+ export function env(name) {
80
+ return process.env[envName(name)];
81
+ }
82
+ //# sourceMappingURL=brand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand.js","sourceRoot":"","sources":["../src/brand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;;GAIG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,+BAA+B;IAC/B,uFAAuF;IACvF,IAAI,EAAE,QAAQ;IACd,4DAA4D;IAC5D,WAAW,EAAE,KAAK;IAClB,gCAAgC;IAChC,eAAe,EAAE,yBAAyB;IAC1C,4BAA4B;IAC5B,OAAO,EAAE,aAAa;IACtB,uDAAuD;IACvD,WAAW,EAAE,aAAa;IAC1B,+DAA+D;IAC/D,UAAU,EAAE,YAAY;IACxB,6EAA6E;IAC7E,YAAY,EAAE,QAAQ;IAEtB,2BAA2B;IAC3B,mDAAmD;IACnD,MAAM,EAAE,2BAA2B;IACnC,WAAW,EAAE,0CAA0C;IACvD,8DAA8D;IAC9D,eAAe,EAAE,kNAAkN;IAEnO,mCAAmC;IACnC,0CAA0C;IAC1C,WAAW,EAAE,SAAS;IACtB,qDAAqD;IACrD,iBAAiB,EAAE,aAAa;IAEhC,oBAAoB;IACpB,2KAA2K;IAC3K,SAAS,EAAE,QAAQ;IACnB,qEAAqE;IACrE,SAAS,EAAE,MAAM;IAEjB,yBAAyB;IACzB,UAAU,EAAE,2BAA2B;IACvC,SAAS,EAAE,MAAM;IAEjB,oOAAoO;IACpO,oFAAoF;IACpF,UAAU,EAAE,MAAM;IAClB,0FAA0F;IAC1F,aAAa,EAAE,SAAS;IAExB,uCAAuC;IACvC,IAAI,EAAE;;;;;;;;;;;;;;;CAeP;CACS,CAAC;AAEX,oFAAoF;AACpF,sCAAsC;AACtC,qEAAqE;AACrE,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,eAAe,CAAC,CAAC;AAEvE,iFAAiF;AACjF,MAAM,UAAU,QAAQ,CAAC,GAAG,KAAe;IACzC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,CAAC;AACtD,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,GAAG,CAAC,IAAY;IAC9B,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AACpC,CAAC"}
@@ -1,49 +1,81 @@
1
1
  import { password } from "../../lib/prompts.js";
2
- import { LOGO } from "../../logo.js";
2
+ import { brand } from "../../brand.js";
3
3
  import { startSpinner } from "../../spinner.js";
4
4
  import { clearCredentials, exchangePatForJwt, loadCredentials, resolveIdentity, saveCredentials, validatePatFormat, } from "../../auth.js";
5
5
  import { authCopy } from "../copy.js";
6
- export function registerAuthCommands(program) {
6
+ /** Obtém o PAT: usa o argumento se veio preenchido, senão pede via prompt mascarado. */
7
+ async function resolvePat(patArg) {
8
+ const trimmed = patArg?.trim();
9
+ if (trimmed)
10
+ return trimmed;
11
+ console.log(`Gere um token pessoal em: ${brand.webUrl}/profile#mcp`);
12
+ const answer = await password({
13
+ message: authCopy.login.patPrompt,
14
+ mask: "*",
15
+ validate: (input) => validatePatFormat(input.trim()) || authCopy.login.patInvalid,
16
+ });
17
+ return answer.trim();
18
+ }
19
+ /** Troca o PAT por sessão e persiste as credenciais localmente. */
20
+ async function performLogin(pat) {
21
+ const result = await exchangePatForJwt(pat);
22
+ await saveCredentials({
23
+ pat,
24
+ user: result.user,
25
+ fetched_at: new Date().toISOString(),
26
+ });
27
+ return result;
28
+ }
29
+ function printLoginSuccess(u) {
30
+ console.log(brand.logo);
31
+ console.log("[ok] Autenticado!");
32
+ console.log(`Nome: ${u.full_name || "(sem nome)"}`);
33
+ console.log(`Usuário: ${u.username ? `@${u.username}` : "(sem username)"}`);
34
+ console.log(`Email: ${u.email}`);
35
+ }
36
+ /** Decide se dá pra pular o spinner de validação: só quando a sessão já está em
37
+ * cache (usuário + data de fetch salvos) e o caller não pediu revalidação forçada. */
38
+ export function shouldSkipWhoamiSpinner(creds, refresh) {
39
+ return !refresh && Boolean(creds.user && creds.fetched_at);
40
+ }
41
+ /** Traduz o erro de `resolveIdentity` pra mensagem exibida ao usuário. */
42
+ export function whoamiErrorMessage(err) {
43
+ const status = err.status;
44
+ return status === 401 || status === 403
45
+ ? "Sessão inválida. Rode `noclaf login <PAT>` novamente."
46
+ : `Falha ao validar token: ${err.message}`;
47
+ }
48
+ function printWhoamiIdentity(u) {
49
+ console.log(brand.logo);
50
+ console.log(`Nome: ${u.full_name || "(sem nome)"}`);
51
+ console.log(`Email: ${u.email}`);
52
+ console.log(`Usuário: ${u.username ? `@${u.username}` : "(sem username)"}`);
53
+ console.log(`ID: ${u.id}`);
54
+ }
55
+ function registerLoginCommand(program) {
7
56
  program
8
57
  .command("login")
9
58
  .description("Salva o token de acesso pessoal (PAT) localmente")
10
59
  .argument("[pat]", "Token gerado em /profile#mcp do NOS (opcional — será pedido se omitido)")
11
60
  .action(async (patArg) => {
12
- let pat = patArg?.trim();
13
- if (!pat) {
14
- console.log("Gere um token pessoal em: https://nos.noclaf.com.br/profile#mcp");
15
- const answer = await password({
16
- message: authCopy.login.patPrompt,
17
- mask: "*",
18
- validate: (input) => validatePatFormat(input.trim()) || authCopy.login.patInvalid,
19
- });
20
- pat = answer.trim();
21
- }
61
+ const pat = await resolvePat(patArg);
22
62
  if (!validatePatFormat(pat)) {
23
- console.error("Token inválido. Formato esperado: `noc_` + 64 caracteres hexadecimais.");
63
+ console.error(`Token inválido. Formato esperado: \`${brand.patPrefix}\` + 64 caracteres hexadecimais.`);
24
64
  process.exit(1);
25
65
  }
26
66
  const spinner = startSpinner("Autenticando...");
27
67
  try {
28
- const result = await exchangePatForJwt(pat);
29
- await saveCredentials({
30
- pat,
31
- user: result.user,
32
- fetched_at: new Date().toISOString(),
33
- });
68
+ const result = await performLogin(pat);
34
69
  spinner.stop();
35
- const u = result.user;
36
- console.log(LOGO);
37
- console.log("[ok] Autenticado!");
38
- console.log(`Nome: ${u.full_name || "(sem nome)"}`);
39
- console.log(`Usuário: ${u.username ? `@${u.username}` : "(sem username)"}`);
40
- console.log(`Email: ${u.email}`);
70
+ printLoginSuccess(result.user);
41
71
  }
42
72
  catch (err) {
43
73
  spinner.fail(`Falha ao autenticar: ${err.message}`);
44
74
  process.exit(1);
45
75
  }
46
76
  });
77
+ }
78
+ function registerLogoutCommand(program) {
47
79
  program
48
80
  .command("logout")
49
81
  .description("Remove credenciais locais")
@@ -51,43 +83,44 @@ export function registerAuthCommands(program) {
51
83
  await clearCredentials();
52
84
  console.log("Sessão removida.");
53
85
  });
86
+ }
87
+ async function runWhoamiAction(opts) {
88
+ const creds = await loadCredentials();
89
+ if (!creds) {
90
+ console.error("Não autenticado. Rode `noclaf login <PAT>`.");
91
+ process.exit(1);
92
+ }
93
+ const cached = shouldSkipWhoamiSpinner(creds, opts.refresh);
94
+ const spinner = cached || opts.json ? null : startSpinner("Validando sessão...");
95
+ try {
96
+ const u = await resolveIdentity(creds, { refresh: opts.refresh });
97
+ spinner?.stop();
98
+ if (opts.json) {
99
+ console.log(JSON.stringify(u, null, 2));
100
+ return;
101
+ }
102
+ printWhoamiIdentity(u);
103
+ }
104
+ catch (err) {
105
+ const message = whoamiErrorMessage(err);
106
+ if (spinner)
107
+ spinner.fail(message);
108
+ else
109
+ console.error(message);
110
+ process.exit(1);
111
+ }
112
+ }
113
+ function registerWhoamiCommand(program) {
54
114
  program
55
115
  .command("whoami")
56
116
  .description("Mostra o usuário autenticado")
57
117
  .option("--json", "Emite a identidade como JSON")
58
118
  .option("--refresh", "Ignora o cache e revalida o token")
59
- .action(async (opts) => {
60
- const creds = await loadCredentials();
61
- if (!creds) {
62
- console.error("Não autenticado. Rode `noclaf login <PAT>`.");
63
- process.exit(1);
64
- }
65
- const cached = !opts.refresh && Boolean(creds.user && creds.fetched_at);
66
- const spinner = cached || opts.json ? null : startSpinner("Validando sessão...");
67
- try {
68
- const u = await resolveIdentity(creds, { refresh: opts.refresh });
69
- spinner?.stop();
70
- if (opts.json) {
71
- console.log(JSON.stringify(u, null, 2));
72
- return;
73
- }
74
- console.log(LOGO);
75
- console.log(`Nome: ${u.full_name || "(sem nome)"}`);
76
- console.log(`Email: ${u.email}`);
77
- console.log(`Usuário: ${u.username ? `@${u.username}` : "(sem username)"}`);
78
- console.log(`ID: ${u.id}`);
79
- }
80
- catch (err) {
81
- const status = err.status;
82
- const message = status === 401 || status === 403
83
- ? "Sessão inválida. Rode `noclaf login <PAT>` novamente."
84
- : `Falha ao validar token: ${err.message}`;
85
- if (spinner)
86
- spinner.fail(message);
87
- else
88
- console.error(message);
89
- process.exit(1);
90
- }
91
- });
119
+ .action(runWhoamiAction);
120
+ }
121
+ export function registerAuthCommands(program) {
122
+ registerLoginCommand(program);
123
+ registerLogoutCommand(program);
124
+ registerWhoamiCommand(program);
92
125
  }
93
126
  //# sourceMappingURL=auth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import { password } from "../../../lib/prompts.js";
2
+ import { brand } from "../../../brand.js";
3
+ import { exchangePatForJwt, loadCredentials, saveCredentials, validatePatFormat, } from "../../../auth.js";
4
+ import { createAuthenticatedClient } from "../../../supabase.js";
5
+ import { startSpinner } from "../../../spinner.js";
6
+ import { initCopy } from "../../copy.js";
7
+ /**
8
+ * Garante que há credenciais locais antes de seguir com o wizard: se já há PAT
9
+ * salvo, não faz nada; senão, pede o token, valida e troca por sessão.
10
+ */
11
+ export async function ensureAuthenticated() {
12
+ const existingCreds = await loadCredentials();
13
+ if (existingCreds)
14
+ return;
15
+ console.log("Você ainda não está autenticado.");
16
+ console.log(`Gere um token pessoal em: ${brand.webUrl}/profile#mcp`);
17
+ const newPat = (await password({
18
+ message: initCopy.patPrompt,
19
+ mask: "*",
20
+ validate: (value) => validatePatFormat(value.trim()) || initCopy.patInvalid,
21
+ })).trim();
22
+ const loginSpinner = startSpinner("Validando token...");
23
+ try {
24
+ const result = await exchangePatForJwt(newPat);
25
+ await saveCredentials({ pat: newPat });
26
+ loginSpinner.stop();
27
+ const displayName = result.user.full_name || result.user.email;
28
+ console.log(`[ok] Autenticado como ${displayName}`);
29
+ }
30
+ catch (err) {
31
+ loginSpinner.fail(`Falha ao autenticar: ${err.message}`);
32
+ process.exit(1);
33
+ }
34
+ }
35
+ /** Cria a sessão autenticada (client Supabase + user) usada pelo resto do wizard. */
36
+ export async function createSessionStep() {
37
+ const authSpinner = startSpinner("Carregando sessão...");
38
+ try {
39
+ const session = await createAuthenticatedClient();
40
+ authSpinner.stop();
41
+ return session;
42
+ }
43
+ catch (err) {
44
+ authSpinner.fail(err.message);
45
+ process.exit(1);
46
+ }
47
+ }
48
+ //# sourceMappingURL=auth-step.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-step.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/auth-step.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,yBAAyB,EAA6B,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,aAAa,GAAG,MAAM,eAAe,EAAE,CAAC;IAC9C,IAAI,aAAa;QAAE,OAAO;IAE1B,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,6BAA6B,KAAK,CAAC,MAAM,cAAc,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,CACb,MAAM,QAAQ,CAAC;QACb,OAAO,EAAE,QAAQ,CAAC,SAAS;QAC3B,IAAI,EAAE,GAAG;QACT,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAClB,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,QAAQ,CAAC,UAAU;KACzD,CAAC,CACH,CAAC,IAAI,EAAE,CAAC;IAET,MAAM,YAAY,GAAG,YAAY,CAAC,oBAAoB,CAAC,CAAC;IACxD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,eAAe,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QACvC,YAAY,CAAC,IAAI,EAAE,CAAC;QACpB,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,yBAAyB,WAAW,EAAE,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,IAAI,CAAC,wBAAyB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,WAAW,GAAG,YAAY,CAAC,sBAAsB,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,yBAAyB,EAAE,CAAC;QAClD,WAAW,CAAC,IAAI,EAAE,CAAC;QACnB,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,CAAC,IAAI,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,76 @@
1
+ import { checkbox } from "../../../lib/prompts.js";
2
+ import { sectionTitle } from "../../../lib/colors.js";
3
+ import { CLIENTS } from "../../../lib/client-install.js";
4
+ import { installClaudeCodeGlobal, installClaudeCodeRepo, installCodexGlobal, installVSCodeRepo, } from "../../../lib/client-configs.js";
5
+ import { printInstallResult } from "../../ui/render.js";
6
+ import { ensureClientInstalled, activateCowork } from "../../flows/clients.js";
7
+ import { initCopy } from "../../copy.js";
8
+ /** Rótulo + rotina de instalação de cada escolha do checkbox (exceto `cowork`,
9
+ * que tem ativação assíncrona própria — ver `activateCoworkIfChosen`). */
10
+ export const CLIENT_INSTALLERS = {
11
+ "claude-code-global": { label: "Claude Code (global)", run: () => installClaudeCodeGlobal() },
12
+ "codex-global": { label: "Codex CLI (global)", run: () => installCodexGlobal() },
13
+ "claude-code-repo": { label: "Claude Code (per-repo)", run: (cwd) => installClaudeCodeRepo(cwd) },
14
+ "vscode-repo": { label: "VS Code Copilot (per-repo)", run: (cwd) => installVSCodeRepo(cwd) },
15
+ };
16
+ export async function promptClientChoices() {
17
+ return checkbox({
18
+ message: initCopy.clientsPrompt,
19
+ all: true,
20
+ choices: [
21
+ { name: initCopy.clientChoices.claudeGlobal, value: "claude-code-global" },
22
+ { name: initCopy.clientChoices.codexGlobal, value: "codex-global" },
23
+ { name: initCopy.clientChoices.cowork, value: "cowork" },
24
+ { name: initCopy.clientChoices.claudeRepo, value: "claude-code-repo" },
25
+ { name: initCopy.clientChoices.vscodeRepo, value: "vscode-repo" },
26
+ ],
27
+ });
28
+ }
29
+ /** Roda a instalação de cada cliente escolhido (exceto `cowork`, tratado à parte). */
30
+ export function installClients(clientConfigs, cwd) {
31
+ for (const choice of clientConfigs) {
32
+ if (choice === "cowork")
33
+ continue; // ativação async + fallback, tratada abaixo
34
+ const installer = CLIENT_INSTALLERS[choice];
35
+ try {
36
+ printInstallResult(installer.label, installer.run(cwd));
37
+ }
38
+ catch (err) {
39
+ console.error(`[erro] Falha ao configurar ${choice}: ${err.message}`);
40
+ }
41
+ }
42
+ }
43
+ export async function activateCoworkIfChosen(clientConfigs) {
44
+ if (!clientConfigs.includes("cowork"))
45
+ return;
46
+ console.log("");
47
+ console.log(sectionTitle("Claude Desktop / Cowork"));
48
+ await activateCowork({ interactive: true });
49
+ }
50
+ /**
51
+ * Dado o resultado do checkbox de clientes, quais IDs (`CLIENTS[id]`) devem
52
+ * ser conferidos como instalados — várias escolhas do mesmo cliente colapsam
53
+ * num id só (ex.: claude-code-global e claude-code-repo → "claude-code").
54
+ */
55
+ export function resolveChosenClientIds(clientConfigs) {
56
+ const ids = new Set();
57
+ for (const choice of clientConfigs) {
58
+ if (choice.startsWith("claude-code"))
59
+ ids.add("claude-code");
60
+ if (choice === "codex-global")
61
+ ids.add("codex");
62
+ if (choice === "vscode-repo")
63
+ ids.add("vscode");
64
+ }
65
+ return ids;
66
+ }
67
+ export async function ensureChosenClientsInstalled(chosenClientIds) {
68
+ if (chosenClientIds.size === 0)
69
+ return;
70
+ console.log("");
71
+ console.log(sectionTitle("Clientes", "confirmando que estão instalados"));
72
+ for (const id of chosenClientIds) {
73
+ await ensureClientInstalled(CLIENTS[id], { interactive: true });
74
+ }
75
+ }
76
+ //# sourceMappingURL=clients-step.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clients-step.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/clients-step.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { existsSync } from "node:fs";
2
+ import { confirm } from "../../../lib/prompts.js";
3
+ import { c } from "../../../lib/colors.js";
4
+ import { startSpinner } from "../../../spinner.js";
5
+ import { writeProjectConfig, ensureGitignored, } from "../../../config.js";
6
+ import { fetchProjectContext, buildProjectOverview, ProjectContextError, } from "../../../lib/project-context.js";
7
+ import { concatenateRules } from "../../../lib/rules.js";
8
+ import { writeRepoHarness } from "../../../lib/harness.js";
9
+ import { printContextSummary, printHarnessResult } from "../../ui/render.js";
10
+ import { initCopy } from "../../copy.js";
11
+ /** Se já existe noclaf.json, confirma a sobrescrita. `true` = segue com o wizard. */
12
+ export async function confirmOverwriteIfExists(configPath) {
13
+ if (!existsSync(configPath))
14
+ return true;
15
+ const overwrite = await confirm({ message: initCopy.overwrite, default: false });
16
+ if (!overwrite)
17
+ console.log("Operação cancelada.");
18
+ return overwrite;
19
+ }
20
+ /** Grava o noclaf.json e garante que ele fica fora do git (best-effort). */
21
+ export function persistConfigStep(config, projectName) {
22
+ writeProjectConfig(config);
23
+ console.log(`[ok] Criado noclaf.json apontando para ${projectName}.`);
24
+ try {
25
+ if (ensureGitignored() === "added") {
26
+ console.log(`${c.dim(" + noclaf.json adicionado ao .gitignore")}`);
27
+ }
28
+ }
29
+ catch {
30
+ /* .gitignore best-effort — não bloqueia o init */
31
+ }
32
+ }
33
+ /**
34
+ * Carrega o contexto do projeto (specs/ADRs/membros) e monta o overview pro
35
+ * AGENTS.md. Falha aqui é degradada: o noclaf.json já foi salvo, então só avisa
36
+ * e devolve overview vazio.
37
+ */
38
+ export async function loadContextStep(supabase, config, user) {
39
+ const contextSpinner = startSpinner("Carregando contexto do projeto...");
40
+ try {
41
+ const context = await fetchProjectContext(supabase, config, user);
42
+ contextSpinner.stop();
43
+ printContextSummary(context);
44
+ return buildProjectOverview(context);
45
+ }
46
+ catch (err) {
47
+ const message = err instanceof ProjectContextError ? err.message : err.message;
48
+ contextSpinner.fail(`Não foi possível carregar o contexto: ${message}`);
49
+ console.error("O noclaf.json foi salvo. Rode `noclaf init` de novo se precisar revincular.");
50
+ return "";
51
+ }
52
+ }
53
+ /** Harness no repo: rules concatenadas + AGENTS.md (overview do NOS) + CLAUDE.md. */
54
+ export function writeHarnessStep(config, overview) {
55
+ try {
56
+ const h = writeRepoHarness(process.cwd(), {
57
+ rulesMarkdown: concatenateRules(config.selection ?? { roles: [], stacks: {} }),
58
+ overview,
59
+ });
60
+ printHarnessResult(h);
61
+ }
62
+ catch (err) {
63
+ console.error(`[aviso] Não consegui escrever o harness: ${err.message}`);
64
+ }
65
+ }
66
+ //# sourceMappingURL=context-step.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-step.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/context-step.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import { getProjectConfigPath } from "../../../config.js";
2
+ import { readDependencies, skillIdMap } from "../../../lib/skills.js";
3
+ import { collectRuleSkills } from "../../../lib/rules.js";
4
+ import { offerDependencyInstall, offerRuleSkills } from "../../flows/dependencies.js";
5
+ import { offerShellCompletion } from "../../flows/completion.js";
6
+ import { ensureCoreClients, offerDisableCoAuthoredBy } from "../../flows/clients.js";
7
+ import { flushTelemetry } from "../../../lib/telemetry.js";
8
+ import { ensureAuthenticated, createSessionStep } from "./auth-step.js";
9
+ import { fetchMemberProjectsStep, pickProject, pickRepository, buildBaseConfig, pickIde, } from "./project-step.js";
10
+ import { confirmOverwriteIfExists, persistConfigStep, loadContextStep, writeHarnessStep } from "./context-step.js";
11
+ import { promptClientChoices, installClients, activateCoworkIfChosen, resolveChosenClientIds, ensureChosenClientsInstalled, } from "./clients-step.js";
12
+ import { resolveProvisionTargets, fetchSkillsStep, provisionTargetsStep, provisionHooksStep, } from "./provision-step.js";
13
+ import { promptSelection } from "../../flows/sections.js";
14
+ /** Autenticação, projeto/repositório, seleção, IDE, config no disco + contexto/harness. */
15
+ async function resolveProjectSetup() {
16
+ await ensureAuthenticated();
17
+ const session = await createSessionStep();
18
+ const { supabase } = session;
19
+ const projects = await fetchMemberProjectsStep(supabase, session.user.id);
20
+ const selectedProject = await pickProject(projects);
21
+ const repositoryId = await pickRepository(supabase, selectedProject.id);
22
+ const config = buildBaseConfig(selectedProject.id, repositoryId);
23
+ config.selection = await promptSelection();
24
+ config.ide = await pickIde();
25
+ persistConfigStep(config, selectedProject.name);
26
+ const overview = await loadContextStep(supabase, config, session.user);
27
+ writeHarnessStep(config, overview);
28
+ return { config, session };
29
+ }
30
+ /** Escolha e instalação dos clientes de IA + provisionamento de skills/commands/hooks. */
31
+ async function installAndProvisionClients(config, session) {
32
+ const clientConfigs = await promptClientChoices();
33
+ installClients(clientConfigs, process.cwd());
34
+ await activateCoworkIfChosen(clientConfigs);
35
+ const chosenClientIds = resolveChosenClientIds(clientConfigs);
36
+ await ensureChosenClientsInstalled(chosenClientIds);
37
+ if (chosenClientIds.has("claude-code"))
38
+ await offerDisableCoAuthoredBy();
39
+ const provisionTargets = resolveProvisionTargets(clientConfigs);
40
+ await fetchSkillsStep();
41
+ provisionTargetsStep(provisionTargets, config, session, skillIdMap());
42
+ provisionHooksStep(provisionTargets, config);
43
+ }
44
+ /** Ofertas finais: libs externas da seleção, skills recomendadas, autocomplete do shell. */
45
+ async function offerFollowUps(config) {
46
+ await offerDependencyInstall(readDependencies(config.selection), { interactive: true });
47
+ await offerRuleSkills(collectRuleSkills(config.selection ?? { roles: [], stacks: {} }), { interactive: true });
48
+ await offerShellCompletion({ interactive: true, announceConfigured: true });
49
+ await flushTelemetry();
50
+ }
51
+ async function runInitWizard() {
52
+ const configPath = getProjectConfigPath();
53
+ if (!(await confirmOverwriteIfExists(configPath)))
54
+ return;
55
+ // Logo no início: confere Codex + Claude Code e oferece instalar os que faltam.
56
+ await ensureCoreClients({ interactive: true });
57
+ const { config, session } = await resolveProjectSetup();
58
+ await installAndProvisionClients(config, session);
59
+ await offerFollowUps(config);
60
+ }
61
+ export function registerInitCommand(program) {
62
+ program
63
+ .command("init")
64
+ .description("Cria noclaf.json no diretório atual vinculando a um projeto do NOS")
65
+ .action(runInitWizard);
66
+ }
67
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/index.ts"],"names":[],"mappings":"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"}