@zaip-ai/cli 1.3.6 → 1.3.8
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 +31 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +22 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/services/sqlite-bootstrap.d.ts +29 -0
- package/dist/services/sqlite-bootstrap.d.ts.map +1 -0
- package/dist/services/sqlite-bootstrap.js +141 -0
- package/dist/services/sqlite-bootstrap.js.map +1 -0
- package/dist/services/stack-install.d.ts +14 -0
- package/dist/services/stack-install.d.ts.map +1 -0
- package/dist/services/stack-install.js +176 -0
- package/dist/services/stack-install.js.map +1 -0
- package/dist/services/stack-node.d.ts +12 -0
- package/dist/services/stack-node.d.ts.map +1 -0
- package/dist/services/stack-node.js +150 -0
- package/dist/services/stack-node.js.map +1 -0
- package/dist/services/stack-package-manager.d.ts +12 -0
- package/dist/services/stack-package-manager.d.ts.map +1 -0
- package/dist/services/stack-package-manager.js +178 -0
- package/dist/services/stack-package-manager.js.map +1 -0
- package/dist/services/stack-plan.d.ts +33 -0
- package/dist/services/stack-plan.d.ts.map +1 -0
- package/dist/services/stack-plan.js +116 -0
- package/dist/services/stack-plan.js.map +1 -0
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/templates/.agents/dashboard/.zaip-managed.json +35 -27
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{DashboardHelpDialog-3Lrfq645.js → DashboardHelpDialog-VcLx9iOO.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-BwnJpl02.js +3 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{ProjectSettingsPage-BomxqCBU.css → ProjectSettingsPage-GgzpZ_PY.css} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{TraceabilityWorkspace-diq9g1L8.js → TraceabilityWorkspace-DFZwIXSC.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{index-Deo_W81f.js → index-Dyo_wpL4.js} +2 -2
- package/templates/.agents/dashboard/apps/frontend/dist/index.html +1 -1
- package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +15 -2
- package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +22 -6
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +2 -0
- package/templates/.agents/dashboard/apps/frontend/src/project-settings-model.ts +1 -1
- package/templates/.agents/dashboard/apps/frontend/src/project-settings-page.css +0 -104
- package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +26 -0
- package/templates/.agents/dashboard/apps/frontend/src/project-stack-versions.css +117 -0
- package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +119 -119
- package/templates/.agents/dashboard/packages/local-runtime/server.mjs +119 -119
- package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +153 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +161 -40
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-prerequisites.mjs +5 -5
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-prerequisites.test.mjs +8 -0
- package/templates/.agents/dashboard/stack-dependencies.json +14 -0
- package/templates/.agents/requirements/autonomous-assurance.md +1 -1
- package/templates/.agents/requirements/comparative-audit.md +1 -1
- package/templates/.agents/requirements/context-engine.md +1 -1
- package/templates/.agents/requirements/cost-observability.md +1 -1
- package/templates/.agents/requirements/dashboard-launch.md +1 -1
- package/templates/.agents/requirements/data-export.md +1 -1
- package/templates/.agents/requirements/design-system.md +1 -1
- package/templates/.agents/requirements/execution-engine.md +1 -1
- package/templates/.agents/requirements/kanban-dashboard.md +1 -1
- package/templates/.agents/requirements/model-orchestration.md +1 -1
- package/templates/.agents/requirements/public-distribution.md +1 -1
- package/templates/.agents/requirements/software-architecture.md +1 -1
- package/templates/.agents/requirements/strategic-improvements.md +1 -1
- package/templates/.agents/requirements/work-lifecycle.md +1 -1
- package/templates/.agents/requirements/zaip-strategic-95.md +1 -1
- package/templates/README.md +1 -1
- package/templates/template-manifest.json +53 -45
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-B_Oj6Dlf.js +0 -3
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { chmod, copyFile, link, lstat, mkdir, readFile, rename, rm, symlink, writeFile, } from "node:fs/promises";
|
|
4
|
+
import { dirname, join, relative } from "node:path";
|
|
5
|
+
import { promisify } from "node:util";
|
|
6
|
+
import { gunzipSync } from "node:zlib";
|
|
7
|
+
import { runPackageManager } from "./stack-package-manager.js";
|
|
8
|
+
import { assertSafeDestination } from "./transactional-files.js";
|
|
9
|
+
const exec = promisify(execFile);
|
|
10
|
+
// Current patched Node 22 LTS, qualified with this release. The system Node remains untouched.
|
|
11
|
+
export const STACK_NODE_VERSION = "22.23.2";
|
|
12
|
+
export const STACK_MINIMUM_NODE = "22.19.0";
|
|
13
|
+
// Pinned from nodejs.org/dist/v22.23.2/SHASUMS256.txt while qualifying this release.
|
|
14
|
+
const NODE_SHA256 = {
|
|
15
|
+
"darwin-arm64": "61130f394c1630d211dd50aecc4353d379480f36d3ac913cd85dbba1aed585c6",
|
|
16
|
+
"darwin-x64": "58e99022c2ff89395576cc7fd4d98cea24bb68081475d5f88b801ee8729fb026",
|
|
17
|
+
"linux-arm64": "013b59cfd2819703a6f4a14ab891fc46fc2a4e3f5bcd92de3fb4929b43e35b30",
|
|
18
|
+
"linux-x64": "b294a556e639d64338823920e5866c21c02741742d2e1529ee1a225c1ec9252a",
|
|
19
|
+
"win32-arm64": "97cce5301a815d2dce07ac5bfd1e6039eae88185ec1d10ae4f8cb712f1732878",
|
|
20
|
+
"win32-x64": "0d0f5e39f9f3d9587bc19f73eab3c2c9c4903fd02d6dbf9c853dd81b3d95fad4",
|
|
21
|
+
};
|
|
22
|
+
export function supportsStackNode(version) {
|
|
23
|
+
const [major = 0, minor = 0] = version.replace(/^v/, "").split(".").map(Number);
|
|
24
|
+
return major > 22 || (major === 22 && minor >= 19);
|
|
25
|
+
}
|
|
26
|
+
/** Downloads a project-private official Node only when the invoking runtime is too old. */
|
|
27
|
+
export async function prepareStackNode(root, log, currentVersion = process.versions.node) {
|
|
28
|
+
if (supportsStackNode(currentVersion))
|
|
29
|
+
return process.execPath;
|
|
30
|
+
const version = STACK_NODE_VERSION;
|
|
31
|
+
const platform = process.platform;
|
|
32
|
+
const arch = process.arch;
|
|
33
|
+
if (!["win32", "linux", "darwin"].includes(platform) || !["x64", "arm64"].includes(arch))
|
|
34
|
+
throw new Error(`Node ${process.versions.node} incompatível com a stack. Instalação local automática indisponível para ${platform}/${arch}; mínimo ${STACK_MINIMUM_NODE}.`);
|
|
35
|
+
const directory = join(root, ".local/zaip-node", `v${version}-${platform}-${arch}`);
|
|
36
|
+
const archiveRoot = `node-v${version}-${platform}-${arch}`;
|
|
37
|
+
const file = platform === "win32" ? `win-${arch}/node.exe` : `${archiveRoot}.tar.gz`;
|
|
38
|
+
const binary = platform === "win32" ? join(directory, "node.exe") : join(directory, archiveRoot, "bin/node");
|
|
39
|
+
await assertSafeDestination(root, relative(root, binary).replaceAll("\\", "/"));
|
|
40
|
+
const archive = join(directory, "official.tar.gz");
|
|
41
|
+
const expected = NODE_SHA256[`${platform}-${arch}`];
|
|
42
|
+
await assertSafeDestination(root, relative(root, archive).replaceAll("\\", "/"));
|
|
43
|
+
try {
|
|
44
|
+
const source = await readFile(platform === "win32" ? binary : archive);
|
|
45
|
+
if (digest(source) === expected &&
|
|
46
|
+
(platform === "win32" ||
|
|
47
|
+
digest(await readFile(binary)) ===
|
|
48
|
+
digest(extractNodeArchive(source, `${archiveRoot}/bin/node`)))) {
|
|
49
|
+
log(`Node do sistema preservado ${process.versions.node}; Node local ${version} reutilizado para a stack.\n`);
|
|
50
|
+
return binary;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
if (error.code !== "ENOENT")
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
log(`Node do sistema preservado ${process.versions.node}; preparando Node ${version} somente em .local/zaip-node (mínimo da stack ${STACK_MINIMUM_NODE}).\n`);
|
|
58
|
+
const base = `https://nodejs.org/dist/v${version}/`;
|
|
59
|
+
if (!expected || !/^[a-f0-9]{64}$/.test(expected))
|
|
60
|
+
throw new Error("Checksum oficial do Node não encontrado.");
|
|
61
|
+
const bytes = await download(`${base}${file}`, 150 * 1024 * 1024);
|
|
62
|
+
if (digest(bytes) !== expected)
|
|
63
|
+
throw new Error("Download do Node rejeitado: SHA-256 difere do arquivo oficial.");
|
|
64
|
+
const executable = platform === "win32" ? bytes : extractNodeArchive(bytes, `${archiveRoot}/bin/node`);
|
|
65
|
+
await mkdir(dirname(binary), { recursive: true });
|
|
66
|
+
const temporary = `${binary}.${process.pid}.tmp`;
|
|
67
|
+
await writeFile(temporary, executable, { flag: "wx" });
|
|
68
|
+
await rename(temporary, binary);
|
|
69
|
+
if (platform !== "win32") {
|
|
70
|
+
await chmod(binary, 0o755);
|
|
71
|
+
await writeFile(archive, bytes);
|
|
72
|
+
}
|
|
73
|
+
const observed = (await exec(binary, ["--version"], { timeout: 10_000, windowsHide: true })).stdout.trim();
|
|
74
|
+
if (observed !== `v${version}`)
|
|
75
|
+
throw new Error(`Node local inesperado: ${observed}`);
|
|
76
|
+
return binary;
|
|
77
|
+
}
|
|
78
|
+
/** Extract one regular file from an authenticated tarball, never arbitrary filesystem paths. */
|
|
79
|
+
export function extractNodeArchive(gzip, expectedName) {
|
|
80
|
+
const tar = gunzipSync(gzip, { maxOutputLength: 512 * 1024 * 1024 });
|
|
81
|
+
for (let offset = 0; offset + 512 <= tar.length;) {
|
|
82
|
+
const header = tar.subarray(offset, offset + 512);
|
|
83
|
+
const name = header.subarray(0, 100).toString().replace(/\0.*$/, "");
|
|
84
|
+
if (!name)
|
|
85
|
+
break;
|
|
86
|
+
const size = Number.parseInt(header.subarray(124, 136).toString().replace(/\0.*$/, "").trim(), 8);
|
|
87
|
+
if (!Number.isSafeInteger(size) || size < 0 || offset + 512 + size > tar.length)
|
|
88
|
+
throw new Error("Archive Node inválido");
|
|
89
|
+
if (name === expectedName && (header[156] === 0 || header[156] === 48))
|
|
90
|
+
return tar.subarray(offset + 512, offset + 512 + size);
|
|
91
|
+
offset += 512 + Math.ceil(size / 512) * 512;
|
|
92
|
+
}
|
|
93
|
+
throw new Error("Executável Node ausente do archive oficial");
|
|
94
|
+
}
|
|
95
|
+
export function usingStackNode(binary, run = runPackageManager) {
|
|
96
|
+
return (manager, args, root) => run({
|
|
97
|
+
...manager,
|
|
98
|
+
command: manager.command === process.execPath ? binary : manager.command,
|
|
99
|
+
nodeExecutable: binary,
|
|
100
|
+
}, args, root);
|
|
101
|
+
}
|
|
102
|
+
/** npm scripts and npx commands pick up this local executable via node_modules/.bin. */
|
|
103
|
+
export async function exposeStackNode(root, binary) {
|
|
104
|
+
if (binary === process.execPath)
|
|
105
|
+
return;
|
|
106
|
+
const target = join(root, "node_modules/.bin", process.platform === "win32" ? "node.exe" : "node");
|
|
107
|
+
const existing = await lstat(target).catch((error) => {
|
|
108
|
+
if (error.code === "ENOENT")
|
|
109
|
+
return null;
|
|
110
|
+
throw error;
|
|
111
|
+
});
|
|
112
|
+
if (existing) {
|
|
113
|
+
if (digest(await readFile(target)) === digest(await readFile(binary)))
|
|
114
|
+
return;
|
|
115
|
+
throw new Error("Node local já existente em node_modules/.bin preservado; sua versão conflita com o runtime necessário para a stack.");
|
|
116
|
+
}
|
|
117
|
+
await assertSafeDestination(root, relative(root, target).replaceAll("\\", "/"));
|
|
118
|
+
await mkdir(dirname(target), { recursive: true });
|
|
119
|
+
if (process.platform !== "win32")
|
|
120
|
+
await symlink(relative(dirname(target), binary), target);
|
|
121
|
+
else {
|
|
122
|
+
try {
|
|
123
|
+
await link(binary, target);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
if (error.code === "EXDEV")
|
|
127
|
+
await copyFile(binary, target);
|
|
128
|
+
else
|
|
129
|
+
throw error;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async function download(url, limit) {
|
|
134
|
+
const response = await fetch(url, { signal: AbortSignal.timeout(120_000), redirect: "error" });
|
|
135
|
+
if (!response.ok || !response.body)
|
|
136
|
+
throw new Error(`Download oficial do Node falhou: HTTP ${response.status}`);
|
|
137
|
+
const chunks = [];
|
|
138
|
+
let total = 0;
|
|
139
|
+
for await (const chunk of response.body) {
|
|
140
|
+
total += chunk.length;
|
|
141
|
+
if (total > limit)
|
|
142
|
+
throw new Error("Download do Node excedeu o tamanho esperado.");
|
|
143
|
+
chunks.push(chunk);
|
|
144
|
+
}
|
|
145
|
+
return Buffer.concat(chunks);
|
|
146
|
+
}
|
|
147
|
+
function digest(bytes) {
|
|
148
|
+
return createHash("sha256").update(bytes).digest("hex");
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=stack-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack-node.js","sourceRoot":"","sources":["../../src/services/stack-node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type ProjectPackage } from "./stack-plan.js";
|
|
2
|
+
export interface PackageManager {
|
|
3
|
+
nodeExecutable?: string;
|
|
4
|
+
name: "npm" | "pnpm" | "yarn";
|
|
5
|
+
command: string;
|
|
6
|
+
prefix: string[];
|
|
7
|
+
}
|
|
8
|
+
export type PackageRunner = (manager: PackageManager, args: string[], root: string) => Promise<string>;
|
|
9
|
+
export declare function selectPackageManager(root: string, manifest: ProjectPackage): Promise<PackageManager>;
|
|
10
|
+
export declare const runPackageManager: PackageRunner;
|
|
11
|
+
export declare function installArguments(manager: PackageManager, root: string, run: PackageRunner): Promise<string[]>;
|
|
12
|
+
//# sourceMappingURL=stack-package-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack-package-manager.d.ts","sourceRoot":"","sources":["../../src/services/stack-package-manager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,cAAc,EAAgB,MAAM,iBAAiB,CAAC;AAEpE,MAAM,WAAW,cAAc;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AACD,MAAM,MAAM,aAAa,GAAG,CAC1B,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,MAAM,CAAC,CAAC;AAErB,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,CAAC,CAkEzB;AAiCD,eAAO,MAAM,iBAAiB,EAAE,aAsD5B,CAAC;AAQL,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,aAAa,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CA+BnB"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { access } from "node:fs/promises";
|
|
3
|
+
import { delimiter, dirname, join } from "node:path";
|
|
4
|
+
import { readOptional } from "./stack-plan.js";
|
|
5
|
+
export async function selectPackageManager(root, manifest) {
|
|
6
|
+
const detected = [];
|
|
7
|
+
for (const [name, files] of Object.entries({
|
|
8
|
+
npm: ["package-lock.json", "npm-shrinkwrap.json"],
|
|
9
|
+
pnpm: ["pnpm-lock.yaml", "pnpm-workspace.yaml"],
|
|
10
|
+
yarn: ["yarn.lock", ".yarnrc.yml"],
|
|
11
|
+
bun: ["bun.lock", "bun.lockb"],
|
|
12
|
+
})) {
|
|
13
|
+
for (const file of files)
|
|
14
|
+
if ((await readOptional(join(root, file))) !== null) {
|
|
15
|
+
detected.push(name);
|
|
16
|
+
break;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const declared = manifest.packageManager?.split("@")[0];
|
|
20
|
+
if (detected.length > 1 || (declared && detected.some((name) => name !== declared)))
|
|
21
|
+
throw new Error("Gerenciadores/lockfiles conflitantes: preserve apenas o gerenciador escolhido antes de repetir init.");
|
|
22
|
+
const name = declared ?? detected[0] ?? "npm";
|
|
23
|
+
if (name !== "npm" && name !== "pnpm" && name !== "yarn")
|
|
24
|
+
throw new Error(`Gerenciador ${name} não suportado para instalação automática; nenhum lockfile será convertido.`);
|
|
25
|
+
if ((await readOptional(join(root, ".pnp.cjs"))) !== null ||
|
|
26
|
+
/nodeLinker:\s*pnp/.test((await readOptional(join(root, ".yarnrc.yml"))) ?? ""))
|
|
27
|
+
throw new Error("Yarn PnP exige integração de resolução específica; use nodeLinker: node-modules antes de repetir init.");
|
|
28
|
+
if (name === "npm")
|
|
29
|
+
return resolveNpm();
|
|
30
|
+
// Corepack honors the project's pinned packageManager without changing global tools.
|
|
31
|
+
for (const base of executableDirectories()) {
|
|
32
|
+
const corepack = join(base, "node_modules/corepack/dist/corepack.js");
|
|
33
|
+
if (await exists(corepack))
|
|
34
|
+
return { name, command: process.execPath, prefix: [corepack, name] };
|
|
35
|
+
}
|
|
36
|
+
if (process.platform !== "win32")
|
|
37
|
+
return { name, command: name, prefix: [] };
|
|
38
|
+
for (const base of executableDirectories()) {
|
|
39
|
+
for (const file of [
|
|
40
|
+
`node_modules/${name}/bin/${name}.cjs`,
|
|
41
|
+
`node_modules/${name}/bin/${name}.js`,
|
|
42
|
+
]) {
|
|
43
|
+
if (await exists(join(base, file)))
|
|
44
|
+
return { name, command: process.execPath, prefix: [join(base, file)] };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// npm exec bootstraps the selected manager locally in its cache, without a global install.
|
|
48
|
+
const npm = await resolveNpm();
|
|
49
|
+
const spec = manifest.packageManager ?? `${name}@${name === "pnpm" ? "11.12.0" : "1.22.22"}`;
|
|
50
|
+
if (!/^(pnpm|yarn)@\d+\.\d+\.\d+(?:\+sha\d+\.[a-f0-9]+)?$/.test(spec))
|
|
51
|
+
throw new Error(`Versão inválida do gerenciador: ${spec}`);
|
|
52
|
+
return {
|
|
53
|
+
name,
|
|
54
|
+
command: npm.command,
|
|
55
|
+
prefix: [
|
|
56
|
+
...npm.prefix,
|
|
57
|
+
"exec",
|
|
58
|
+
"--yes",
|
|
59
|
+
"--ignore-scripts",
|
|
60
|
+
`--package=${spec.split("+")[0]}`,
|
|
61
|
+
"--",
|
|
62
|
+
name,
|
|
63
|
+
],
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
async function resolveNpm() {
|
|
67
|
+
const inherited = process.env.npm_execpath;
|
|
68
|
+
if (inherited && /[\\/]npm(?:-cli)?\.js$/.test(inherited) && (await exists(inherited)))
|
|
69
|
+
return { name: "npm", command: process.execPath, prefix: [inherited] };
|
|
70
|
+
for (const base of executableDirectories()) {
|
|
71
|
+
const entry = join(base, "node_modules/npm/bin/npm-cli.js");
|
|
72
|
+
if (await exists(entry))
|
|
73
|
+
return { name: "npm", command: process.execPath, prefix: [entry] };
|
|
74
|
+
}
|
|
75
|
+
if (process.platform !== "win32")
|
|
76
|
+
return { name: "npm", command: "npm", prefix: [] };
|
|
77
|
+
throw new Error("npm não localizado junto ao Node.js ou no PATH. Repare a instalação do Node/npm e repita init.");
|
|
78
|
+
}
|
|
79
|
+
function executableDirectories() {
|
|
80
|
+
return [
|
|
81
|
+
...new Set([
|
|
82
|
+
dirname(process.execPath),
|
|
83
|
+
...(process.env.PATH ?? "").split(delimiter).filter(Boolean),
|
|
84
|
+
]),
|
|
85
|
+
];
|
|
86
|
+
}
|
|
87
|
+
async function exists(path) {
|
|
88
|
+
try {
|
|
89
|
+
await access(path);
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export const runPackageManager = async (manager, args, root) => new Promise((resolveRun, reject) => {
|
|
97
|
+
const env = {
|
|
98
|
+
...process.env,
|
|
99
|
+
CI: "1",
|
|
100
|
+
COREPACK_ENABLE_DOWNLOAD_PROMPT: "0",
|
|
101
|
+
YARN_ENABLE_SCRIPTS: "false",
|
|
102
|
+
YARN_ENABLE_IMMUTABLE_INSTALLS: "false",
|
|
103
|
+
};
|
|
104
|
+
// Ignore inherited production/omit/workspace selectors from npm exec: init needs dev tools too.
|
|
105
|
+
for (const key of Object.keys(env))
|
|
106
|
+
if (/^npm_config_(?:global|prefix|workspace|workspaces|production|omit|only|package_lock_only|dry_run|ignore_scripts|force|legacy_peer_deps|engine_strict)$/i.test(key))
|
|
107
|
+
delete env[key];
|
|
108
|
+
if (manager.nodeExecutable) {
|
|
109
|
+
const key = Object.keys(env).find((key) => key.toUpperCase() === "PATH") ?? "PATH";
|
|
110
|
+
env[key] =
|
|
111
|
+
`${dirname(manager.nodeExecutable)}${delimiter}${env[key] ?? ""}`;
|
|
112
|
+
}
|
|
113
|
+
const child = spawn(manager.command, [...manager.prefix, ...args], {
|
|
114
|
+
cwd: root,
|
|
115
|
+
env,
|
|
116
|
+
shell: false,
|
|
117
|
+
windowsHide: true,
|
|
118
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
119
|
+
});
|
|
120
|
+
let output = "";
|
|
121
|
+
let timedOut = false;
|
|
122
|
+
const timer = setTimeout(() => {
|
|
123
|
+
timedOut = true;
|
|
124
|
+
child.kill();
|
|
125
|
+
}, 300_000);
|
|
126
|
+
const append = (chunk) => {
|
|
127
|
+
output = (output + chunk.toString()).slice(-32_768);
|
|
128
|
+
};
|
|
129
|
+
child.stdout.on("data", append);
|
|
130
|
+
child.stderr.on("data", append);
|
|
131
|
+
child.once("error", (error) => {
|
|
132
|
+
clearTimeout(timer);
|
|
133
|
+
reject(error);
|
|
134
|
+
});
|
|
135
|
+
child.once("close", (code) => {
|
|
136
|
+
clearTimeout(timer);
|
|
137
|
+
if (code === 0 && !timedOut)
|
|
138
|
+
resolveRun(output);
|
|
139
|
+
else
|
|
140
|
+
reject(new Error(`${manager.name} install ${timedOut ? "excedeu 5 minutos" : `falhou (${code})`}. ${redact(output)}`));
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
function redact(value) {
|
|
144
|
+
return value
|
|
145
|
+
.replace(/(https?:\/\/)[^\s/@]+:[^\s/@]+@/gi, "$1[redacted]@")
|
|
146
|
+
.replace(/(?:npm_[A-Za-z0-9]{20,}|(?<=_authToken[=:]\s*)[^\s]+)/g, "[redacted]");
|
|
147
|
+
}
|
|
148
|
+
export async function installArguments(manager, root, run) {
|
|
149
|
+
if (manager.name === "npm")
|
|
150
|
+
return [
|
|
151
|
+
"install",
|
|
152
|
+
"--ignore-scripts",
|
|
153
|
+
"--no-audit",
|
|
154
|
+
"--no-fund",
|
|
155
|
+
"--include=dev",
|
|
156
|
+
"--include=optional",
|
|
157
|
+
"--package-lock",
|
|
158
|
+
"--global=false",
|
|
159
|
+
"--engine-strict",
|
|
160
|
+
"--force=false",
|
|
161
|
+
"--legacy-peer-deps=false",
|
|
162
|
+
"--fetch-retries=1",
|
|
163
|
+
"--fetch-timeout=60000",
|
|
164
|
+
];
|
|
165
|
+
if (manager.name === "pnpm")
|
|
166
|
+
return [
|
|
167
|
+
"install",
|
|
168
|
+
"--ignore-scripts",
|
|
169
|
+
"--no-frozen-lockfile",
|
|
170
|
+
"--prod=false",
|
|
171
|
+
"--config.engine-strict=true",
|
|
172
|
+
];
|
|
173
|
+
const version = (await run(manager, ["--version"], root)).trim();
|
|
174
|
+
if (!version.startsWith("1."))
|
|
175
|
+
throw new Error("Yarn 2+ ainda não possui instalação automática qualificada. Use o gerenciador do projeto para preparar a stack; init não converterá o lockfile.");
|
|
176
|
+
return ["install", "--ignore-scripts", "--non-interactive", "--production=false"];
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=stack-package-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack-package-manager.js","sourceRoot":"","sources":["../../src/services/stack-package-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface StackPackage {
|
|
2
|
+
name: string;
|
|
3
|
+
version: string;
|
|
4
|
+
development: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface StackItem extends StackPackage {
|
|
7
|
+
installed: string | null;
|
|
8
|
+
declared: string | null;
|
|
9
|
+
requested: string;
|
|
10
|
+
}
|
|
11
|
+
export type ProjectPackage = Record<string, unknown> & {
|
|
12
|
+
dependencies?: Record<string, string>;
|
|
13
|
+
devDependencies?: Record<string, string>;
|
|
14
|
+
optionalDependencies?: Record<string, string>;
|
|
15
|
+
peerDependencies?: Record<string, string>;
|
|
16
|
+
packageManager?: string;
|
|
17
|
+
};
|
|
18
|
+
export interface StackPlan {
|
|
19
|
+
root: string;
|
|
20
|
+
node: {
|
|
21
|
+
current: string;
|
|
22
|
+
configured: string;
|
|
23
|
+
};
|
|
24
|
+
manifest: ProjectPackage;
|
|
25
|
+
manifestSource: string | null;
|
|
26
|
+
packages: StackItem[];
|
|
27
|
+
}
|
|
28
|
+
export declare function readOptional(path: string): Promise<string | null>;
|
|
29
|
+
/** Reads only this project's modules. Global packages and the npx cache cannot satisfy it. */
|
|
30
|
+
export declare function installedVersion(root: string, name: string): Promise<string | null>;
|
|
31
|
+
export declare function planStack(root: string, templateDirectory?: string): Promise<StackPlan>;
|
|
32
|
+
export declare function describeStack(plan: StackPlan, dryRun?: boolean): string;
|
|
33
|
+
//# sourceMappingURL=stack-plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack-plan.d.ts","sourceRoot":"","sources":["../../src/services/stack-plan.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;CACtB;AACD,MAAM,WAAW,SAAU,SAAQ,YAAY;IAC7C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AACD,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACrD,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AACF,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,QAAQ,EAAE,cAAc,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,SAAS,EAAE,CAAC;CACvB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOvE;AAED,8FAA8F;AAC9F,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2BzF;AAED,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EACZ,iBAAiB,SAA6B,GAC7C,OAAO,CAAC,SAAS,CAAC,CA6EpB;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,UAAQ,GAAG,MAAM,CAYrE"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { access, readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { parse } from "yaml";
|
|
4
|
+
import { defaultTemplateDirectory } from "./template-manifest.js";
|
|
5
|
+
export async function readOptional(path) {
|
|
6
|
+
try {
|
|
7
|
+
return await readFile(path, "utf8");
|
|
8
|
+
}
|
|
9
|
+
catch (error) {
|
|
10
|
+
if (error.code === "ENOENT")
|
|
11
|
+
return null;
|
|
12
|
+
throw error;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/** Reads only this project's modules. Global packages and the npx cache cannot satisfy it. */
|
|
16
|
+
export async function installedVersion(root, name) {
|
|
17
|
+
const directory = join(root, "node_modules", name);
|
|
18
|
+
const source = await readOptional(join(directory, "package.json"));
|
|
19
|
+
if (source === null)
|
|
20
|
+
return null;
|
|
21
|
+
try {
|
|
22
|
+
const pkg = JSON.parse(source);
|
|
23
|
+
if (pkg.name !== name ||
|
|
24
|
+
typeof pkg.version !== "string" ||
|
|
25
|
+
!/^\d+\.\d+\.\d+(?:-[\w.-]+)?(?:\+[\w.-]+)?$/.test(pkg.version))
|
|
26
|
+
return null;
|
|
27
|
+
const binary = typeof pkg.bin === "string" ? pkg.bin : Object.values(pkg.bin ?? {})[0];
|
|
28
|
+
const entry = typeof binary === "string" ? binary : pkg.main;
|
|
29
|
+
if (typeof entry !== "string" ||
|
|
30
|
+
entry.startsWith("/") ||
|
|
31
|
+
entry.includes("\\") ||
|
|
32
|
+
entry.includes(":") ||
|
|
33
|
+
entry.split("/").includes(".."))
|
|
34
|
+
return null;
|
|
35
|
+
await access(join(directory, entry));
|
|
36
|
+
return pkg.version;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export async function planStack(root, templateDirectory = defaultTemplateDirectory()) {
|
|
43
|
+
const defaults = JSON.parse(await readFile(join(templateDirectory, ".agents/dashboard/stack-dependencies.json"), "utf8"));
|
|
44
|
+
if (defaults.schema_version !== 1 || !Array.isArray(defaults.packages))
|
|
45
|
+
throw new Error("Invalid ZAIP stack manifest");
|
|
46
|
+
const config = parse((await readOptional(join(root, ".agents/config/project.yaml"))) ?? "{}");
|
|
47
|
+
const overrides = Object.values(config?.stack?.overrides?.components ?? {});
|
|
48
|
+
const manifestSource = await readOptional(join(root, "package.json"));
|
|
49
|
+
const manifest = manifestSource === null ? { private: true } : JSON.parse(manifestSource);
|
|
50
|
+
if (!manifest || Array.isArray(manifest) || typeof manifest !== "object")
|
|
51
|
+
throw new Error("Invalid project package.json");
|
|
52
|
+
for (const field of [
|
|
53
|
+
"dependencies",
|
|
54
|
+
"devDependencies",
|
|
55
|
+
"optionalDependencies",
|
|
56
|
+
"peerDependencies",
|
|
57
|
+
]) {
|
|
58
|
+
const entries = manifest[field];
|
|
59
|
+
if (entries !== undefined &&
|
|
60
|
+
(!entries ||
|
|
61
|
+
Array.isArray(entries) ||
|
|
62
|
+
typeof entries !== "object" ||
|
|
63
|
+
Object.values(entries).some((value) => typeof value !== "string"))) {
|
|
64
|
+
throw new Error(`Invalid package.json ${field}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const packages = await Promise.all(defaults.packages.map(async (item) => {
|
|
68
|
+
if (!/^[a-z0-9][a-z0-9-]*$/.test(item.name) ||
|
|
69
|
+
!/^\d+\.\d+\.\d+(?:-[\w.-]+)?$/.test(item.version))
|
|
70
|
+
throw new Error("Invalid ZAIP dependency");
|
|
71
|
+
const choices = overrides.filter((entry) => entry.reference === `npm:${item.name}` && entry.version);
|
|
72
|
+
const versions = new Set(choices.map((entry) => String(entry.version)));
|
|
73
|
+
if (versions.size > 1)
|
|
74
|
+
throw new Error(`Conflicting configured versions for ${item.name}`);
|
|
75
|
+
const version = [...versions][0] ?? item.version;
|
|
76
|
+
if (!/^\d+\.\d+\.\d+(?:-[\w.-]+)?$/.test(version))
|
|
77
|
+
throw new Error(`Configure an exact ZAIP version for ${item.name}: ${version}`);
|
|
78
|
+
const installed = await installedVersion(root, item.name);
|
|
79
|
+
const declared = manifest.dependencies?.[item.name] ??
|
|
80
|
+
manifest.devDependencies?.[item.name] ??
|
|
81
|
+
manifest.optionalDependencies?.[item.name] ??
|
|
82
|
+
manifest.peerDependencies?.[item.name] ??
|
|
83
|
+
null;
|
|
84
|
+
return { ...item, version, installed, declared, requested: declared ?? version };
|
|
85
|
+
}));
|
|
86
|
+
// React DOM must follow an existing React choice rather than introduce a peer conflict.
|
|
87
|
+
const react = packages.find((item) => item.name === "react");
|
|
88
|
+
const dom = packages.find((item) => item.name === "react-dom");
|
|
89
|
+
if (react && dom?.installed && !react.installed && !react.declared)
|
|
90
|
+
react.requested = dom.installed;
|
|
91
|
+
if (react && dom && !dom.installed && !dom.declared)
|
|
92
|
+
dom.requested = react.installed ?? react.requested;
|
|
93
|
+
return {
|
|
94
|
+
root,
|
|
95
|
+
node: {
|
|
96
|
+
current: process.versions.node,
|
|
97
|
+
configured: String(overrides.find((entry) => entry.reference === "runtime:node" && entry.version)?.version ??
|
|
98
|
+
defaults.node),
|
|
99
|
+
},
|
|
100
|
+
manifest,
|
|
101
|
+
manifestSource,
|
|
102
|
+
packages,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
export function describeStack(plan, dryRun = false) {
|
|
106
|
+
const lines = [
|
|
107
|
+
`Node.js: preservado ${plan.node.current}; configurado ZAIP ${plan.node.configured}.`,
|
|
108
|
+
];
|
|
109
|
+
for (const item of plan.packages) {
|
|
110
|
+
lines.push(item.installed
|
|
111
|
+
? `${item.name}: não instalado novamente; versão atual ${item.installed}; configurada ZAIP ${item.version}.`
|
|
112
|
+
: `${item.name}: ${dryRun ? "instalação planejada" : "instalando"} ${item.requested}; atual ausente; configurada ZAIP ${item.version}${item.declared ? "; preservando declaração do projeto" : ""}.`);
|
|
113
|
+
}
|
|
114
|
+
return `${lines.join("\n")}\n`;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=stack-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack-plan.js","sourceRoot":"","sources":["../../src/services/stack-plan.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Readable, Writable } from "node:stream";
|
|
2
|
+
import type { PackageRunner } from "./services/stack-package-manager.js";
|
|
2
3
|
export interface InitOptions {
|
|
3
4
|
directory?: string;
|
|
4
5
|
cwd?: string;
|
|
@@ -37,6 +38,8 @@ export interface InitResult {
|
|
|
37
38
|
};
|
|
38
39
|
}
|
|
39
40
|
export interface CliRuntime {
|
|
41
|
+
/** Injectable package runner for deterministic offline installer tests. */
|
|
42
|
+
packageRunner?: PackageRunner;
|
|
40
43
|
cwd?: string;
|
|
41
44
|
stdin?: Readable;
|
|
42
45
|
stdout?: Writable;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAEzE,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4FAA4F;IAC5F,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,0EAA0E;IAC1E,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB,CAAC,EAAE;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,OAAO,CAAC;QACnB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,oBAAoB,EAAE,MAAM,CAAC;QAC7B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;KACtB,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,2EAA2E;IAC3E,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zaip-ai/cli",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.8",
|
|
4
4
|
"description": "CLI oficial para instalar e configurar o ZAIP-AIOS em qualquer repositório",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"LICENSE"
|
|
21
21
|
],
|
|
22
22
|
"engines": {
|
|
23
|
-
"node": ">=22.
|
|
23
|
+
"node": ">=22.16.0"
|
|
24
24
|
},
|
|
25
25
|
"publishConfig": {
|
|
26
26
|
"access": "public",
|