@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":"hooks.js","sourceRoot":"","sources":["../../src/lib/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Erro com mensagem em pt-BR pronta pra mostrar ao usuário.
3
+ * Wrappers (tool MCP, CLI) só precisam pegar `.message`.
4
+ */
5
+ export class ProjectContextError extends Error {
6
+ }
7
+ export async function fetchProjectContext(supabase, config, user) {
8
+ const projectId = config.project_id;
9
+ const [projectRes, reposRes, sprintRes, membersRes] = await Promise.all([
10
+ supabase
11
+ .from('projects')
12
+ .select('id, name, color, monthly_hours, notes, ai_context')
13
+ .eq('id', projectId)
14
+ .maybeSingle(),
15
+ supabase
16
+ .from('repositories')
17
+ .select('id, project_id, name, url, default_branch, ai_context')
18
+ .eq('project_id', projectId)
19
+ .order('name'),
20
+ supabase
21
+ .from('sprints')
22
+ .select('id, name, start_date, end_date')
23
+ .eq('project_id', projectId)
24
+ .eq('status', 'ativa')
25
+ .maybeSingle(),
26
+ supabase
27
+ .from('project_members')
28
+ .select('user_id, profiles:profiles!inner(id, full_name, username, avatar_url)')
29
+ .eq('project_id', projectId),
30
+ ]);
31
+ if (projectRes.error) {
32
+ throw new ProjectContextError(`Erro ao buscar projeto: ${projectRes.error.message}`);
33
+ }
34
+ if (!projectRes.data) {
35
+ throw new ProjectContextError(`Projeto ${projectId} não encontrado ou você não tem acesso. Rode \`noclaf init\` pra revincular.`);
36
+ }
37
+ if (reposRes.error) {
38
+ throw new ProjectContextError(`Erro ao buscar repositórios: ${reposRes.error.message}`);
39
+ }
40
+ if (sprintRes.error) {
41
+ throw new ProjectContextError(`Erro ao buscar sprint ativa: ${sprintRes.error.message}`);
42
+ }
43
+ if (membersRes.error) {
44
+ throw new ProjectContextError(`Erro ao buscar membros: ${membersRes.error.message}`);
45
+ }
46
+ const project = projectRes.data;
47
+ const allRepos = reposRes.data ?? [];
48
+ const sprint = sprintRes.data;
49
+ const memberRows = (membersRes.data ?? []);
50
+ let currentRepository = null;
51
+ if (config.repository_id) {
52
+ const match = allRepos.find((r) => r.id === config.repository_id);
53
+ if (match) {
54
+ currentRepository = {
55
+ id: match.id,
56
+ name: match.name,
57
+ url: match.url,
58
+ default_branch: match.default_branch,
59
+ ai_context: match.ai_context,
60
+ };
61
+ }
62
+ }
63
+ const members = memberRows.map((row) => {
64
+ const profile = Array.isArray(row.profiles) ? row.profiles[0] : row.profiles;
65
+ return {
66
+ user_id: row.user_id,
67
+ full_name: profile?.full_name ?? null,
68
+ username: profile?.username ?? null,
69
+ avatar_url: profile?.avatar_url ?? null,
70
+ };
71
+ });
72
+ return {
73
+ project: {
74
+ id: project.id,
75
+ name: project.name,
76
+ color: project.color,
77
+ monthly_hours: project.monthly_hours,
78
+ notes: project.notes,
79
+ ai_context: project.ai_context,
80
+ },
81
+ current_repository: currentRepository,
82
+ repositories: allRepos.map((r) => ({
83
+ id: r.id,
84
+ name: r.name,
85
+ url: r.url,
86
+ default_branch: r.default_branch,
87
+ })),
88
+ active_sprint: sprint
89
+ ? {
90
+ id: sprint.id,
91
+ name: sprint.name,
92
+ start_date: sprint.start_date,
93
+ end_date: sprint.end_date,
94
+ }
95
+ : null,
96
+ members,
97
+ current_user: {
98
+ id: user.id,
99
+ email: user.email,
100
+ full_name: user.full_name,
101
+ username: user.username,
102
+ },
103
+ };
104
+ }
105
+ //# sourceMappingURL=project-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-context.js","sourceRoot":"","sources":["../../src/lib/project-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import { text, password as clackPassword, confirm as clackConfirm, select as clackSelect, multiselect, isCancel, cancel, } from '@clack/prompts';
2
+ /**
3
+ * Wrapper drop-in do `@clack/prompts` com a MESMA assinatura que o CLI já usava
4
+ * do `@inquirer/prompts` — então trocar o cliente de prompts é só mudar o import.
5
+ *
6
+ * Extras que o clack traz de graça: gutter `│`, símbolos `◇/◆/✓`, e cancelamento
7
+ * (Ctrl-C) tratado de forma central por `unwrap()` (encerra limpo em vez de stack).
8
+ */
9
+ /** Encerra limpo se o usuário cancelar (Ctrl-C) qualquer prompt. */
10
+ function unwrap(value) {
11
+ if (isCancel(value)) {
12
+ cancel('Operação cancelada.');
13
+ process.exit(130);
14
+ }
15
+ return value;
16
+ }
17
+ /**
18
+ * Converte o `validate` do inquirer (`(v: string) => true | string`) pro do clack
19
+ * (`Validate<string>` = `(v: string | undefined) => string | undefined`).
20
+ */
21
+ function adaptValidate(validate) {
22
+ if (!validate)
23
+ return undefined;
24
+ return (value) => {
25
+ const result = validate(value ?? '');
26
+ return result === true ? undefined : result || undefined;
27
+ };
28
+ }
29
+ export async function password(opts) {
30
+ return unwrap(await clackPassword({
31
+ message: opts.message,
32
+ mask: opts.mask,
33
+ validate: adaptValidate(opts.validate),
34
+ }));
35
+ }
36
+ export async function input(opts) {
37
+ return unwrap(await text({
38
+ message: opts.message,
39
+ initialValue: opts.default,
40
+ validate: adaptValidate(opts.validate),
41
+ }));
42
+ }
43
+ export async function confirm(opts) {
44
+ return unwrap(await clackConfirm({ message: opts.message, initialValue: opts.default }));
45
+ }
46
+ export async function select(opts) {
47
+ const options = opts.choices.map((ch) => ({
48
+ value: ch.value,
49
+ label: ch.name,
50
+ hint: ch.description,
51
+ }));
52
+ return unwrap(await clackSelect({ message: opts.message, options: options, initialValue: opts.default }));
53
+ }
54
+ export async function checkbox(opts) {
55
+ const options = opts.choices.map((ch) => ({
56
+ value: ch.value,
57
+ label: ch.name,
58
+ hint: ch.description,
59
+ }));
60
+ return unwrap(await multiselect({ message: opts.message, options: options, required: false }));
61
+ }
62
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/lib/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,QAAQ,IAAI,aAAa,EACzB,OAAO,IAAI,YAAY,EACvB,MAAM,IAAI,WAAW,EACrB,WAAW,EACX,QAAQ,EACR,MAAM,GACP,MAAM,gBAAgB,CAAC;AAExB;;;;;;GAMG;AAEH,oEAAoE;AACpE,SAAS,MAAM,CAAI,KAAiB;IAClC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,KAAU,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CACpB,QAA8C;IAE9C,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,OAAO,CAAC,KAAyB,EAAE,EAAE;QACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QACrC,OAAO,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,MAAiB,IAAI,SAAS,CAAC;IACvE,CAAC,CAAC;AACJ,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAI9B;IACC,OAAO,MAAM,CACX,MAAM,aAAa,CAAC;QAClB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC;KACvC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,IAI3B;IACC,OAAO,MAAM,CACX,MAAM,IAAI,CAAC;QACT,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,YAAY,EAAE,IAAI,CAAC,OAAO;QAC1B,QAAQ,EAAE,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC;KACvC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAA4C;IACxE,OAAO,MAAM,CAAC,MAAM,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AAC3F,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAI,IAI/B;IACC,MAAM,OAAO,GAAqB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1D,KAAK,EAAE,EAAE,CAAC,KAAK;QACf,KAAK,EAAE,EAAE,CAAC,IAAI;QACd,IAAI,EAAE,EAAE,CAAC,WAAW;KACrB,CAAC,CAAC,CAAC;IACJ,OAAO,MAAM,CACX,MAAM,WAAW,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAgB,EAAE,YAAY,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAC/F,CAAC;AACT,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAI,IAA+C;IAC/E,MAAM,OAAO,GAAqB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1D,KAAK,EAAE,EAAE,CAAC,KAAK;QACf,KAAK,EAAE,EAAE,CAAC,IAAI;QACd,IAAI,EAAE,EAAE,CAAC,WAAW;KACrB,CAAC,CAAC,CAAC;IACJ,OAAO,MAAM,CACX,MAAM,WAAW,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAgB,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAClF,CAAC;AACX,CAAC"}
@@ -0,0 +1,222 @@
1
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, rmSync, } from "node:fs";
2
+ import { createHash } from "node:crypto";
3
+ import { homedir } from "node:os";
4
+ import { dirname, join, relative, sep } from "node:path";
5
+ import { VERSION } from "../version.js";
6
+ import { claudeTarget } from "./targets.js";
7
+ import { filterDocsForSurface, skillsDir } from "./skills.js";
8
+ import { discoverRoles, filterDocsForSection, flattenSections, } from "./sections.js";
9
+ /**
10
+ * Provisiona o conteúdo (skills / commands / agents) do noclaf pros clientes. O MCP
11
+ * não consegue gravar em `~/.claude` sozinho — a CLI (`sync`/`init`) chama `provision()`.
12
+ * Idempotente e não-destrutivo via manifesto (`.noclaf-provision.json`): re-rodar só
13
+ * atualiza os arquivos dele, nunca sobrescreve os do worker (a menos que `force`).
14
+ */
15
+ /** Subpastas do pacote `@noclaf/skills` espelhadas em `~/.claude`. */
16
+ const SYNCED_SUBDIRS = ["commands", "skills", "agents"];
17
+ /** Basenames que nunca são copiados pro destino (READMEs são só do repo). */
18
+ const IGNORED_BASENAMES = new Set([".gitkeep", ".DS_Store", "README.md"]);
19
+ export const MANIFEST_NAME = ".noclaf-provision.json";
20
+ function defaultTargetDir() {
21
+ return join(homedir(), ".claude");
22
+ }
23
+ function sha256(buf) {
24
+ return createHash("sha256").update(buf).digest("hex");
25
+ }
26
+ /** Lista arquivos sob `dir` recursivamente, paths relativos a `dir` em estilo POSIX. */
27
+ function listFilesRecursive(dir) {
28
+ const out = [];
29
+ const walk = (abs) => {
30
+ for (const entry of readdirSync(abs, { withFileTypes: true })) {
31
+ if (entry.name === ".DS_Store")
32
+ continue;
33
+ const childAbs = join(abs, entry.name);
34
+ if (entry.isDirectory())
35
+ walk(childAbs);
36
+ else if (entry.isFile())
37
+ out.push(relative(dir, childAbs).split(sep).join("/"));
38
+ }
39
+ };
40
+ walk(dir);
41
+ return out;
42
+ }
43
+ function readManifest(path) {
44
+ if (!existsSync(path))
45
+ return null;
46
+ try {
47
+ const parsed = JSON.parse(readFileSync(path, "utf-8"));
48
+ if (parsed && typeof parsed === "object" && parsed.files)
49
+ return parsed;
50
+ }
51
+ catch {
52
+ // manifesto corrompido → trata como ausente e reconstrói
53
+ }
54
+ return null;
55
+ }
56
+ /** Coleta os arquivos sincronizáveis do pacote (só as subpastas conhecidas). */
57
+ function collectSkillFiles(dir) {
58
+ const files = [];
59
+ for (const sub of SYNCED_SUBDIRS) {
60
+ const subDir = join(dir, sub);
61
+ if (!existsSync(subDir))
62
+ continue;
63
+ for (const rel of listFilesRecursive(subDir)) {
64
+ const base = rel.split("/").pop() ?? rel;
65
+ if (IGNORED_BASENAMES.has(base))
66
+ continue;
67
+ const abs = join(subDir, rel);
68
+ const content = readFileSync(abs);
69
+ files.push({ relPath: `${sub}/${rel}`, content, hash: sha256(content) });
70
+ }
71
+ }
72
+ return files;
73
+ }
74
+ function writeFile(targetAbs, content) {
75
+ mkdirSync(dirname(targetAbs), { recursive: true });
76
+ writeFileSync(targetAbs, content);
77
+ }
78
+ /**
79
+ * Núcleo do provisionamento: aplica `docs` no destino, idempotente e não-destrutivo
80
+ * via manifesto. Retorna o plano por arquivo.
81
+ */
82
+ export function applyProvision(docs, options = {}) {
83
+ const dryRun = options.dryRun ?? false;
84
+ const force = options.force ?? false;
85
+ const prune = options.prune ?? true;
86
+ const targetDir = options.targetDir ?? defaultTargetDir();
87
+ const manifestPath = join(targetDir, MANIFEST_NAME);
88
+ const oldFiles = readManifest(manifestPath)?.files ?? {};
89
+ const files = docs.map((d) => ({
90
+ relPath: d.relPath,
91
+ content: d.content,
92
+ hash: sha256(d.content),
93
+ }));
94
+ const incomingSet = new Set(files.map((f) => f.relPath));
95
+ const results = [];
96
+ const newFiles = {};
97
+ for (const f of files) {
98
+ const targetAbs = join(targetDir, f.relPath);
99
+ if (!existsSync(targetAbs)) {
100
+ if (!dryRun)
101
+ writeFile(targetAbs, f.content);
102
+ results.push({ relPath: f.relPath, action: "create" });
103
+ newFiles[f.relPath] = f.hash;
104
+ continue;
105
+ }
106
+ const existingHash = sha256(readFileSync(targetAbs));
107
+ if (existingHash === f.hash) {
108
+ results.push({ relPath: f.relPath, action: "unchanged" });
109
+ newFiles[f.relPath] = f.hash;
110
+ continue;
111
+ }
112
+ // Divergente. Só atualizamos se o arquivo era nosso e o worker não mexeu,
113
+ // ou se ele pediu --force.
114
+ const wasOursUntouched = oldFiles[f.relPath] === existingHash;
115
+ if (wasOursUntouched || force) {
116
+ if (!dryRun)
117
+ writeFile(targetAbs, f.content);
118
+ results.push({
119
+ relPath: f.relPath,
120
+ action: "update",
121
+ detail: wasOursUntouched
122
+ ? undefined
123
+ : "forçado sobre arquivo divergente",
124
+ });
125
+ newFiles[f.relPath] = f.hash;
126
+ }
127
+ else {
128
+ results.push({
129
+ relPath: f.relPath,
130
+ action: "skip-conflict",
131
+ detail: oldFiles[f.relPath] !== undefined
132
+ ? "editado localmente"
133
+ : "arquivo de terceiros",
134
+ });
135
+ // Não reivindica propriedade: fica de fora do novo manifesto.
136
+ }
137
+ }
138
+ // Prune: o que era nosso mas não veio nesta fonte.
139
+ if (prune) {
140
+ for (const [relPath, oldHash] of Object.entries(oldFiles)) {
141
+ if (incomingSet.has(relPath))
142
+ continue;
143
+ const targetAbs = join(targetDir, relPath);
144
+ if (!existsSync(targetAbs))
145
+ continue;
146
+ const existingHash = sha256(readFileSync(targetAbs));
147
+ if (existingHash === oldHash) {
148
+ if (!dryRun)
149
+ rmSync(targetAbs);
150
+ results.push({ relPath, action: "prune" });
151
+ }
152
+ else {
153
+ results.push({
154
+ relPath,
155
+ action: "prune-kept",
156
+ detail: "modificado localmente — mantido",
157
+ });
158
+ }
159
+ }
160
+ }
161
+ if (!dryRun) {
162
+ const manifest = {
163
+ version: VERSION,
164
+ generator: "@noclaf/cli",
165
+ files: newFiles,
166
+ };
167
+ mkdirSync(targetDir, { recursive: true });
168
+ writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + "\n", "utf-8");
169
+ }
170
+ return { targetDir, version: VERSION, dryRun, files: results };
171
+ }
172
+ /**
173
+ * Copia/atualiza o conteúdo do pacote `@noclaf/skills` no destino.
174
+ * (`noclaf sync` / `noclaf init`.)
175
+ */
176
+ export function provision(options = {}) {
177
+ const target = options.target ?? claudeTarget;
178
+ const dir = options.skillsDir ?? skillsDir();
179
+ if (!existsSync(dir)) {
180
+ throw new Error(`Pacote de skills não encontrado em ${dir}. Instale/publique @noclaf/skills.`);
181
+ }
182
+ const rawDocs = collectSkillFiles(dir).map((f) => ({
183
+ relPath: f.relPath,
184
+ content: f.content,
185
+ }));
186
+ const scoped = filterDocsForSection(rawDocs, options.sections, discoverRoles(dir));
187
+ const flat = flattenSections(scoped);
188
+ const visible = filterDocsForSurface(flat, target.surface);
189
+ const docs = target.mapDocs(visible);
190
+ return applyProvision(docs, {
191
+ ...options,
192
+ targetDir: options.targetDir ?? target.targetDir(),
193
+ });
194
+ }
195
+ /** Remove só o que o noclaf instalou (conforme o manifesto), preservando edições locais. */
196
+ export function uninstallProvision(options = {}) {
197
+ const dryRun = options.dryRun ?? false;
198
+ const targetDir = options.targetDir ?? defaultTargetDir();
199
+ const manifestPath = join(targetDir, MANIFEST_NAME);
200
+ const manifest = readManifest(manifestPath);
201
+ const removed = [];
202
+ const kept = [];
203
+ if (manifest) {
204
+ for (const [relPath, hash] of Object.entries(manifest.files)) {
205
+ const targetAbs = join(targetDir, relPath);
206
+ if (!existsSync(targetAbs))
207
+ continue;
208
+ if (sha256(readFileSync(targetAbs)) === hash) {
209
+ if (!dryRun)
210
+ rmSync(targetAbs);
211
+ removed.push(relPath);
212
+ }
213
+ else {
214
+ kept.push(relPath);
215
+ }
216
+ }
217
+ if (!dryRun && existsSync(manifestPath))
218
+ rmSync(manifestPath);
219
+ }
220
+ return { targetDir, removed, kept, dryRun };
221
+ }
222
+ //# sourceMappingURL=provision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provision.js","sourceRoot":"","sources":["../../src/lib/provision.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { UUID_REGEX } from '../config.js';
2
+ import { errorResult } from './tool-result.js';
3
+ import { loadActiveProjectId } from './active-project.js';
4
+ /**
5
+ * Resolve o projeto efetivo de uma chamada, na ordem:
6
+ * 1. project_id explícito passado na tool (override por chamada)
7
+ * 2. projeto ativo da sessão (`nos_set_project`, só em memória)
8
+ * 3. default do ambiente/arquivo (NOCLAF_PROJECT_ID / noclaf.json)
9
+ *
10
+ * O repository_id default só é aplicado quando o projeto resolvido é o mesmo do
11
+ * default — evita herdar um repositório de outro projeto.
12
+ */
13
+ export function resolveProjectConfig(ctx, explicitProjectId) {
14
+ const projectId = explicitProjectId ?? loadActiveProjectId() ?? ctx.config?.project_id;
15
+ if (!projectId) {
16
+ return errorResult('Nenhum projeto selecionado. Use `nos_list_projects` para ver os seus e ' +
17
+ '`nos_set_project` para escolher um (ou passe `project_id` direto na chamada).');
18
+ }
19
+ if (!UUID_REGEX.test(projectId)) {
20
+ return errorResult(`project_id inválido (UUID esperado): ${projectId}`);
21
+ }
22
+ const config = { project_id: projectId };
23
+ if (projectId === ctx.config?.project_id && ctx.config?.repository_id) {
24
+ config.repository_id = ctx.config.repository_id;
25
+ }
26
+ return config;
27
+ }
28
+ export function isErrorResult(value) {
29
+ return typeof value === 'object' && value !== null && 'isError' in value;
30
+ }
31
+ //# sourceMappingURL=require-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-config.js","sourceRoot":"","sources":["../../src/lib/require-config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAsB,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAClC,GAAgB,EAChB,iBAA0B;IAE1B,MAAM,SAAS,GAAG,iBAAiB,IAAI,mBAAmB,EAAE,IAAI,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;IAEvF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,WAAW,CAChB,yEAAyE;YACvE,+EAA+E,CAClF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,OAAO,WAAW,CAAC,wCAAwC,SAAS,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,MAAM,GAAkB,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;IACxD,IAAI,SAAS,KAAK,GAAG,CAAC,MAAM,EAAE,UAAU,IAAI,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC;QACtE,MAAM,CAAC,aAAa,GAAG,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC;IAClD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS,IAAI,KAAK,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,85 @@
1
+ import { existsSync, readdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ const KINDS = ['commands', 'skills', 'agents'];
4
+ export const DEV_ROLE = 'dev';
5
+ export const GENERAL_FIELD = 'general';
6
+ /** Roles = pastas de topo (união de commands/skills/agents). */
7
+ export function discoverRoles(rootDir) {
8
+ const roles = new Set();
9
+ for (const kind of KINDS) {
10
+ const dir = join(rootDir, kind);
11
+ if (!existsSync(dir))
12
+ continue;
13
+ for (const e of readdirSync(dir, { withFileTypes: true })) {
14
+ if (e.isDirectory() && !e.name.startsWith('.'))
15
+ roles.add(e.name);
16
+ }
17
+ }
18
+ return [...roles].sort();
19
+ }
20
+ /** Áreas do dev = subpastas de `skills/dev` menos `general`. */
21
+ export function discoverDevFields(rootDir) {
22
+ const dir = join(rootDir, 'skills', DEV_ROLE);
23
+ if (!existsSync(dir))
24
+ return [];
25
+ return readdirSync(dir, { withFileTypes: true })
26
+ .filter((e) => e.isDirectory() && !e.name.startsWith('.') && e.name !== GENERAL_FIELD)
27
+ .map((e) => e.name)
28
+ .sort();
29
+ }
30
+ /** Perfis → roles concretos: `developer`→`dev`; `other`→todos os não-dev. */
31
+ export function resolveRoles(selection, allRoles) {
32
+ const roles = new Set();
33
+ if (selection.profiles.includes('developer'))
34
+ roles.add(DEV_ROLE);
35
+ if (selection.profiles.includes('other')) {
36
+ for (const r of allRoles)
37
+ if (r !== DEV_ROLE)
38
+ roles.add(r);
39
+ }
40
+ return roles;
41
+ }
42
+ /** `commands/dev/x.md` → role `dev`; `skills/dev/front-end/y/SKILL.md` → role `dev`, field `front-end`. */
43
+ function roleFieldOf(relPath) {
44
+ const parts = relPath.split('/');
45
+ const kind = parts[0];
46
+ const role = parts[1] ?? '';
47
+ const field = kind === 'skills' && role === DEV_ROLE ? parts[2] : undefined;
48
+ return { kind, role, field };
49
+ }
50
+ /**
51
+ * Mantém só os docs dos roles selecionados; pras skills do dev, aplica também o
52
+ * filtro de área (`general` sempre entra). Sem seleção (`undefined`) → tudo.
53
+ */
54
+ export function filterDocsForSection(docs, selection, allRoles) {
55
+ if (!selection)
56
+ return docs;
57
+ const roles = resolveRoles(selection, allRoles);
58
+ const fields = new Set(selection.fields);
59
+ return docs.filter((d) => {
60
+ const { kind, role, field } = roleFieldOf(d.relPath);
61
+ if (!roles.has(role))
62
+ return false;
63
+ if (kind === 'skills' && role === DEV_ROLE && field !== undefined) {
64
+ return field === GENERAL_FIELD || fields.has(field);
65
+ }
66
+ return true;
67
+ });
68
+ }
69
+ /**
70
+ * Achata os segmentos de seção: dropa o role (e, pras skills do dev, o field),
71
+ * mantendo a pasta da skill. `skills/dev/front-end/review-animations/SKILL.md` →
72
+ * `skills/review-animations/SKILL.md`; `commands/dev/init-sdd.md` → `commands/init-sdd.md`.
73
+ */
74
+ export function flattenSections(docs) {
75
+ return docs.map((d) => {
76
+ const parts = d.relPath.split('/');
77
+ const [kind, role, ...rest] = parts;
78
+ let flatRest = rest;
79
+ if (kind === 'skills' && role === DEV_ROLE && rest.length > 1) {
80
+ flatRest = rest.slice(1); // dropa o field também
81
+ }
82
+ return { ...d, relPath: `${kind}/${flatRest.join('/')}` };
83
+ });
84
+ }
85
+ //# sourceMappingURL=sections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sections.js","sourceRoot":"","sources":["../../src/lib/sections.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import { readSkillFiles, toSkillDocs } from './skills.js';
2
+ /**
3
+ * Camada de **serviço** do pacote de skills pro servidor MCP: expõe os docs como
4
+ * resources (leitura sob demanda) e como prompts (slash/commands no Cowork e Codex).
5
+ * Só o `mcp-server.ts` importa isto — o CLI nunca precisa.
6
+ */
7
+ export const SKILLS_URI_PREFIX = 'noclaf://skills/';
8
+ let cache = null;
9
+ /** Carrega o pacote de skills, memoizado (não muda enquanto o processo roda). */
10
+ export function loadSkills(dir) {
11
+ if (cache && !dir)
12
+ return cache;
13
+ const files = readSkillFiles(dir);
14
+ const loaded = {
15
+ docs: toSkillDocs(files),
16
+ rawByPath: new Map(files.map((f) => [f.path, f.raw])),
17
+ };
18
+ if (!dir)
19
+ cache = loaded;
20
+ return loaded;
21
+ }
22
+ /** Limpa o cache (testes / dir custom). */
23
+ export function clearSkillsCache() {
24
+ cache = null;
25
+ }
26
+ export function skillResourceDescriptors(docs) {
27
+ return docs.map((d) => ({
28
+ uri: `${SKILLS_URI_PREFIX}${d.path}`,
29
+ name: d.title,
30
+ description: d.description || `${d.type}: ${d.path}`,
31
+ mimeType: 'text/markdown',
32
+ }));
33
+ }
34
+ /** Lê um resource pela URI, a partir dos docs + os markdowns crus por path. */
35
+ export function readSkillResource(uri, docs, rawByPath) {
36
+ if (!uri.startsWith(SKILLS_URI_PREFIX))
37
+ throw new Error(`URI fora do pacote de skills: ${uri}`);
38
+ const rel = uri.slice(SKILLS_URI_PREFIX.length);
39
+ const doc = docs.find((d) => d.path === rel);
40
+ if (!doc)
41
+ throw new Error(`Recurso não encontrado: ${uri}`);
42
+ return { uri, mimeType: 'text/markdown', text: rawByPath.get(rel) ?? doc.content };
43
+ }
44
+ /** Só `command` e `skill` viram prompts (docs/agents/dependencies não). */
45
+ function isPromptable(type) {
46
+ return type === 'command' || type === 'skill';
47
+ }
48
+ export function skillPromptDescriptors(docs) {
49
+ return docs
50
+ .filter((d) => isPromptable(d.type))
51
+ .map((d) => ({
52
+ name: d.id,
53
+ description: `[${d.type}] ${d.description || d.title}`.slice(0, 200),
54
+ arguments: [
55
+ {
56
+ name: 'args',
57
+ description: d.frontmatter['argument-hint'] || 'Argumentos opcionais passados ao prompt.',
58
+ required: false,
59
+ },
60
+ ],
61
+ }));
62
+ }
63
+ /** Monta o texto de um prompt: corpo do doc com `$ARGUMENTS` substituído. */
64
+ export function buildSkillPrompt(name, args, docs) {
65
+ const doc = docs.find((d) => d.id === name && isPromptable(d.type));
66
+ if (!doc)
67
+ throw new Error(`Prompt desconhecido: ${name}`);
68
+ const text = doc.content.split('$ARGUMENTS').join(args?.args ?? '');
69
+ return { description: doc.description || doc.title, text };
70
+ }
71
+ //# sourceMappingURL=skill-serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-serve.js","sourceRoot":"","sources":["../../src/lib/skill-serve.ts"],"names":[],"mappings":"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"}