@nio-cli/cli 0.1.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 +280 -0
- package/dist/adapters/supabase/allocation-gateway.js +236 -0
- package/dist/adapters/supabase/allocation-gateway.js.map +1 -0
- package/dist/adapters/supabase/analytics-gateway.js +18 -0
- package/dist/adapters/supabase/analytics-gateway.js.map +1 -0
- package/dist/adapters/supabase/client.js +96 -0
- package/dist/adapters/supabase/client.js.map +1 -0
- package/dist/adapters/supabase/context-gateway.js +23 -0
- package/dist/adapters/supabase/context-gateway.js.map +1 -0
- package/dist/adapters/supabase/gateway.js +18 -0
- package/dist/adapters/supabase/gateway.js.map +1 -0
- package/dist/adapters/supabase/task-gateway.js +450 -0
- package/dist/adapters/supabase/task-gateway.js.map +1 -0
- package/dist/auth.js +118 -0
- package/dist/auth.js.map +1 -0
- package/dist/brand.js +91 -0
- package/dist/brand.js.map +1 -0
- package/dist/cli/commands/auth.js +128 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/clean.js +120 -0
- package/dist/cli/commands/clean.js.map +1 -0
- package/dist/cli/commands/completion.js +114 -0
- package/dist/cli/commands/completion.js.map +1 -0
- package/dist/cli/commands/exec.js +59 -0
- package/dist/cli/commands/exec.js.map +1 -0
- package/dist/cli/commands/init/auth-step.js +49 -0
- package/dist/cli/commands/init/auth-step.js.map +1 -0
- package/dist/cli/commands/init/clients-step.js +76 -0
- package/dist/cli/commands/init/clients-step.js.map +1 -0
- package/dist/cli/commands/init/context-step.js +71 -0
- package/dist/cli/commands/init/context-step.js.map +1 -0
- package/dist/cli/commands/init/index.js +76 -0
- package/dist/cli/commands/init/index.js.map +1 -0
- package/dist/cli/commands/init/project-step.js +105 -0
- package/dist/cli/commands/init/project-step.js.map +1 -0
- package/dist/cli/commands/init/provision-step.js +103 -0
- package/dist/cli/commands/init/provision-step.js.map +1 -0
- package/dist/cli/commands/plan.js +45 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/skills.js +23 -0
- package/dist/cli/commands/skills.js.map +1 -0
- package/dist/cli/commands/sync.js +296 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/validate-plan.js +42 -0
- package/dist/cli/commands/validate-plan.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 +130 -0
- package/dist/cli/flows/clients.js.map +1 -0
- package/dist/cli/flows/completion.js +63 -0
- package/dist/cli/flows/completion.js.map +1 -0
- package/dist/cli/flows/dependencies.js +114 -0
- package/dist/cli/flows/dependencies.js.map +1 -0
- package/dist/cli/flows/sections.js +85 -0
- package/dist/cli/flows/sections.js.map +1 -0
- package/dist/cli/flows/user-config.js +37 -0
- package/dist/cli/flows/user-config.js.map +1 -0
- package/dist/cli/ui/render.js +237 -0
- package/dist/cli/ui/render.js.map +1 -0
- package/dist/cli/ui/report.js +117 -0
- package/dist/cli/ui/report.js.map +1 -0
- package/dist/cli.js +36 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.js +280 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.js +9 -0
- package/dist/constants.js.map +1 -0
- package/dist/core/ports.js +2 -0
- package/dist/core/ports.js.map +1 -0
- package/dist/core/types.js +7 -0
- package/dist/core/types.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/autopull.js +13 -0
- package/dist/lib/autopull.js.map +1 -0
- package/dist/lib/client-configs.js +191 -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 +93 -0
- package/dist/lib/colors.js.map +1 -0
- package/dist/lib/cowork-extension.js +143 -0
- package/dist/lib/cowork-extension.js.map +1 -0
- package/dist/lib/dependencies.js +145 -0
- package/dist/lib/dependencies.js.map +1 -0
- package/dist/lib/dependency-install.js +163 -0
- package/dist/lib/dependency-install.js.map +1 -0
- package/dist/lib/duration.js +5 -0
- package/dist/lib/duration.js.map +1 -0
- package/dist/lib/exec-delegate.js +167 -0
- package/dist/lib/exec-delegate.js.map +1 -0
- package/dist/lib/exec-engines.js +72 -0
- package/dist/lib/exec-engines.js.map +1 -0
- package/dist/lib/file-merge.js +33 -0
- package/dist/lib/file-merge.js.map +1 -0
- package/dist/lib/harness.js +90 -0
- package/dist/lib/harness.js.map +1 -0
- package/dist/lib/hooks.js +217 -0
- package/dist/lib/hooks.js.map +1 -0
- package/dist/lib/patterns.js +61 -0
- package/dist/lib/patterns.js.map +1 -0
- package/dist/lib/plan-delegate.js +106 -0
- package/dist/lib/plan-delegate.js.map +1 -0
- package/dist/lib/project-context.js +151 -0
- package/dist/lib/project-context.js.map +1 -0
- package/dist/lib/prompts.js +69 -0
- package/dist/lib/prompts.js.map +1 -0
- package/dist/lib/provision-apply.js +220 -0
- package/dist/lib/provision-apply.js.map +1 -0
- package/dist/lib/provision-collect.js +47 -0
- package/dist/lib/provision-collect.js.map +1 -0
- package/dist/lib/provision.js +45 -0
- package/dist/lib/provision.js.map +1 -0
- package/dist/lib/require-config.js +32 -0
- package/dist/lib/require-config.js.map +1 -0
- package/dist/lib/rules.js +99 -0
- package/dist/lib/rules.js.map +1 -0
- package/dist/lib/sections.js +89 -0
- package/dist/lib/sections.js.map +1 -0
- package/dist/lib/skill-serve.js +129 -0
- package/dist/lib/skill-serve.js.map +1 -0
- package/dist/lib/skills-cache.js +99 -0
- package/dist/lib/skills-cache.js.map +1 -0
- package/dist/lib/skills.js +236 -0
- package/dist/lib/skills.js.map +1 -0
- package/dist/lib/targets.js +151 -0
- package/dist/lib/targets.js.map +1 -0
- package/dist/lib/task-history.js +15 -0
- package/dist/lib/task-history.js.map +1 -0
- package/dist/lib/telemetry.js +51 -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/validate-plan-delegate.js +107 -0
- package/dist/lib/validate-plan-delegate.js.map +1 -0
- package/dist/lib/version-check.js +89 -0
- package/dist/lib/version-check.js.map +1 -0
- package/dist/matrix-logo.js +122 -0
- package/dist/matrix-logo.js.map +1 -0
- package/dist/mcp-server.js +189 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/session-factory.js +19 -0
- package/dist/session-factory.js.map +1 -0
- package/dist/spinner.js +12 -0
- package/dist/spinner.js.map +1 -0
- package/dist/tools/comment-task.js +72 -0
- package/dist/tools/comment-task.js.map +1 -0
- package/dist/tools/create-task.js +129 -0
- package/dist/tools/create-task.js.map +1 -0
- package/dist/tools/delegate-exec.js +63 -0
- package/dist/tools/delegate-exec.js.map +1 -0
- package/dist/tools/end-allocation.js +38 -0
- package/dist/tools/end-allocation.js.map +1 -0
- package/dist/tools/end-task-allocation.js +37 -0
- package/dist/tools/end-task-allocation.js.map +1 -0
- package/dist/tools/exec-status.js +43 -0
- package/dist/tools/exec-status.js.map +1 -0
- package/dist/tools/get-active-allocation.js +69 -0
- package/dist/tools/get-active-allocation.js.map +1 -0
- package/dist/tools/get-context.js +48 -0
- package/dist/tools/get-context.js.map +1 -0
- package/dist/tools/get-task.js +137 -0
- package/dist/tools/get-task.js.map +1 -0
- package/dist/tools/index.js +44 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-my-allocations.js +71 -0
- package/dist/tools/list-my-allocations.js.map +1 -0
- package/dist/tools/list-projects.js +38 -0
- package/dist/tools/list-projects.js.map +1 -0
- package/dist/tools/list-tasks.js +93 -0
- package/dist/tools/list-tasks.js.map +1 -0
- package/dist/tools/move-task.js +82 -0
- package/dist/tools/move-task.js.map +1 -0
- package/dist/tools/plan.js +56 -0
- package/dist/tools/plan.js.map +1 -0
- package/dist/tools/record-delivery.js +71 -0
- package/dist/tools/record-delivery.js.map +1 -0
- package/dist/tools/set-project.js +52 -0
- package/dist/tools/set-project.js.map +1 -0
- package/dist/tools/start-allocation.js +32 -0
- package/dist/tools/start-allocation.js.map +1 -0
- package/dist/tools/start-task-allocation.js +75 -0
- package/dist/tools/start-task-allocation.js.map +1 -0
- package/dist/tools/update-task.js +139 -0
- package/dist/tools/update-task.js.map +1 -0
- package/dist/tools/validate-plan.js +58 -0
- package/dist/tools/validate-plan.js.map +1 -0
- package/dist/version.js +16 -0
- package/dist/version.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { brand } from "../../brand.js";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { runExec, getJob } from "../../lib/exec-delegate.js";
|
|
4
|
+
import { ENGINES, DEFAULT_ENGINE, parseEngine, } from "../../lib/exec-engines.js";
|
|
5
|
+
/**
|
|
6
|
+
* Superfície de CLI da delegação headless — o que o nio Studio (Tauri) chama.
|
|
7
|
+
* Contrato: **stdout = JSON** (parseável), **stderr = log ao vivo** (streamável).
|
|
8
|
+
*/
|
|
9
|
+
function emit(payload) {
|
|
10
|
+
process.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
|
|
11
|
+
}
|
|
12
|
+
export function registerExecCommand(program) {
|
|
13
|
+
program
|
|
14
|
+
.command("exec")
|
|
15
|
+
.description("Delega a implementação a um agente headless num worktree e aguarda. " +
|
|
16
|
+
"stdout = JSON do resultado; stderr = log ao vivo.")
|
|
17
|
+
.requiredOption("--worktree <path>", "worktree onde implementar (criado pelo /implement)")
|
|
18
|
+
.requiredOption("--instruction <texto>", "o que implementar (ticket + critérios)")
|
|
19
|
+
.option("--engine <engine>", `agente de execução (${ENGINES.join(" | ")})`, DEFAULT_ENGINE)
|
|
20
|
+
.option("--quiet", "não streama o log do agente no stderr")
|
|
21
|
+
.action(async (opts) => {
|
|
22
|
+
const engine = parseEngine(opts.engine);
|
|
23
|
+
if (!engine) {
|
|
24
|
+
emit({
|
|
25
|
+
error: `engine inválido: ${opts.engine} — suportados: ${ENGINES.join(", ")}`,
|
|
26
|
+
});
|
|
27
|
+
process.exitCode = 1;
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (!existsSync(opts.worktree)) {
|
|
31
|
+
emit({ error: `worktree não encontrado: ${opts.worktree}` });
|
|
32
|
+
process.exitCode = 1;
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const job = await runExec({
|
|
36
|
+
worktree: opts.worktree,
|
|
37
|
+
instruction: opts.instruction,
|
|
38
|
+
engine,
|
|
39
|
+
echo: opts.quiet !== true,
|
|
40
|
+
});
|
|
41
|
+
emit(job);
|
|
42
|
+
if (job.state !== "done")
|
|
43
|
+
process.exitCode = 1;
|
|
44
|
+
});
|
|
45
|
+
// Comando separado (não subcomando): opções `required` do pai bloqueariam o parse.
|
|
46
|
+
program
|
|
47
|
+
.command("exec-status <jobId>")
|
|
48
|
+
.description(`Estado de um job de execução (\`${brand.name} exec\`), em JSON`)
|
|
49
|
+
.action((jobId) => {
|
|
50
|
+
const job = getJob(jobId);
|
|
51
|
+
if (!job) {
|
|
52
|
+
emit({ error: `job não encontrado: ${jobId}` });
|
|
53
|
+
process.exitCode = 1;
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
emit(job);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../../src/cli/commands/exec.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EACL,OAAO,EACP,cAAc,EACd,WAAW,GACZ,MAAM,2BAA2B,CAAC;AAEnC;;;GAGG;AAEH,SAAS,IAAI,CAAC,OAAgB;IAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CACV,sEAAsE;QACpE,mDAAmD,CACtD;SACA,cAAc,CACb,mBAAmB,EACnB,oDAAoD,CACrD;SACA,cAAc,CACb,uBAAuB,EACvB,wCAAwC,CACzC;SACA,MAAM,CACL,mBAAmB,EACnB,uBAAuB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAC7C,cAAc,CACf;SACA,MAAM,CAAC,SAAS,EAAE,uCAAuC,CAAC;SAC1D,MAAM,CACL,KAAK,EAAE,IAKN,EAAE,EAAE;QACH,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,KAAK,EAAE,oBAAoB,IAAI,CAAC,MAAM,kBAAkB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aAC7E,CAAC,CAAC;YACH,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,EAAE,KAAK,EAAE,4BAA4B,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC7D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC;YACxB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,MAAM;YACN,IAAI,EAAE,IAAI,CAAC,KAAK,KAAK,IAAI;SAC1B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,GAAG,CAAC,KAAK,KAAK,MAAM;YAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACjD,CAAC,CACF,CAAC;IAEJ,mFAAmF;IACnF,OAAO;SACJ,OAAO,CAAC,qBAAqB,CAAC;SAC9B,WAAW,CAAC,mCAAmC,KAAK,CAAC,IAAI,mBAAmB,CAAC;SAC7E,MAAM,CAAC,CAAC,KAAa,EAAE,EAAE;QACxB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,IAAI,CAAC,EAAE,KAAK,EAAE,uBAAuB,KAAK,EAAE,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,CAAC;IACZ,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
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 "../../../adapters/supabase/client.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
|
+
if (brand.webUrl)
|
|
17
|
+
console.log(`Gere um token pessoal em: ${brand.webUrl}/profile#mcp`);
|
|
18
|
+
const newPat = (await password({
|
|
19
|
+
message: initCopy.patPrompt,
|
|
20
|
+
mask: "*",
|
|
21
|
+
validate: (value) => validatePatFormat(value.trim()) || initCopy.patInvalid,
|
|
22
|
+
})).trim();
|
|
23
|
+
const loginSpinner = startSpinner("Validando token...");
|
|
24
|
+
try {
|
|
25
|
+
const result = await exchangePatForJwt(newPat);
|
|
26
|
+
await saveCredentials({ pat: newPat });
|
|
27
|
+
loginSpinner.stop();
|
|
28
|
+
const displayName = result.user.full_name || result.user.email;
|
|
29
|
+
console.log(`[ok] Autenticado como ${displayName}`);
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
loginSpinner.fail(`Falha ao autenticar: ${err.message}`);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/** Cria a sessão autenticada (client Supabase + user) usada pelo resto do wizard. */
|
|
37
|
+
export async function createSessionStep() {
|
|
38
|
+
const authSpinner = startSpinner("Carregando sessão...");
|
|
39
|
+
try {
|
|
40
|
+
const session = await createAuthenticatedClient();
|
|
41
|
+
authSpinner.stop();
|
|
42
|
+
return session;
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
authSpinner.fail(err.message);
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# 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,sCAAsC,CAAC;AAC5G,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,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,6BAA6B,KAAK,CAAC,MAAM,cAAc,CAAC,CAAC;IACvF,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 { section } 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
|
+
section("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
|
+
section("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,71 @@
|
|
|
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, writeUserConfig, fixGitignoreForSplit, USER_CONFIG_FILE, } from "../../../config.js";
|
|
6
|
+
import { brand } from "../../../brand.js";
|
|
7
|
+
import { fetchProjectContext, buildProjectOverview, ProjectContextError, } from "../../../lib/project-context.js";
|
|
8
|
+
import { concatenateRules } from "../../../lib/rules.js";
|
|
9
|
+
import { writeRepoHarness } from "../../../lib/harness.js";
|
|
10
|
+
import { printContextSummary, printHarnessResult } from "../../ui/render.js";
|
|
11
|
+
import { initCopy } from "../../copy.js";
|
|
12
|
+
/** Se já existe nio.json, confirma a sobrescrita. `true` = segue com o wizard. */
|
|
13
|
+
export async function confirmOverwriteIfExists(configPath) {
|
|
14
|
+
if (!existsSync(configPath))
|
|
15
|
+
return true;
|
|
16
|
+
const overwrite = await confirm({ message: initCopy.overwrite, default: false });
|
|
17
|
+
if (!overwrite)
|
|
18
|
+
console.log("Operação cancelada.");
|
|
19
|
+
return overwrite;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Grava a config: `nio.json` (repo, versionado — binding + seleção) + `nio.user.json`
|
|
23
|
+
* (usuário, gitignored — ide). Ajusta o `.gitignore` (ignora só o user file). Best-effort.
|
|
24
|
+
*/
|
|
25
|
+
export function persistConfigStep(config, projectName) {
|
|
26
|
+
writeProjectConfig(config);
|
|
27
|
+
writeUserConfig({ ide: config.ide });
|
|
28
|
+
console.log(`[ok] Criado ${brand.projectConfigFile} (do repo) apontando para ${projectName}.`);
|
|
29
|
+
console.log(`${c.dim(` + ${USER_CONFIG_FILE} (suas prefs, gitignored)`)}`);
|
|
30
|
+
try {
|
|
31
|
+
fixGitignoreForSplit();
|
|
32
|
+
console.log(`${c.dim(` + ${USER_CONFIG_FILE} adicionado ao .gitignore`)}`);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
/* .gitignore best-effort — não bloqueia o init */
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Carrega o contexto do projeto (specs/ADRs/membros) e monta o overview pro
|
|
40
|
+
* AGENTS.md. Falha aqui é degradada: o nio.json já foi salvo, então só avisa
|
|
41
|
+
* e devolve overview vazio.
|
|
42
|
+
*/
|
|
43
|
+
export async function loadContextStep(supabase, config, user) {
|
|
44
|
+
const contextSpinner = startSpinner("Carregando contexto do projeto...");
|
|
45
|
+
try {
|
|
46
|
+
const context = await fetchProjectContext(supabase, config, user);
|
|
47
|
+
contextSpinner.stop();
|
|
48
|
+
printContextSummary(context);
|
|
49
|
+
return buildProjectOverview(context);
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
const message = err instanceof ProjectContextError ? err.message : err.message;
|
|
53
|
+
contextSpinner.fail(`Não foi possível carregar o contexto: ${message}`);
|
|
54
|
+
console.error(`O ${brand.projectConfigFile} foi salvo. Rode \`${brand.name} init\` de novo se precisar revincular.`);
|
|
55
|
+
return "";
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** Harness no repo: rules concatenadas + AGENTS.md (overview do NOS) + CLAUDE.md. */
|
|
59
|
+
export function writeHarnessStep(config, overview) {
|
|
60
|
+
try {
|
|
61
|
+
const h = writeRepoHarness(process.cwd(), {
|
|
62
|
+
rulesMarkdown: concatenateRules(config.selection ?? { roles: [], stacks: {} }),
|
|
63
|
+
overview,
|
|
64
|
+
});
|
|
65
|
+
printHarnessResult(h);
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
console.error(`[aviso] Não consegui escrever o harness: ${err.message}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# 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,76 @@
|
|
|
1
|
+
import { brand } from "../../../brand.js";
|
|
2
|
+
import { getProjectConfigPath } from "../../../config.js";
|
|
3
|
+
import { readDependencies, skillIdMap } from "../../../lib/skills.js";
|
|
4
|
+
import { collectRuleSkills } from "../../../lib/rules.js";
|
|
5
|
+
import { offerDependencyInstall, offerRuleSkills } from "../../flows/dependencies.js";
|
|
6
|
+
import { offerShellCompletion } from "../../flows/completion.js";
|
|
7
|
+
import { ensureCoreClients, offerDisableCoAuthoredBy } from "../../flows/clients.js";
|
|
8
|
+
import { section } from "../../../lib/colors.js";
|
|
9
|
+
import { SyncReport, renderReport, browseReport, resolveReportMode } from "../../ui/report.js";
|
|
10
|
+
import { flushTelemetry } from "../../../lib/telemetry.js";
|
|
11
|
+
import { ensureAuthenticated, createSessionStep } from "./auth-step.js";
|
|
12
|
+
import { fetchMemberProjectsStep, pickProject, pickRepository, buildBaseConfig, pickIde, } from "./project-step.js";
|
|
13
|
+
import { confirmOverwriteIfExists, persistConfigStep, loadContextStep, writeHarnessStep } from "./context-step.js";
|
|
14
|
+
import { promptClientChoices, installClients, activateCoworkIfChosen, resolveChosenClientIds, ensureChosenClientsInstalled, } from "./clients-step.js";
|
|
15
|
+
import { resolveProvisionTargets, fetchSkillsStep, provisionTargetsStep, provisionHooksStep, } from "./provision-step.js";
|
|
16
|
+
import { promptSelection } from "../../flows/sections.js";
|
|
17
|
+
/** Autenticação, projeto/repositório, seleção, IDE, config no disco + contexto/harness. */
|
|
18
|
+
async function resolveProjectSetup() {
|
|
19
|
+
await ensureAuthenticated();
|
|
20
|
+
const session = await createSessionStep();
|
|
21
|
+
const { supabase } = session;
|
|
22
|
+
const projects = await fetchMemberProjectsStep(supabase, session.user.id);
|
|
23
|
+
const selectedProject = await pickProject(projects);
|
|
24
|
+
const repositoryId = await pickRepository(supabase, selectedProject.id);
|
|
25
|
+
const config = buildBaseConfig(selectedProject.id, repositoryId);
|
|
26
|
+
config.selection = await promptSelection();
|
|
27
|
+
config.ide = await pickIde();
|
|
28
|
+
persistConfigStep(config, selectedProject.name);
|
|
29
|
+
const overview = await loadContextStep(supabase, config, session.user);
|
|
30
|
+
writeHarnessStep(config, overview);
|
|
31
|
+
return { config, session };
|
|
32
|
+
}
|
|
33
|
+
/** Escolha e instalação dos clientes de IA + provisionamento de skills/commands/hooks. */
|
|
34
|
+
async function installAndProvisionClients(config, session) {
|
|
35
|
+
const clientConfigs = await promptClientChoices();
|
|
36
|
+
installClients(clientConfigs, process.cwd());
|
|
37
|
+
await activateCoworkIfChosen(clientConfigs);
|
|
38
|
+
const chosenClientIds = resolveChosenClientIds(clientConfigs);
|
|
39
|
+
await ensureChosenClientsInstalled(chosenClientIds);
|
|
40
|
+
if (chosenClientIds.has("claude-code"))
|
|
41
|
+
await offerDisableCoAuthoredBy();
|
|
42
|
+
const provisionTargets = resolveProvisionTargets(clientConfigs);
|
|
43
|
+
section("Skills & commands", "provisionando pros clientes");
|
|
44
|
+
const report = new SyncReport();
|
|
45
|
+
await fetchSkillsStep(report);
|
|
46
|
+
provisionTargetsStep(provisionTargets, config, session, skillIdMap(), report);
|
|
47
|
+
provisionHooksStep(provisionTargets, config, report);
|
|
48
|
+
const mode = resolveReportMode({});
|
|
49
|
+
renderReport(report, mode);
|
|
50
|
+
if (mode === "summary")
|
|
51
|
+
await browseReport(report);
|
|
52
|
+
}
|
|
53
|
+
/** Ofertas finais: libs externas da seleção, skills recomendadas, autocomplete do shell. */
|
|
54
|
+
async function offerFollowUps(config) {
|
|
55
|
+
await offerDependencyInstall(readDependencies(config.selection), { interactive: true });
|
|
56
|
+
await offerRuleSkills(collectRuleSkills(config.selection ?? { roles: [], stacks: {} }), { interactive: true });
|
|
57
|
+
await offerShellCompletion({ interactive: true, announceConfigured: true });
|
|
58
|
+
await flushTelemetry();
|
|
59
|
+
}
|
|
60
|
+
async function runInitWizard() {
|
|
61
|
+
const configPath = getProjectConfigPath();
|
|
62
|
+
if (!(await confirmOverwriteIfExists(configPath)))
|
|
63
|
+
return;
|
|
64
|
+
// Logo no início: confere Codex + Claude Code e oferece instalar os que faltam.
|
|
65
|
+
await ensureCoreClients({ interactive: true });
|
|
66
|
+
const { config, session } = await resolveProjectSetup();
|
|
67
|
+
await installAndProvisionClients(config, session);
|
|
68
|
+
await offerFollowUps(config);
|
|
69
|
+
}
|
|
70
|
+
export function registerInitCommand(program) {
|
|
71
|
+
program
|
|
72
|
+
.command("init")
|
|
73
|
+
.description(`Cria ${brand.projectConfigFile} no diretório atual vinculando a um projeto do ${brand.productName}`)
|
|
74
|
+
.action(runInitWizard);
|
|
75
|
+
}
|
|
76
|
+
//# 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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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { select, input } from "../../../lib/prompts.js";
|
|
2
|
+
import { section } from "../../../lib/colors.js";
|
|
3
|
+
import { startSpinner } from "../../../spinner.js";
|
|
4
|
+
import { UUID_REGEX } from "../../../config.js";
|
|
5
|
+
import { listMemberProjects } from "../../../lib/project-context.js";
|
|
6
|
+
import { initCopy } from "../../copy.js";
|
|
7
|
+
const MANUAL_PROJECT = "__manual__";
|
|
8
|
+
const NO_REPO = "__none__";
|
|
9
|
+
/** Busca os projetos dos quais o usuário é membro; sai do processo se a busca
|
|
10
|
+
* falhar ou se a lista vier vazia (nada pra vincular). */
|
|
11
|
+
export async function fetchMemberProjectsStep(supabase, userId) {
|
|
12
|
+
const projectsSpinner = startSpinner("Buscando seus projetos...");
|
|
13
|
+
let projects;
|
|
14
|
+
try {
|
|
15
|
+
projects = await listMemberProjects(supabase, userId);
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
projectsSpinner.fail(`Erro ao buscar projetos: ${err.message}`);
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
projectsSpinner.stop();
|
|
22
|
+
if (projects.length === 0) {
|
|
23
|
+
console.error("Você não é membro de nenhum projeto. Peça a um admin pra te adicionar.");
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
return projects;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Dado o id escolhido/digitado e a lista de projetos do usuário, resolve o
|
|
30
|
+
* projeto selecionado. Cai num objeto sintético `{id, name: id}` quando o id
|
|
31
|
+
* não está na lista (ex.: colado manualmente).
|
|
32
|
+
*/
|
|
33
|
+
export function resolveSelectedProject(projectId, projects) {
|
|
34
|
+
return projects.find((p) => p.id === projectId) ?? { id: projectId, name: projectId };
|
|
35
|
+
}
|
|
36
|
+
/** Prompt de escolha do projeto — lista os projetos do usuário + opção de digitar um id manualmente. */
|
|
37
|
+
export async function pickProject(projects) {
|
|
38
|
+
let projectId = await select({
|
|
39
|
+
message: initCopy.pickProject,
|
|
40
|
+
choices: [
|
|
41
|
+
...projects.map((p) => ({ name: p.name, value: p.id })),
|
|
42
|
+
{ name: initCopy.manualProjectChoice, value: MANUAL_PROJECT },
|
|
43
|
+
],
|
|
44
|
+
});
|
|
45
|
+
if (projectId === MANUAL_PROJECT) {
|
|
46
|
+
projectId = await input({
|
|
47
|
+
message: initCopy.manualProjectPrompt,
|
|
48
|
+
validate: (value) => UUID_REGEX.test(value.trim()) || initCopy.manualProjectInvalid,
|
|
49
|
+
});
|
|
50
|
+
projectId = projectId.trim();
|
|
51
|
+
}
|
|
52
|
+
return resolveSelectedProject(projectId, projects);
|
|
53
|
+
}
|
|
54
|
+
/** Traduz a escolha do prompt de repositório pro `repository_id` persistido. */
|
|
55
|
+
export function resolveRepositoryChoice(choice) {
|
|
56
|
+
return choice === NO_REPO ? null : choice;
|
|
57
|
+
}
|
|
58
|
+
/** Busca os repositórios do projeto e, se houver algum, oferece vincular um (ou nenhum). */
|
|
59
|
+
export async function pickRepository(supabase, projectId) {
|
|
60
|
+
const reposSpinner = startSpinner("Buscando repositórios...");
|
|
61
|
+
const reposResult = await supabase
|
|
62
|
+
.from("repositories")
|
|
63
|
+
.select("id, name")
|
|
64
|
+
.eq("project_id", projectId)
|
|
65
|
+
.order("name");
|
|
66
|
+
if (reposResult.error) {
|
|
67
|
+
reposSpinner.fail(`Erro ao buscar repositórios: ${reposResult.error.message}`);
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
reposSpinner.stop();
|
|
71
|
+
const repos = reposResult.data ?? [];
|
|
72
|
+
if (repos.length === 0)
|
|
73
|
+
return null;
|
|
74
|
+
const choice = await select({
|
|
75
|
+
message: initCopy.linkRepo,
|
|
76
|
+
choices: [
|
|
77
|
+
{ name: initCopy.noRepoChoice, value: NO_REPO },
|
|
78
|
+
...repos.map((r) => ({ name: r.name, value: r.id })),
|
|
79
|
+
],
|
|
80
|
+
});
|
|
81
|
+
return resolveRepositoryChoice(choice);
|
|
82
|
+
}
|
|
83
|
+
/** Monta o `ProjectConfig` base a partir do projeto e (opcional) repositório escolhidos. */
|
|
84
|
+
export function buildBaseConfig(projectId, repositoryId) {
|
|
85
|
+
const config = { project_id: projectId };
|
|
86
|
+
if (repositoryId)
|
|
87
|
+
config.repository_id = repositoryId;
|
|
88
|
+
return config;
|
|
89
|
+
}
|
|
90
|
+
/** Prompt de IDE — habilita integrações específicas de editor no resto do CLI. */
|
|
91
|
+
export async function pickIde() {
|
|
92
|
+
console.log("");
|
|
93
|
+
section("IDE", "habilita integrações de editor");
|
|
94
|
+
return select({
|
|
95
|
+
message: "Qual IDE você usa? Isso habilita integrações — ex.: o /implement " +
|
|
96
|
+
"registra o worktree criado no editor (VS Code: adiciona ao Source Control; " +
|
|
97
|
+
"Xcode: abre o projeto em janela própria). Mais integrações no futuro.",
|
|
98
|
+
choices: [
|
|
99
|
+
{ name: "VS Code", value: "vscode" },
|
|
100
|
+
{ name: "Xcode", value: "xcode" },
|
|
101
|
+
{ name: "Outra", value: "other" },
|
|
102
|
+
],
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=project-step.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-step.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/project-step.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { claudeTarget, codexTarget } from "../../../lib/targets.js";
|
|
2
|
+
import { provision } from "../../../lib/provision.js";
|
|
3
|
+
import { provisionHooks } from "../../../lib/hooks.js";
|
|
4
|
+
import { fetchSkills } from "../../../lib/skills-cache.js";
|
|
5
|
+
import { c } from "../../../lib/colors.js";
|
|
6
|
+
import { startSpinner } from "../../../spinner.js";
|
|
7
|
+
import { printProvisionResult, printHookResult } from "../../ui/render.js";
|
|
8
|
+
import { summarizeProvision } from "../../ui/report.js";
|
|
9
|
+
import { track, provisionedItems } from "../../../lib/telemetry.js";
|
|
10
|
+
import { VERSION } from "../../../version.js";
|
|
11
|
+
/**
|
|
12
|
+
* claude-code-* → ~/.claude (nativo); codex-global → ~/.codex (traduzido pra
|
|
13
|
+
* skills). Sem nenhuma escolha desses dois, cai no default (~/.claude).
|
|
14
|
+
*/
|
|
15
|
+
export function resolveProvisionTargets(clientConfigs) {
|
|
16
|
+
const targets = new Set();
|
|
17
|
+
for (const choice of clientConfigs) {
|
|
18
|
+
if (choice.startsWith("claude-code"))
|
|
19
|
+
targets.add(claudeTarget);
|
|
20
|
+
if (choice === "codex-global")
|
|
21
|
+
targets.add(codexTarget);
|
|
22
|
+
}
|
|
23
|
+
if (targets.size === 0)
|
|
24
|
+
targets.add(claudeTarget);
|
|
25
|
+
return targets;
|
|
26
|
+
}
|
|
27
|
+
/** Baixa o repo aberto de skills pro cache e registra a seção no report. */
|
|
28
|
+
export async function fetchSkillsStep(report) {
|
|
29
|
+
const fetchSpinner = startSpinner("Baixando skills do repo…");
|
|
30
|
+
const fetched = await fetchSkills({ force: true });
|
|
31
|
+
fetchSpinner.stop();
|
|
32
|
+
if (fetched.status === "failed") {
|
|
33
|
+
report.add({
|
|
34
|
+
id: "fetch",
|
|
35
|
+
title: "Skills",
|
|
36
|
+
status: "error",
|
|
37
|
+
summary: "falha ao baixar",
|
|
38
|
+
lines: [` ${c.dim(fetched.error ?? "")}`],
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
else if (fetched.status === "fetched") {
|
|
42
|
+
report.add({
|
|
43
|
+
id: "fetch",
|
|
44
|
+
title: "Skills",
|
|
45
|
+
status: "ok",
|
|
46
|
+
summary: `baixadas (${fetched.repo}@${fetched.ref})`,
|
|
47
|
+
lines: [],
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
report.add({
|
|
52
|
+
id: "fetch",
|
|
53
|
+
title: "Skills",
|
|
54
|
+
status: "warn",
|
|
55
|
+
summary: "usando cache local",
|
|
56
|
+
lines: fetched.error ? [` ${c.dim(fetched.error)}`] : [],
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export function provisionTargetsStep(targets, config, session, uidByName, report) {
|
|
61
|
+
for (const target of targets) {
|
|
62
|
+
try {
|
|
63
|
+
const result = provision({ target, selection: config.selection });
|
|
64
|
+
const { status, summary } = summarizeProvision(result.files);
|
|
65
|
+
report.addCaptured({ id: `prov-${target.id}`, title: target.label, status, summary }, () => printProvisionResult(result));
|
|
66
|
+
track(session.supabase, {
|
|
67
|
+
type: "provision",
|
|
68
|
+
client: target.id,
|
|
69
|
+
sections: config.selection,
|
|
70
|
+
items: provisionedItems(result.files, uidByName),
|
|
71
|
+
version: VERSION,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
report.add({
|
|
76
|
+
id: `prov-${target.id}`,
|
|
77
|
+
title: target.label,
|
|
78
|
+
status: "error",
|
|
79
|
+
summary: "falhou",
|
|
80
|
+
lines: [` ${c.dim(err.message)}`],
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/** Hooks (só Claude Code): registra os gatilhos no ~/.claude/settings.json. */
|
|
86
|
+
export function provisionHooksStep(targets, config, report) {
|
|
87
|
+
if (!targets.has(claudeTarget))
|
|
88
|
+
return;
|
|
89
|
+
try {
|
|
90
|
+
const h = provisionHooks({ surface: claudeTarget.surface, selection: config.selection });
|
|
91
|
+
report.addCaptured({ id: "hooks", title: "Hooks", status: "ok", summary: `${h.installed.length} hooks` }, () => printHookResult(h));
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
report.add({
|
|
95
|
+
id: "hooks",
|
|
96
|
+
title: "Hooks",
|
|
97
|
+
status: "warn",
|
|
98
|
+
summary: "pulado",
|
|
99
|
+
lines: [` ${c.dim(err.message)}`],
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=provision-step.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provision-step.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/provision-step.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { runPlan } from "../../lib/plan-delegate.js";
|
|
3
|
+
import { ENGINES, PLAN_ENGINE, parseEngine } from "../../lib/exec-engines.js";
|
|
4
|
+
/**
|
|
5
|
+
* Superfície de CLI do planejamento headless — mesmo contrato do `exec`:
|
|
6
|
+
* **stdout = JSON**, **stderr = log ao vivo**, **exit ≠ 0 = falha**.
|
|
7
|
+
*/
|
|
8
|
+
function emit(payload) {
|
|
9
|
+
process.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
|
|
10
|
+
}
|
|
11
|
+
export function registerPlanCommand(program) {
|
|
12
|
+
program
|
|
13
|
+
.command("plan")
|
|
14
|
+
.description("Roda o engine pensante sobre o projeto e escreve/refina o plan.md da raiz. " +
|
|
15
|
+
"Não toca código. stdout = JSON do resultado; stderr = log ao vivo.")
|
|
16
|
+
.requiredOption("--instruction <texto>", "a ideia ou o ajuste a planejar")
|
|
17
|
+
.option("--project <path>", "raiz do projeto onde vive o plan.md", process.cwd())
|
|
18
|
+
.option("--engine <engine>", `agente pensante (${ENGINES.join(" | ")})`, PLAN_ENGINE)
|
|
19
|
+
.option("--quiet", "não streama o log do agente no stderr")
|
|
20
|
+
.action(async (opts) => {
|
|
21
|
+
const engine = parseEngine(opts.engine, PLAN_ENGINE);
|
|
22
|
+
if (!engine) {
|
|
23
|
+
emit({
|
|
24
|
+
error: `engine inválido: ${opts.engine} — suportados: ${ENGINES.join(", ")}`,
|
|
25
|
+
});
|
|
26
|
+
process.exitCode = 1;
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (!existsSync(opts.project)) {
|
|
30
|
+
emit({ error: `projeto não encontrado: ${opts.project}` });
|
|
31
|
+
process.exitCode = 1;
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const result = await runPlan({
|
|
35
|
+
project: opts.project,
|
|
36
|
+
instruction: opts.instruction,
|
|
37
|
+
engine,
|
|
38
|
+
echo: opts.quiet !== true,
|
|
39
|
+
});
|
|
40
|
+
emit(result);
|
|
41
|
+
if (!result.ok)
|
|
42
|
+
process.exitCode = 1;
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=plan.js.map
|