@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.
- package/README.md +221 -0
- package/dist/auth.js +66 -0
- package/dist/auth.js.map +1 -0
- package/dist/cli/commands/auth.js +76 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/init.js +291 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/skills.js +22 -0
- package/dist/cli/commands/skills.js.map +1 -0
- package/dist/cli/commands/sync.js +170 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/copy/auth.json +6 -0
- package/dist/cli/copy/flows.json +6 -0
- package/dist/cli/copy/init.json +19 -0
- package/dist/cli/copy/sync.json +3 -0
- package/dist/cli/copy.js +23 -0
- package/dist/cli/copy.js.map +1 -0
- package/dist/cli/flows/clients.js +108 -0
- package/dist/cli/flows/clients.js.map +1 -0
- package/dist/cli/flows/dependencies.js +68 -0
- package/dist/cli/flows/dependencies.js.map +1 -0
- package/dist/cli/flows/sections.js +45 -0
- package/dist/cli/flows/sections.js.map +1 -0
- package/dist/cli/ui/render.js +167 -0
- package/dist/cli/ui/render.js.map +1 -0
- package/dist/cli.js +25 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.js +96 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.js +10 -0
- package/dist/constants.js.map +1 -0
- package/dist/database.types.js +11 -0
- package/dist/database.types.js.map +1 -0
- package/dist/lib/active-project.js +28 -0
- package/dist/lib/active-project.js.map +1 -0
- package/dist/lib/client-configs.js +179 -0
- package/dist/lib/client-configs.js.map +1 -0
- package/dist/lib/client-install.js +40 -0
- package/dist/lib/client-install.js.map +1 -0
- package/dist/lib/colors.js +67 -0
- package/dist/lib/colors.js.map +1 -0
- package/dist/lib/cowork-extension.js +131 -0
- package/dist/lib/cowork-extension.js.map +1 -0
- package/dist/lib/dependencies.js +159 -0
- package/dist/lib/dependencies.js.map +1 -0
- package/dist/lib/duration.js +5 -0
- package/dist/lib/duration.js.map +1 -0
- package/dist/lib/file-merge.js +33 -0
- package/dist/lib/file-merge.js.map +1 -0
- package/dist/lib/hooks.js +231 -0
- package/dist/lib/hooks.js.map +1 -0
- package/dist/lib/project-context.js +105 -0
- package/dist/lib/project-context.js.map +1 -0
- package/dist/lib/prompts.js +62 -0
- package/dist/lib/prompts.js.map +1 -0
- package/dist/lib/provision.js +222 -0
- package/dist/lib/provision.js.map +1 -0
- package/dist/lib/require-config.js +31 -0
- package/dist/lib/require-config.js.map +1 -0
- package/dist/lib/sections.js +85 -0
- package/dist/lib/sections.js.map +1 -0
- package/dist/lib/skill-serve.js +71 -0
- package/dist/lib/skill-serve.js.map +1 -0
- package/dist/lib/skills-cache.js +89 -0
- package/dist/lib/skills-cache.js.map +1 -0
- package/dist/lib/skills.js +219 -0
- package/dist/lib/skills.js.map +1 -0
- package/dist/lib/targets.js +150 -0
- package/dist/lib/targets.js.map +1 -0
- package/dist/lib/task-history.js +14 -0
- package/dist/lib/task-history.js.map +1 -0
- package/dist/lib/telemetry.js +32 -0
- package/dist/lib/telemetry.js.map +1 -0
- package/dist/lib/tool-result.js +12 -0
- package/dist/lib/tool-result.js.map +1 -0
- package/dist/lib/version-check.js +88 -0
- package/dist/lib/version-check.js.map +1 -0
- package/dist/logo.js +17 -0
- package/dist/logo.js.map +1 -0
- package/dist/mcp-server.js +162 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/spinner.js +12 -0
- package/dist/spinner.js.map +1 -0
- package/dist/supabase.js +95 -0
- package/dist/supabase.js.map +1 -0
- package/dist/tools/comment-task.js +80 -0
- package/dist/tools/comment-task.js.map +1 -0
- package/dist/tools/create-task.js +194 -0
- package/dist/tools/create-task.js.map +1 -0
- package/dist/tools/end-allocation.js +59 -0
- package/dist/tools/end-allocation.js.map +1 -0
- package/dist/tools/end-task-allocation.js +51 -0
- package/dist/tools/end-task-allocation.js.map +1 -0
- package/dist/tools/get-active-allocation.js +106 -0
- package/dist/tools/get-active-allocation.js.map +1 -0
- package/dist/tools/get-context.js +47 -0
- package/dist/tools/get-context.js.map +1 -0
- package/dist/tools/get-task.js +223 -0
- package/dist/tools/get-task.js.map +1 -0
- package/dist/tools/index.js +34 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-my-allocations.js +87 -0
- package/dist/tools/list-my-allocations.js.map +1 -0
- package/dist/tools/list-projects.js +34 -0
- package/dist/tools/list-projects.js.map +1 -0
- package/dist/tools/list-tasks.js +213 -0
- package/dist/tools/list-tasks.js.map +1 -0
- package/dist/tools/move-task.js +98 -0
- package/dist/tools/move-task.js.map +1 -0
- package/dist/tools/set-project.js +47 -0
- package/dist/tools/set-project.js.map +1 -0
- package/dist/tools/start-allocation.js +45 -0
- package/dist/tools/start-allocation.js.map +1 -0
- package/dist/tools/start-task-allocation.js +141 -0
- package/dist/tools/start-task-allocation.js.map +1 -0
- package/dist/tools/update-task.js +256 -0
- package/dist/tools/update-task.js.map +1 -0
- package/dist/version.js +16 -0
- package/dist/version.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { c, sym, cmd, link, sectionTitle, highlightInlineCode, } from "../../lib/colors.js";
|
|
2
|
+
export function printInstallResult(label, result) {
|
|
3
|
+
const at = (p) => c.dim(p);
|
|
4
|
+
switch (result.status) {
|
|
5
|
+
case "created":
|
|
6
|
+
console.log(` ${c.green(sym.ok)} ${c.bold(label)} ${c.dim("criado")} ${at(result.path)}`);
|
|
7
|
+
break;
|
|
8
|
+
case "updated":
|
|
9
|
+
console.log(` ${c.green(sym.ok)} ${c.bold(label)} ${c.dim("atualizado")} ${at(result.path)}`);
|
|
10
|
+
if (result.backup)
|
|
11
|
+
console.log(` ${c.dim("backup:")} ${at(result.backup)}`);
|
|
12
|
+
break;
|
|
13
|
+
case "already_configured":
|
|
14
|
+
console.log(` ${c.green(sym.ok)} ${c.bold(label)} ${c.dim("já configurado")} ${at(result.path)}`);
|
|
15
|
+
break;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function provisionTag(action) {
|
|
19
|
+
switch (action) {
|
|
20
|
+
case "create":
|
|
21
|
+
return c.green("+");
|
|
22
|
+
case "update":
|
|
23
|
+
return c.cyan("~");
|
|
24
|
+
case "prune":
|
|
25
|
+
return c.red("-");
|
|
26
|
+
case "skip-conflict":
|
|
27
|
+
case "prune-kept":
|
|
28
|
+
return c.yellow("!");
|
|
29
|
+
default:
|
|
30
|
+
return " ";
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export function printProvisionResult(result) {
|
|
34
|
+
for (const f of result.files) {
|
|
35
|
+
if (f.action === "unchanged")
|
|
36
|
+
continue;
|
|
37
|
+
const detail = f.detail ? ` ${c.dim(`(${f.detail})`)}` : "";
|
|
38
|
+
console.log(` ${provisionTag(f.action)} ${f.relPath}${detail}`);
|
|
39
|
+
}
|
|
40
|
+
const count = (a) => result.files.filter((f) => f.action === a).length;
|
|
41
|
+
const part = (n, label, color) => n > 0 ? color(`${n} ${label}`) : c.dim(`${n} ${label}`);
|
|
42
|
+
const parts = [
|
|
43
|
+
part(count("create"), "criados", c.green),
|
|
44
|
+
part(count("update"), "atualizados", c.cyan),
|
|
45
|
+
c.dim(`${count("unchanged")} iguais`),
|
|
46
|
+
];
|
|
47
|
+
if (count("skip-conflict"))
|
|
48
|
+
parts.push(c.yellow(`${count("skip-conflict")} em conflito`));
|
|
49
|
+
if (count("prune"))
|
|
50
|
+
parts.push(c.red(`${count("prune")} removidos`));
|
|
51
|
+
if (count("prune-kept"))
|
|
52
|
+
parts.push(c.yellow(`${count("prune-kept")} preservados`));
|
|
53
|
+
const prefix = result.dryRun ? c.dim("[dry-run] ") : "";
|
|
54
|
+
const summary = result.files.length === 0
|
|
55
|
+
? c.dim("bundle vazio")
|
|
56
|
+
: parts.join(c.dim(" · "));
|
|
57
|
+
console.log(` ${prefix}${summary} ${c.dim(sym.arrow)} ${c.dim(result.targetDir)}`);
|
|
58
|
+
if (count("skip-conflict") > 0) {
|
|
59
|
+
console.log(` ${c.yellow(sym.warn)} ${c.dim("conflitos preservados — use")} ${cmd("noclaf sync --force")} ${c.dim("pra sobrescrever.")}`);
|
|
60
|
+
}
|
|
61
|
+
if (!result.dryRun &&
|
|
62
|
+
result.files.some((f) => f.action === "create" || f.action === "update")) {
|
|
63
|
+
console.log(` ${c.dim("reinicie o cliente pra carregar os skills/commands novos.")}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export function printHookResult(result) {
|
|
67
|
+
const prefix = result.dryRun ? c.dim("[dry-run] ") : "";
|
|
68
|
+
if (result.installed.length === 0 && result.prunedScripts.length === 0) {
|
|
69
|
+
console.log(` ${prefix}${c.dim("nenhum hook aplicável")}`);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
for (const h of result.installed) {
|
|
73
|
+
const on = h.matcher ? `${h.event}/${h.matcher}` : h.event;
|
|
74
|
+
console.log(` ${c.green("+")} ${c.bold(h.script)} ${c.dim(`(${on})`)}`);
|
|
75
|
+
if (h.description)
|
|
76
|
+
console.log(` ${c.dim(h.description)}`);
|
|
77
|
+
}
|
|
78
|
+
for (const p of result.prunedScripts) {
|
|
79
|
+
console.log(` ${c.red("-")} ${c.dim(p)}`);
|
|
80
|
+
}
|
|
81
|
+
const parts = [
|
|
82
|
+
result.installed.length > 0
|
|
83
|
+
? c.green(`${result.installed.length} hooks`)
|
|
84
|
+
: c.dim("0 hooks"),
|
|
85
|
+
];
|
|
86
|
+
if (result.prunedScripts.length > 0)
|
|
87
|
+
parts.push(c.red(`${result.prunedScripts.length} removidos`));
|
|
88
|
+
console.log(` ${prefix}${parts.join(c.dim(" · "))} ${c.dim(sym.arrow)} ${c.dim(result.settingsPath)}`);
|
|
89
|
+
if (!result.dryRun && result.installed.length > 0) {
|
|
90
|
+
console.log(` ${c.dim("registrados no settings.json — reinicie o Claude Code pra ativar.")}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export function depBadge(dep) {
|
|
94
|
+
if (dep.plan)
|
|
95
|
+
return c.gray(`· auto · ${dep.plan.kind}`);
|
|
96
|
+
if (dep.manual)
|
|
97
|
+
return c.gray("· manual · plugin");
|
|
98
|
+
return c.gray("· manual");
|
|
99
|
+
}
|
|
100
|
+
export function printDepHeader(dep) {
|
|
101
|
+
console.log("");
|
|
102
|
+
console.log(` ${c.magenta(sym.dot)} ${c.bold(dep.title)} ${depBadge(dep)}`);
|
|
103
|
+
if (dep.repo)
|
|
104
|
+
console.log(` ${link(dep.repo, dep.repo.replace(/^https?:\/\//, ""))}`);
|
|
105
|
+
if (dep.description)
|
|
106
|
+
console.log(` ${c.dim(dep.description)}`);
|
|
107
|
+
}
|
|
108
|
+
export function printManualSteps(manual) {
|
|
109
|
+
const bar = c.yellow("│");
|
|
110
|
+
console.log(` ${bar} ${c.yellow.bold("manual")}${c.dim(" — a CLI não automatiza; faça no cliente:")}`);
|
|
111
|
+
for (const raw of manual.split("\n")) {
|
|
112
|
+
const line = raw.trim();
|
|
113
|
+
if (!line)
|
|
114
|
+
continue;
|
|
115
|
+
const m = /^([^:`]{1,24}):\s*(.*)$/.exec(line);
|
|
116
|
+
if (m)
|
|
117
|
+
console.log(` ${bar} ${c.bold(m[1])} ${highlightInlineCode(m[2])}`);
|
|
118
|
+
else
|
|
119
|
+
console.log(` ${bar} ${highlightInlineCode(line)}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
export function printContextSummary(ctx) {
|
|
123
|
+
const dash = "—";
|
|
124
|
+
const fmtBool = (v) => v && v.length > 0 ? `sim (${v.length} caracteres)` : dash;
|
|
125
|
+
const fmtDate = (v) => v ?? "?";
|
|
126
|
+
const field = (label, value) => ` ${c.dim(label.padEnd(13))}${value}`;
|
|
127
|
+
console.log("");
|
|
128
|
+
console.log(sectionTitle("Contexto do projeto"));
|
|
129
|
+
console.log("");
|
|
130
|
+
console.log(field("Projeto", `${c.bold(ctx.project.name)} ${c.dim(`(${ctx.project.color})`)}`));
|
|
131
|
+
console.log(field("Horas/mês", `${ctx.project.monthly_hours ?? c.dim(dash)}`));
|
|
132
|
+
console.log(field("Notas", `${ctx.project.notes ?? c.dim(dash)}`));
|
|
133
|
+
console.log(field("AI context", fmtBool(ctx.project.ai_context)));
|
|
134
|
+
console.log("");
|
|
135
|
+
if (ctx.current_repository) {
|
|
136
|
+
const r = ctx.current_repository;
|
|
137
|
+
console.log(field("Repositório", `${c.bold(r.name)} ${c.dim(`(branch: ${r.default_branch})`)}`));
|
|
138
|
+
console.log(field("", link(r.url)));
|
|
139
|
+
console.log(field("AI context", fmtBool(r.ai_context)));
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
console.log(field("Repositório", c.dim(`${dash} (nenhum vinculado)`)));
|
|
143
|
+
}
|
|
144
|
+
const otherRepos = ctx.repositories.filter((r) => r.id !== ctx.current_repository?.id);
|
|
145
|
+
if (otherRepos.length > 0) {
|
|
146
|
+
console.log(field("Outros repos", c.dim(otherRepos.map((r) => r.name).join(", "))));
|
|
147
|
+
}
|
|
148
|
+
console.log("");
|
|
149
|
+
if (ctx.active_sprint) {
|
|
150
|
+
const s = ctx.active_sprint;
|
|
151
|
+
console.log(field("Sprint ativa", `${c.bold(s.name)} ${c.dim(`(${fmtDate(s.start_date)} → ${fmtDate(s.end_date)})`)}`));
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
console.log(field("Sprint ativa", c.dim(dash)));
|
|
155
|
+
}
|
|
156
|
+
console.log("");
|
|
157
|
+
console.log(` ${c.dim(`Membros (${ctx.members.length})`)}`);
|
|
158
|
+
for (const m of ctx.members) {
|
|
159
|
+
const name = m.full_name ?? "(sem nome)";
|
|
160
|
+
const handle = m.username ? c.cyan(`@${m.username}`) : c.dim(dash);
|
|
161
|
+
console.log(` ${c.magenta(sym.dot)} ${name.padEnd(26)} ${handle}`);
|
|
162
|
+
}
|
|
163
|
+
console.log("");
|
|
164
|
+
const you = ctx.current_user;
|
|
165
|
+
console.log(field("Você", `${c.bold(you.full_name ?? "(sem nome)")} ${c.dim(`<${you.email}>`)}`));
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/cli/ui/render.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { VERSION } from "./version.js";
|
|
4
|
+
import { LOGO } from "./logo.js";
|
|
5
|
+
import { notifyCliIfUpdate } from "./lib/version-check.js";
|
|
6
|
+
import { registerAuthCommands } from "./cli/commands/auth.js";
|
|
7
|
+
import { registerInitCommand } from "./cli/commands/init.js";
|
|
8
|
+
import { registerSyncCommand } from "./cli/commands/sync.js";
|
|
9
|
+
import { registerSkillsCommands } from "./cli/commands/skills.js";
|
|
10
|
+
notifyCliIfUpdate();
|
|
11
|
+
const program = new Command();
|
|
12
|
+
program
|
|
13
|
+
.name("noclaf")
|
|
14
|
+
.description("CLI do NOS (Noclaf Operation System)")
|
|
15
|
+
.version(VERSION)
|
|
16
|
+
.addHelpText("beforeAll", LOGO);
|
|
17
|
+
registerAuthCommands(program);
|
|
18
|
+
registerInitCommand(program);
|
|
19
|
+
registerSyncCommand(program);
|
|
20
|
+
registerSkillsCommands(program);
|
|
21
|
+
program.parseAsync(process.argv).catch((err) => {
|
|
22
|
+
console.error(`Erro: ${err.message}`);
|
|
23
|
+
process.exit(1);
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,iBAAiB,EAAE,CAAC;AAEpB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,sCAAsC,CAAC;KACnD,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AAElC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAEhC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,OAAO,CAAC,KAAK,CAAC,SAAU,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync } from 'node:fs';
|
|
2
|
+
import { join, isAbsolute } from 'node:path';
|
|
3
|
+
import { PROJECT_CONFIG_FILE } from './constants.js';
|
|
4
|
+
/** Parse leniente do bloco `sections` do noclaf.json. */
|
|
5
|
+
function parseSections(value) {
|
|
6
|
+
if (!value || typeof value !== 'object')
|
|
7
|
+
return undefined;
|
|
8
|
+
const s = value;
|
|
9
|
+
const profiles = Array.isArray(s.profiles)
|
|
10
|
+
? s.profiles.filter((p) => p === 'developer' || p === 'other')
|
|
11
|
+
: [];
|
|
12
|
+
const fields = Array.isArray(s.fields)
|
|
13
|
+
? s.fields.filter((f) => typeof f === 'string')
|
|
14
|
+
: [];
|
|
15
|
+
return { profiles, fields };
|
|
16
|
+
}
|
|
17
|
+
export const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
18
|
+
export function getProjectConfigPath(cwd = process.cwd()) {
|
|
19
|
+
return isAbsolute(cwd) ? join(cwd, PROJECT_CONFIG_FILE) : join(process.cwd(), cwd, PROJECT_CONFIG_FILE);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* ProjectConfig a partir de NOCLAF_PROJECT_ID / NOCLAF_REPOSITORY_ID — override
|
|
23
|
+
* opcional pro env do cliente MCP. O Cowork NÃO usa isto (projeto é por sessão).
|
|
24
|
+
* Retorna null se NOCLAF_PROJECT_ID não estiver definido.
|
|
25
|
+
*/
|
|
26
|
+
function loadProjectConfigFromEnv() {
|
|
27
|
+
const projectId = process.env.NOCLAF_PROJECT_ID?.trim();
|
|
28
|
+
if (!projectId)
|
|
29
|
+
return null;
|
|
30
|
+
if (!UUID_REGEX.test(projectId)) {
|
|
31
|
+
throw new Error('NOCLAF_PROJECT_ID não é um UUID válido.');
|
|
32
|
+
}
|
|
33
|
+
const config = { project_id: projectId };
|
|
34
|
+
const repositoryId = process.env.NOCLAF_REPOSITORY_ID?.trim();
|
|
35
|
+
if (repositoryId) {
|
|
36
|
+
if (!UUID_REGEX.test(repositoryId)) {
|
|
37
|
+
throw new Error('NOCLAF_REPOSITORY_ID deve ser um UUID válido.');
|
|
38
|
+
}
|
|
39
|
+
config.repository_id = repositoryId;
|
|
40
|
+
}
|
|
41
|
+
return config;
|
|
42
|
+
}
|
|
43
|
+
export function loadProjectConfig(cwd = process.cwd()) {
|
|
44
|
+
// Precedência pro ambiente (Desktop Extension / Cowork não têm noclaf.json no cwd).
|
|
45
|
+
const envConfig = loadProjectConfigFromEnv();
|
|
46
|
+
if (envConfig)
|
|
47
|
+
return envConfig;
|
|
48
|
+
const path = getProjectConfigPath(cwd);
|
|
49
|
+
if (!existsSync(path))
|
|
50
|
+
return null;
|
|
51
|
+
let raw;
|
|
52
|
+
try {
|
|
53
|
+
raw = readFileSync(path, 'utf8');
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
throw new Error(`Não foi possível ler ${PROJECT_CONFIG_FILE}: ${err.message}`);
|
|
57
|
+
}
|
|
58
|
+
let parsed;
|
|
59
|
+
try {
|
|
60
|
+
parsed = JSON.parse(raw);
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
throw new Error(`${PROJECT_CONFIG_FILE} contém JSON inválido: ${err.message}`);
|
|
64
|
+
}
|
|
65
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
66
|
+
throw new Error(`${PROJECT_CONFIG_FILE} deve conter um objeto JSON.`);
|
|
67
|
+
}
|
|
68
|
+
const obj = parsed;
|
|
69
|
+
const projectId = obj.project_id;
|
|
70
|
+
if (typeof projectId !== 'string' || !UUID_REGEX.test(projectId)) {
|
|
71
|
+
throw new Error(`${PROJECT_CONFIG_FILE}: campo "project_id" ausente ou não é um UUID válido.`);
|
|
72
|
+
}
|
|
73
|
+
const repositoryId = obj.repository_id;
|
|
74
|
+
if (repositoryId !== undefined &&
|
|
75
|
+
repositoryId !== null &&
|
|
76
|
+
(typeof repositoryId !== 'string' || !UUID_REGEX.test(repositoryId))) {
|
|
77
|
+
throw new Error(`${PROJECT_CONFIG_FILE}: campo "repository_id" deve ser UUID, null ou ausente.`);
|
|
78
|
+
}
|
|
79
|
+
const config = { project_id: projectId };
|
|
80
|
+
if (typeof repositoryId === 'string') {
|
|
81
|
+
config.repository_id = repositoryId;
|
|
82
|
+
}
|
|
83
|
+
else if (repositoryId === null) {
|
|
84
|
+
config.repository_id = null;
|
|
85
|
+
}
|
|
86
|
+
const sections = parseSections(obj.sections);
|
|
87
|
+
if (sections)
|
|
88
|
+
config.sections = sections;
|
|
89
|
+
return config;
|
|
90
|
+
}
|
|
91
|
+
export function writeProjectConfig(config, cwd = process.cwd()) {
|
|
92
|
+
const path = getProjectConfigPath(cwd);
|
|
93
|
+
const content = JSON.stringify(config, null, 2) + '\n';
|
|
94
|
+
writeFileSync(path, content, 'utf8');
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { homedir } from 'node:os';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
export const SUPABASE_URL = 'https://wdshvtlsjoegjvmpqobx.supabase.co';
|
|
4
|
+
export const SUPABASE_ANON_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Indkc2h2dGxzam9lZ2p2bXBxb2J4Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzU3NDA4OTQsImV4cCI6MjA5MTMxNjg5NH0.4wlAsT_D5gDiBQ19WA-q5zu105fT9TsD1NKI_tGQt-4';
|
|
5
|
+
export const TOKEN_EXCHANGE_URL = `${SUPABASE_URL}/functions/v1/mcp-token-exchange`;
|
|
6
|
+
export const CREDENTIALS_DIR = join(homedir(), '.noclaf');
|
|
7
|
+
export const CREDENTIALS_FILE = join(CREDENTIALS_DIR, 'credentials.json');
|
|
8
|
+
export const PROJECT_CONFIG_FILE = 'noclaf.json';
|
|
9
|
+
export const PAT_REGEX = /^noc_[a-f0-9]{64}$/;
|
|
10
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,YAAY,GAAG,0CAA0C,CAAC;AACvE,MAAM,CAAC,MAAM,iBAAiB,GAC5B,kNAAkN,CAAC;AAErN,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,YAAY,kCAAkC,CAAC;AAEpF,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAC1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;AAE1E,MAAM,CAAC,MAAM,mBAAmB,GAAG,aAAa,CAAC;AAEjD,MAAM,CAAC,MAAM,SAAS,GAAG,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tipos minimalistas das tabelas do NOS usadas pelo MCP.
|
|
3
|
+
*
|
|
4
|
+
* Não gerado automaticamente — `supabase gen types` exige credentials no projeto.
|
|
5
|
+
* Quando tiver acesso, substitua este arquivo por `npm run gen:types`.
|
|
6
|
+
*
|
|
7
|
+
* Cobre apenas as colunas que o MCP server lê hoje. Adicione campos
|
|
8
|
+
* conforme novas tools precisarem.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=database.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.types.js","sourceRoot":"","sources":["../src/database.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { UUID_REGEX } from '../config.js';
|
|
2
|
+
/**
|
|
3
|
+
* Projeto ativo da sessão, mantido **só em memória** pelo tempo de vida do
|
|
4
|
+
* processo do MCP server. Não persiste em disco: ao reiniciar o servidor o
|
|
5
|
+
* projeto volta ao default (noclaf.json/env), e nada vaza entre máquinas ou
|
|
6
|
+
* outros clientes.
|
|
7
|
+
*
|
|
8
|
+
* Caveat: no Claude Desktop/Cowork um único processo do servidor pode ser
|
|
9
|
+
* compartilhado entre conversas, então o ativo é por processo, não estritamente
|
|
10
|
+
* por conversa. O argumento `project_id` por chamada continua sendo o override
|
|
11
|
+
* por-conversa (ver `resolveProjectConfig`).
|
|
12
|
+
*/
|
|
13
|
+
let activeProjectId = null;
|
|
14
|
+
/** Projeto ativo da sessão, ou null se nenhum/UUID inválido. */
|
|
15
|
+
export function loadActiveProjectId() {
|
|
16
|
+
return activeProjectId !== null && UUID_REGEX.test(activeProjectId)
|
|
17
|
+
? activeProjectId
|
|
18
|
+
: null;
|
|
19
|
+
}
|
|
20
|
+
/** Define o projeto ativo da sessão (em memória). */
|
|
21
|
+
export function setActiveProjectId(projectId) {
|
|
22
|
+
activeProjectId = projectId;
|
|
23
|
+
}
|
|
24
|
+
/** Limpa o projeto ativo da sessão. */
|
|
25
|
+
export function clearActiveProjectId() {
|
|
26
|
+
activeProjectId = null;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=active-project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"active-project.js","sourceRoot":"","sources":["../../src/lib/active-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C;;;;;;;;;;GAUG;AACH,IAAI,eAAe,GAAkB,IAAI,CAAC;AAE1C,gEAAgE;AAChE,MAAM,UAAU,mBAAmB;IACjC,OAAO,eAAe,KAAK,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC;QACjE,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,eAAe,GAAG,SAAS,CAAC;AAC9B,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,oBAAoB;IAClC,eAAe,GAAG,IAAI,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join, dirname } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { backupFile, readJson, writeJson, readToml, writeToml } from './file-merge.js';
|
|
6
|
+
const MCP_COMMAND = 'noclaf-cli';
|
|
7
|
+
/**
|
|
8
|
+
* Lê o JSON do path; se for malformado, lança erro com mensagem clara
|
|
9
|
+
* apontando que o user deve consertar à mão.
|
|
10
|
+
*/
|
|
11
|
+
function readJsonSafe(path) {
|
|
12
|
+
try {
|
|
13
|
+
return readJson(path);
|
|
14
|
+
}
|
|
15
|
+
catch (err) {
|
|
16
|
+
throw new Error(`Arquivo ${path} contém JSON inválido (${err.message}). ` +
|
|
17
|
+
`Conserte ou apague antes de rodar de novo.`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function ensureMcpServersJson(path, rootKey) {
|
|
21
|
+
if (!existsSync(path)) {
|
|
22
|
+
writeJson(path, { [rootKey]: { noclaf: { command: MCP_COMMAND } } });
|
|
23
|
+
return { status: 'created', path };
|
|
24
|
+
}
|
|
25
|
+
const existing = (readJsonSafe(path) ?? {});
|
|
26
|
+
const root = (existing[rootKey] ?? {});
|
|
27
|
+
const current = root.noclaf;
|
|
28
|
+
if (current && current.command === MCP_COMMAND) {
|
|
29
|
+
return { status: 'already_configured', path };
|
|
30
|
+
}
|
|
31
|
+
const backup = backupFile(path);
|
|
32
|
+
const next = {
|
|
33
|
+
...existing,
|
|
34
|
+
[rootKey]: {
|
|
35
|
+
...root,
|
|
36
|
+
noclaf: { command: MCP_COMMAND },
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
writeJson(path, next);
|
|
40
|
+
return { status: 'updated', path, backup };
|
|
41
|
+
}
|
|
42
|
+
export function installClaudeCodeGlobal() {
|
|
43
|
+
const path = join(homedir(), '.claude', 'settings.json');
|
|
44
|
+
return ensureMcpServersJson(path, 'mcpServers');
|
|
45
|
+
}
|
|
46
|
+
export function installClaudeCodeRepo(cwd) {
|
|
47
|
+
const path = join(cwd, '.mcp.json');
|
|
48
|
+
return ensureMcpServersJson(path, 'mcpServers');
|
|
49
|
+
}
|
|
50
|
+
export function installVSCodeRepo(cwd) {
|
|
51
|
+
const path = join(cwd, '.vscode', 'mcp.json');
|
|
52
|
+
return ensureMcpServersJson(path, 'servers');
|
|
53
|
+
}
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
// Claude Desktop / Cowork — ativa o conector direto no config, sem `.mcpb`.
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
/** Diretório de config do Claude Desktop por SO (criado pelo app quando instalado). */
|
|
58
|
+
export function coworkConfigDir() {
|
|
59
|
+
if (process.platform === 'darwin') {
|
|
60
|
+
return join(homedir(), 'Library', 'Application Support', 'Claude');
|
|
61
|
+
}
|
|
62
|
+
if (process.platform === 'win32') {
|
|
63
|
+
return join(process.env.APPDATA ?? join(homedir(), 'AppData', 'Roaming'), 'Claude');
|
|
64
|
+
}
|
|
65
|
+
return join(homedir(), '.config', 'Claude');
|
|
66
|
+
}
|
|
67
|
+
export function coworkConfigPath() {
|
|
68
|
+
return join(coworkConfigDir(), 'claude_desktop_config.json');
|
|
69
|
+
}
|
|
70
|
+
/** O app está instalado? Presença do dir de config é o sinal (o app o cria). */
|
|
71
|
+
export function coworkAppInstalled() {
|
|
72
|
+
return existsSync(coworkConfigDir());
|
|
73
|
+
}
|
|
74
|
+
/** O conector noclaf já está no `claude_desktop_config.json`? */
|
|
75
|
+
export function coworkConfigured() {
|
|
76
|
+
const path = coworkConfigPath();
|
|
77
|
+
if (!existsSync(path))
|
|
78
|
+
return false;
|
|
79
|
+
try {
|
|
80
|
+
const json = (readJsonSafe(path) ?? {});
|
|
81
|
+
return Boolean(json.mcpServers?.noclaf);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/** Path absoluto do `dist/mcp-server.js` deste pacote (compila pra `dist/lib/`). */
|
|
88
|
+
function mcpServerJsPath() {
|
|
89
|
+
const here = dirname(fileURLToPath(import.meta.url)); // .../dist/lib
|
|
90
|
+
return join(here, '..', 'mcp-server.js'); // .../dist/mcp-server.js
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Ativa o conector noclaf direto no `claude_desktop_config.json` do Claude Desktop.
|
|
94
|
+
*
|
|
95
|
+
* Usa caminhos ABSOLUTOS (`process.execPath` + `dist/mcp-server.js`) porque o app é
|
|
96
|
+
* GUI e tem PATH mínimo — `noclaf-cli`/`node` via nvm não seriam encontrados. O PAT
|
|
97
|
+
* vem do `~/.noclaf/credentials.json` (via `noclaf login`); `NOCLAF_CLIENT=cowork`
|
|
98
|
+
* faz o server servir as skills por prompts/resources e escolher projeto por sessão.
|
|
99
|
+
* Não-destrutivo: faz merge + backup do config existente.
|
|
100
|
+
*/
|
|
101
|
+
export function installCoworkGlobal() {
|
|
102
|
+
const path = coworkConfigPath();
|
|
103
|
+
const entry = {
|
|
104
|
+
command: process.execPath,
|
|
105
|
+
args: [mcpServerJsPath()],
|
|
106
|
+
env: { NOCLAF_CLIENT: 'cowork' },
|
|
107
|
+
};
|
|
108
|
+
if (!existsSync(path)) {
|
|
109
|
+
writeJson(path, { mcpServers: { noclaf: entry } });
|
|
110
|
+
return { status: 'created', path };
|
|
111
|
+
}
|
|
112
|
+
const existing = (readJsonSafe(path) ?? {});
|
|
113
|
+
const root = (existing.mcpServers ?? {});
|
|
114
|
+
const current = root.noclaf;
|
|
115
|
+
if (current &&
|
|
116
|
+
current.command === entry.command &&
|
|
117
|
+
current.args?.[0] === entry.args?.[0] &&
|
|
118
|
+
current.env?.NOCLAF_CLIENT === 'cowork') {
|
|
119
|
+
return { status: 'already_configured', path };
|
|
120
|
+
}
|
|
121
|
+
const backup = backupFile(path);
|
|
122
|
+
writeJson(path, { ...existing, mcpServers: { ...root, noclaf: entry } });
|
|
123
|
+
return { status: 'updated', path, backup };
|
|
124
|
+
}
|
|
125
|
+
function claudeSettingsPath() {
|
|
126
|
+
return join(homedir(), '.claude', 'settings.json');
|
|
127
|
+
}
|
|
128
|
+
export function readCoAuthoredBy(path = claudeSettingsPath()) {
|
|
129
|
+
if (!existsSync(path))
|
|
130
|
+
return { path, value: undefined, enabled: true };
|
|
131
|
+
const json = (readJsonSafe(path) ?? {});
|
|
132
|
+
const value = json.includeCoAuthoredBy;
|
|
133
|
+
return { path, value, enabled: value !== false };
|
|
134
|
+
}
|
|
135
|
+
// ponytail: setamos só includeCoAuthoredBy=false (knob simples, ainda honrado).
|
|
136
|
+
// Se o Claude Code um dia remover em favor do `attribution`, migra aqui.
|
|
137
|
+
export function disableCoAuthoredBy(path = claudeSettingsPath()) {
|
|
138
|
+
const exists = existsSync(path);
|
|
139
|
+
const existing = exists ? (readJsonSafe(path) ?? {}) : {};
|
|
140
|
+
const backup = exists ? backupFile(path) : undefined;
|
|
141
|
+
writeJson(path, { ...existing, includeCoAuthoredBy: false });
|
|
142
|
+
return { status: exists ? 'updated' : 'created', path, backup };
|
|
143
|
+
}
|
|
144
|
+
export function installCodexGlobal() {
|
|
145
|
+
const path = join(homedir(), '.codex', 'config.toml');
|
|
146
|
+
// `NOCLAF_CLIENT=codex` avisa o servidor MCP a (1) provisionar/auto-pull pra
|
|
147
|
+
// `~/.codex` (skills + prompts) e (2) filtrar os docs pelo surface `codex`.
|
|
148
|
+
const noclafEntry = { command: MCP_COMMAND, env: { NOCLAF_CLIENT: 'codex' } };
|
|
149
|
+
if (!existsSync(path)) {
|
|
150
|
+
writeToml(path, { mcp_servers: { noclaf: noclafEntry } });
|
|
151
|
+
return { status: 'created', path };
|
|
152
|
+
}
|
|
153
|
+
let existing;
|
|
154
|
+
try {
|
|
155
|
+
existing = (readToml(path) ?? {});
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
throw new Error(`Arquivo ${path} contém TOML inválido (${err.message}). ` +
|
|
159
|
+
`Conserte ou apague antes de rodar de novo.`);
|
|
160
|
+
}
|
|
161
|
+
const servers = (existing.mcp_servers ?? {});
|
|
162
|
+
const current = servers.noclaf;
|
|
163
|
+
// Já configurado só se o comando bate E o env NOCLAF_CLIENT=codex já está lá —
|
|
164
|
+
// senão atualiza (instalações antigas ganham o env no próximo run).
|
|
165
|
+
if (current && current.command === MCP_COMMAND && current.env?.NOCLAF_CLIENT === 'codex') {
|
|
166
|
+
return { status: 'already_configured', path };
|
|
167
|
+
}
|
|
168
|
+
const backup = backupFile(path);
|
|
169
|
+
const next = {
|
|
170
|
+
...existing,
|
|
171
|
+
mcp_servers: {
|
|
172
|
+
...servers,
|
|
173
|
+
noclaf: { ...current, ...noclafEntry, env: { ...current?.env, NOCLAF_CLIENT: 'codex' } },
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
writeToml(path, next);
|
|
177
|
+
return { status: 'updated', path, backup };
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=client-configs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-configs.js","sourceRoot":"","sources":["../../src/lib/client-configs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
export const CLIENTS = {
|
|
3
|
+
'claude-code': {
|
|
4
|
+
id: 'claude-code',
|
|
5
|
+
label: 'Claude Code',
|
|
6
|
+
binary: 'claude',
|
|
7
|
+
npm: '@anthropic-ai/claude-code',
|
|
8
|
+
url: 'https://code.claude.com/docs/en/setup',
|
|
9
|
+
},
|
|
10
|
+
codex: {
|
|
11
|
+
id: 'codex',
|
|
12
|
+
label: 'Codex CLI',
|
|
13
|
+
binary: 'codex',
|
|
14
|
+
npm: '@openai/codex',
|
|
15
|
+
url: 'https://developers.openai.com/codex/cli',
|
|
16
|
+
},
|
|
17
|
+
vscode: {
|
|
18
|
+
id: 'vscode',
|
|
19
|
+
label: 'VS Code',
|
|
20
|
+
binary: 'code',
|
|
21
|
+
url: 'https://code.visualstudio.com/download',
|
|
22
|
+
},
|
|
23
|
+
cowork: {
|
|
24
|
+
id: 'cowork',
|
|
25
|
+
label: 'Claude Desktop (Cowork)',
|
|
26
|
+
url: 'https://claude.ai/download',
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
/** Detecta se um binário existe no PATH (roda `<bin> --version`). */
|
|
30
|
+
export function isBinaryInstalled(binary) {
|
|
31
|
+
try {
|
|
32
|
+
const res = spawnSync(binary, ['--version'], { stdio: 'ignore', timeout: 5000 });
|
|
33
|
+
// ENOENT → não está no PATH. Qualquer exit code (mesmo != 0) = existe.
|
|
34
|
+
return !res.error;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=client-install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-install.js","sourceRoot":"","sources":["../../src/lib/client-install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAiB/C,MAAM,CAAC,MAAM,OAAO,GAA+B;IACjD,aAAa,EAAE;QACb,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,aAAa;QACpB,MAAM,EAAE,QAAQ;QAChB,GAAG,EAAE,2BAA2B;QAChC,GAAG,EAAE,uCAAuC;KAC7C;IACD,KAAK,EAAE;QACL,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,WAAW;QAClB,MAAM,EAAE,OAAO;QACf,GAAG,EAAE,eAAe;QACpB,GAAG,EAAE,yCAAyC;KAC/C;IACD,MAAM,EAAE;QACN,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,wCAAwC;KAC9C;IACD,MAAM,EAAE;QACN,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,yBAAyB;QAChC,GAAG,EAAE,4BAA4B;KAClC;CACF,CAAC;AAEF,qEAAqE;AACrE,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACjF,uEAAuE;QACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|