agroplan-ai-cli 1.0.20 → 1.0.21
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/backend-template/VERSION.json +13 -0
- package/dist/index.js +170 -81
- package/package.json +1 -1
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cli_version": "1.0.21",
|
|
3
|
+
"backend_template_version": "1.0.21",
|
|
4
|
+
"zarc_index_version": "2025-2026-fast-index-v2",
|
|
5
|
+
"features": [
|
|
6
|
+
"zarc_fast_index",
|
|
7
|
+
"zarc_fallback_sorgo_mandioca",
|
|
8
|
+
"soil_normalization_misto_siltoso",
|
|
9
|
+
"climate_real_data",
|
|
10
|
+
"hybrid_mode"
|
|
11
|
+
],
|
|
12
|
+
"generated_at": "2026-05-09T18:30:00Z"
|
|
13
|
+
}
|
package/dist/index.js
CHANGED
|
@@ -41,6 +41,13 @@ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
|
41
41
|
var __require = import.meta.require;
|
|
42
42
|
|
|
43
43
|
// src/utils/paths.ts
|
|
44
|
+
var exports_paths = {};
|
|
45
|
+
__export(exports_paths, {
|
|
46
|
+
getProjectPaths: () => getProjectPaths,
|
|
47
|
+
getHomeAgroplanDir: () => getHomeAgroplanDir,
|
|
48
|
+
findProjectRoot: () => findProjectRoot,
|
|
49
|
+
ensureAgroplanDir: () => ensureAgroplanDir
|
|
50
|
+
});
|
|
44
51
|
import { join, dirname } from "path";
|
|
45
52
|
import { existsSync, mkdirSync } from "fs";
|
|
46
53
|
import { homedir } from "os";
|
|
@@ -113,6 +120,77 @@ function ensureAgroplanDir() {
|
|
|
113
120
|
}
|
|
114
121
|
var init_paths = () => {};
|
|
115
122
|
|
|
123
|
+
// src/utils/process.ts
|
|
124
|
+
var exports_process = {};
|
|
125
|
+
__export(exports_process, {
|
|
126
|
+
savePid: () => savePid,
|
|
127
|
+
removePidFile: () => removePidFile,
|
|
128
|
+
readPid: () => readPid,
|
|
129
|
+
killProcess: () => killProcess,
|
|
130
|
+
isProcessRunning: () => isProcessRunning,
|
|
131
|
+
checkPort: () => checkPort
|
|
132
|
+
});
|
|
133
|
+
import { existsSync as existsSync2, readFileSync, writeFileSync, unlinkSync } from "fs";
|
|
134
|
+
function savePid(pid) {
|
|
135
|
+
const paths = getProjectPaths();
|
|
136
|
+
writeFileSync(paths.pidFile, pid.toString());
|
|
137
|
+
}
|
|
138
|
+
function readPid() {
|
|
139
|
+
const paths = getProjectPaths();
|
|
140
|
+
if (!existsSync2(paths.pidFile)) {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
try {
|
|
144
|
+
const pidStr = readFileSync(paths.pidFile, "utf-8").trim();
|
|
145
|
+
return parseInt(pidStr, 10);
|
|
146
|
+
} catch {
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
function removePidFile() {
|
|
151
|
+
const paths = getProjectPaths();
|
|
152
|
+
if (existsSync2(paths.pidFile)) {
|
|
153
|
+
unlinkSync(paths.pidFile);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
function isProcessRunning(pid) {
|
|
157
|
+
try {
|
|
158
|
+
process.kill(pid, 0);
|
|
159
|
+
return true;
|
|
160
|
+
} catch {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function killProcess(pid) {
|
|
165
|
+
try {
|
|
166
|
+
process.kill(pid, "SIGTERM");
|
|
167
|
+
setTimeout(() => {
|
|
168
|
+
if (isProcessRunning(pid)) {
|
|
169
|
+
try {
|
|
170
|
+
process.kill(pid, "SIGKILL");
|
|
171
|
+
} catch {}
|
|
172
|
+
}
|
|
173
|
+
}, 2000);
|
|
174
|
+
return true;
|
|
175
|
+
} catch {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
function checkPort(port) {
|
|
180
|
+
return new Promise((resolve) => {
|
|
181
|
+
try {
|
|
182
|
+
fetch(`http://localhost:${port}/health`, {
|
|
183
|
+
signal: AbortSignal.timeout(1000)
|
|
184
|
+
}).then(() => resolve(true)).catch(() => resolve(false));
|
|
185
|
+
} catch {
|
|
186
|
+
resolve(false);
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
var init_process = __esm(() => {
|
|
191
|
+
init_paths();
|
|
192
|
+
});
|
|
193
|
+
|
|
116
194
|
// src/utils/setup-state.ts
|
|
117
195
|
var exports_setup_state = {};
|
|
118
196
|
__export(exports_setup_state, {
|
|
@@ -213,68 +291,7 @@ function checkPip() {
|
|
|
213
291
|
|
|
214
292
|
// src/commands/doctor.ts
|
|
215
293
|
init_paths();
|
|
216
|
-
|
|
217
|
-
// src/utils/process.ts
|
|
218
|
-
init_paths();
|
|
219
|
-
import { existsSync as existsSync2, readFileSync, writeFileSync, unlinkSync } from "fs";
|
|
220
|
-
function savePid(pid) {
|
|
221
|
-
const paths = getProjectPaths();
|
|
222
|
-
writeFileSync(paths.pidFile, pid.toString());
|
|
223
|
-
}
|
|
224
|
-
function readPid() {
|
|
225
|
-
const paths = getProjectPaths();
|
|
226
|
-
if (!existsSync2(paths.pidFile)) {
|
|
227
|
-
return null;
|
|
228
|
-
}
|
|
229
|
-
try {
|
|
230
|
-
const pidStr = readFileSync(paths.pidFile, "utf-8").trim();
|
|
231
|
-
return parseInt(pidStr, 10);
|
|
232
|
-
} catch {
|
|
233
|
-
return null;
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
function removePidFile() {
|
|
237
|
-
const paths = getProjectPaths();
|
|
238
|
-
if (existsSync2(paths.pidFile)) {
|
|
239
|
-
unlinkSync(paths.pidFile);
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
function isProcessRunning(pid) {
|
|
243
|
-
try {
|
|
244
|
-
process.kill(pid, 0);
|
|
245
|
-
return true;
|
|
246
|
-
} catch {
|
|
247
|
-
return false;
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
function killProcess(pid) {
|
|
251
|
-
try {
|
|
252
|
-
process.kill(pid, "SIGTERM");
|
|
253
|
-
setTimeout(() => {
|
|
254
|
-
if (isProcessRunning(pid)) {
|
|
255
|
-
try {
|
|
256
|
-
process.kill(pid, "SIGKILL");
|
|
257
|
-
} catch {}
|
|
258
|
-
}
|
|
259
|
-
}, 2000);
|
|
260
|
-
return true;
|
|
261
|
-
} catch {
|
|
262
|
-
return false;
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
function checkPort(port) {
|
|
266
|
-
return new Promise((resolve) => {
|
|
267
|
-
try {
|
|
268
|
-
fetch(`http://localhost:${port}/health`, {
|
|
269
|
-
signal: AbortSignal.timeout(1000)
|
|
270
|
-
}).then(() => resolve(true)).catch(() => resolve(false));
|
|
271
|
-
} catch {
|
|
272
|
-
resolve(false);
|
|
273
|
-
}
|
|
274
|
-
});
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
// src/commands/doctor.ts
|
|
294
|
+
init_process();
|
|
278
295
|
init_setup_state();
|
|
279
296
|
async function doctorCommand() {
|
|
280
297
|
console.log(`\uD83D\uDD0D AgroPlan AI - Diagn\xF3stico do Sistema
|
|
@@ -305,20 +322,37 @@ async function doctorCommand() {
|
|
|
305
322
|
\uD83D\uDEE0\uFE0F Setup Local:`);
|
|
306
323
|
const setupComplete = isSetupComplete();
|
|
307
324
|
const setupState = readSetupState();
|
|
308
|
-
let currentVersion = "1.0.
|
|
325
|
+
let currentVersion = "1.0.21";
|
|
309
326
|
try {
|
|
310
327
|
const packagePath = __require.resolve("agroplan-ai-cli/package.json");
|
|
311
328
|
const packageJson = __require(packagePath);
|
|
312
|
-
currentVersion = packageJson.version || "1.0.
|
|
329
|
+
currentVersion = packageJson.version || "1.0.21";
|
|
313
330
|
} catch {
|
|
314
|
-
currentVersion = "1.0.
|
|
331
|
+
currentVersion = "1.0.21";
|
|
315
332
|
}
|
|
316
333
|
if (setupComplete && setupState) {
|
|
317
334
|
const installedVersion = setupState.version || "unknown";
|
|
318
335
|
console.log(" \u2705 Setup conclu\xEDdo");
|
|
319
336
|
console.log(` \uD83D\uDCC5 Instalado em: ${new Date(setupState.installedAt).toLocaleString()}`);
|
|
320
|
-
console.log(` \uD83D\uDCE6 Vers\xE3o: ${installedVersion}`);
|
|
337
|
+
console.log(` \uD83D\uDCE6 Vers\xE3o CLI: ${installedVersion}`);
|
|
321
338
|
console.log(` \uD83D\uDC0D Python: ${setupState.python}`);
|
|
339
|
+
try {
|
|
340
|
+
const { getHomeAgroplanDir: getHomeAgroplanDir2 } = await Promise.resolve().then(() => (init_paths(), exports_paths));
|
|
341
|
+
const homeDir = getHomeAgroplanDir2();
|
|
342
|
+
const versionPath = `${homeDir}/backend/VERSION.json`;
|
|
343
|
+
const { existsSync: existsSync5, readFileSync: readFileSync3 } = await import("fs");
|
|
344
|
+
if (existsSync5(versionPath)) {
|
|
345
|
+
const versionContent = readFileSync3(versionPath, "utf-8");
|
|
346
|
+
const versionInfo = JSON.parse(versionContent);
|
|
347
|
+
console.log(` \uD83D\uDCE6 Backend template: ${versionInfo.backend_template_version || "unknown"}`);
|
|
348
|
+
console.log(` \uD83D\uDDC2\uFE0F ZARC index: ${versionInfo.zarc_index_version || "unknown"}`);
|
|
349
|
+
if (versionInfo.features && versionInfo.features.length > 0) {
|
|
350
|
+
console.log(` \u2728 Features: ${versionInfo.features.slice(0, 3).join(", ")}${versionInfo.features.length > 3 ? "..." : ""}`);
|
|
351
|
+
}
|
|
352
|
+
} else {
|
|
353
|
+
console.log(" \u26A0\uFE0F VERSION.json n\xE3o encontrado no backend local");
|
|
354
|
+
}
|
|
355
|
+
} catch (error) {}
|
|
322
356
|
if (installedVersion !== currentVersion) {
|
|
323
357
|
console.log(`
|
|
324
358
|
\u26A0\uFE0F API local desatualizada!`);
|
|
@@ -452,6 +486,7 @@ Correja os problemas acima:`);
|
|
|
452
486
|
|
|
453
487
|
// src/commands/serve.ts
|
|
454
488
|
init_paths();
|
|
489
|
+
init_process();
|
|
455
490
|
import { existsSync as existsSync5, readFileSync as readFileSync3, openSync, closeSync } from "fs";
|
|
456
491
|
import { spawn } from "child_process";
|
|
457
492
|
async function serveOnCommand() {
|
|
@@ -471,13 +506,13 @@ async function serveOnCommand() {
|
|
|
471
506
|
const { readSetupState: readSetupState2 } = await Promise.resolve().then(() => (init_setup_state(), exports_setup_state));
|
|
472
507
|
const setupState = readSetupState2();
|
|
473
508
|
if (setupState) {
|
|
474
|
-
let currentVersion = "1.0.
|
|
509
|
+
let currentVersion = "1.0.21";
|
|
475
510
|
try {
|
|
476
511
|
const packagePath = __require.resolve("agroplan-ai-cli/package.json");
|
|
477
512
|
const packageJson = __require(packagePath);
|
|
478
|
-
currentVersion = packageJson.version || "1.0.
|
|
513
|
+
currentVersion = packageJson.version || "1.0.21";
|
|
479
514
|
} catch {
|
|
480
|
-
currentVersion = "1.0.
|
|
515
|
+
currentVersion = "1.0.21";
|
|
481
516
|
}
|
|
482
517
|
const installedVersion = setupState.version || "unknown";
|
|
483
518
|
if (installedVersion !== currentVersion) {
|
|
@@ -738,13 +773,13 @@ async function setupCommand(force = false, pythonPath) {
|
|
|
738
773
|
const homeDir = getHomeAgroplanDir();
|
|
739
774
|
const backendDir = join3(homeDir, "backend");
|
|
740
775
|
console.log(`\uD83D\uDCC1 Diret\xF3rio de instala\xE7\xE3o: ${homeDir}`);
|
|
741
|
-
let currentVersion = "1.0.
|
|
776
|
+
let currentVersion = "1.0.21";
|
|
742
777
|
try {
|
|
743
778
|
const packagePath = __require.resolve("agroplan-ai-cli/package.json");
|
|
744
779
|
const packageJson = __require(packagePath);
|
|
745
|
-
currentVersion = packageJson.version || "1.0.
|
|
780
|
+
currentVersion = packageJson.version || "1.0.21";
|
|
746
781
|
} catch {
|
|
747
|
-
currentVersion = "1.0.
|
|
782
|
+
currentVersion = "1.0.21";
|
|
748
783
|
}
|
|
749
784
|
if (!force && isSetupComplete()) {
|
|
750
785
|
const setupState = (init_setup_state(), __toCommonJS(exports_setup_state)).readSetupState();
|
|
@@ -885,13 +920,13 @@ async function setupCommand(force = false, pythonPath) {
|
|
|
885
920
|
return;
|
|
886
921
|
}
|
|
887
922
|
console.log(" \u2705 Servidor web configurado");
|
|
888
|
-
let version = "1.0.
|
|
923
|
+
let version = "1.0.21";
|
|
889
924
|
try {
|
|
890
925
|
const packagePath = __require.resolve("agroplan-ai-cli/package.json");
|
|
891
926
|
const packageJson = __require(packagePath);
|
|
892
|
-
version = packageJson.version || "1.0.
|
|
927
|
+
version = packageJson.version || "1.0.21";
|
|
893
928
|
} catch {
|
|
894
|
-
version = "1.0.
|
|
929
|
+
version = "1.0.21";
|
|
895
930
|
}
|
|
896
931
|
saveSetupState({
|
|
897
932
|
version,
|
|
@@ -914,6 +949,7 @@ async function setupCommand(force = false, pythonPath) {
|
|
|
914
949
|
|
|
915
950
|
// src/commands/update.ts
|
|
916
951
|
init_setup_state();
|
|
952
|
+
init_process();
|
|
917
953
|
async function updateCommand() {
|
|
918
954
|
console.log(`\uD83D\uDD04 Atualizando API local do AgroPlan AI...
|
|
919
955
|
`);
|
|
@@ -932,13 +968,13 @@ async function updateCommand() {
|
|
|
932
968
|
console.log(" agroplan setup --force");
|
|
933
969
|
return;
|
|
934
970
|
}
|
|
935
|
-
let currentVersion = "1.0.
|
|
971
|
+
let currentVersion = "1.0.21";
|
|
936
972
|
try {
|
|
937
973
|
const packagePath = __require.resolve("agroplan-ai-cli/package.json");
|
|
938
974
|
const packageJson = __require(packagePath);
|
|
939
|
-
currentVersion = packageJson.version || "1.0.
|
|
975
|
+
currentVersion = packageJson.version || "1.0.21";
|
|
940
976
|
} catch {
|
|
941
|
-
currentVersion = "1.0.
|
|
977
|
+
currentVersion = "1.0.21";
|
|
942
978
|
}
|
|
943
979
|
const installedVersion = setupState.version || "unknown";
|
|
944
980
|
console.log(`\uD83D\uDCE6 Vers\xE3o instalada: ${installedVersion}`);
|
|
@@ -962,12 +998,62 @@ async function updateCommand() {
|
|
|
962
998
|
} else {
|
|
963
999
|
console.log("1\uFE0F\u20E3 API local n\xE3o est\xE1 rodando");
|
|
964
1000
|
}
|
|
965
|
-
|
|
1001
|
+
const { checkPort: checkPort2 } = await Promise.resolve().then(() => (init_process(), exports_process));
|
|
1002
|
+
const portInUse = await checkPort2(8000);
|
|
1003
|
+
if (portInUse) {
|
|
1004
|
+
console.log(`
|
|
1005
|
+
\u26A0\uFE0F Porta 8000 ainda est\xE1 ocupada por outro processo!`);
|
|
1006
|
+
console.log(`
|
|
1007
|
+
\uD83D\uDCA1 Para identificar e encerrar o processo:`);
|
|
1008
|
+
console.log(" netstat -ano | findstr :8000");
|
|
1009
|
+
console.log(" taskkill /PID <PID> /F");
|
|
1010
|
+
console.log(`
|
|
1011
|
+
Depois rode novamente: agroplan update`);
|
|
1012
|
+
return;
|
|
1013
|
+
}
|
|
1014
|
+
console.log("2\uFE0F\u20E3 Removendo backend antigo...");
|
|
1015
|
+
try {
|
|
1016
|
+
const { getHomeAgroplanDir: getHomeAgroplanDir2 } = await Promise.resolve().then(() => (init_paths(), exports_paths));
|
|
1017
|
+
const { existsSync: existsSync7, rmSync: rmSync2 } = await import("fs");
|
|
1018
|
+
const { join: join4 } = await import("path");
|
|
1019
|
+
const homeDir = getHomeAgroplanDir2();
|
|
1020
|
+
const backendDir = join4(homeDir, "backend");
|
|
1021
|
+
if (existsSync7(backendDir)) {
|
|
1022
|
+
rmSync2(backendDir, { recursive: true, force: true });
|
|
1023
|
+
console.log(" \u2705 Backend antigo removido");
|
|
1024
|
+
} else {
|
|
1025
|
+
console.log(" \u2139\uFE0F Nenhum backend antigo encontrado");
|
|
1026
|
+
}
|
|
1027
|
+
} catch (error) {
|
|
1028
|
+
console.log(` \u26A0\uFE0F Erro ao remover backend: ${error}`);
|
|
1029
|
+
}
|
|
1030
|
+
console.log("");
|
|
1031
|
+
console.log(`3\uFE0F\u20E3 Instalando backend atualizado...
|
|
966
1032
|
`);
|
|
967
1033
|
const pythonPath = setupState.pythonPath || undefined;
|
|
968
1034
|
await setupCommand(true, pythonPath);
|
|
969
1035
|
console.log(`
|
|
970
|
-
|
|
1036
|
+
4\uFE0F\u20E3 Verificando instala\xE7\xE3o...`);
|
|
1037
|
+
try {
|
|
1038
|
+
const { getHomeAgroplanDir: getHomeAgroplanDir2 } = await Promise.resolve().then(() => (init_paths(), exports_paths));
|
|
1039
|
+
const { existsSync: existsSync7, readFileSync: readFileSync4 } = await import("fs");
|
|
1040
|
+
const { join: join4 } = await import("path");
|
|
1041
|
+
const homeDir = getHomeAgroplanDir2();
|
|
1042
|
+
const versionPath = join4(homeDir, "backend", "VERSION.json");
|
|
1043
|
+
if (existsSync7(versionPath)) {
|
|
1044
|
+
const versionContent = readFileSync4(versionPath, "utf-8");
|
|
1045
|
+
const versionInfo = JSON.parse(versionContent);
|
|
1046
|
+
console.log(` \u2705 Backend template: ${versionInfo.backend_template_version}`);
|
|
1047
|
+
console.log(` \u2705 ZARC index: ${versionInfo.zarc_index_version}`);
|
|
1048
|
+
console.log(` \u2705 Features: ${versionInfo.features.length} ativas`);
|
|
1049
|
+
} else {
|
|
1050
|
+
console.log(" \u26A0\uFE0F VERSION.json n\xE3o encontrado");
|
|
1051
|
+
}
|
|
1052
|
+
} catch (error) {
|
|
1053
|
+
console.log(` \u26A0\uFE0F Erro ao verificar vers\xE3o: ${error}`);
|
|
1054
|
+
}
|
|
1055
|
+
console.log(`
|
|
1056
|
+
5\uFE0F\u20E3 Atualiza\xE7\xE3o conclu\xEDda!`);
|
|
971
1057
|
if (isRunning) {
|
|
972
1058
|
console.log(`
|
|
973
1059
|
\uD83D\uDCA1 Para reiniciar a API:`);
|
|
@@ -977,6 +1063,9 @@ async function updateCommand() {
|
|
|
977
1063
|
\uD83D\uDCA1 Para iniciar a API:`);
|
|
978
1064
|
console.log(" agroplan serve on");
|
|
979
1065
|
}
|
|
1066
|
+
console.log(`
|
|
1067
|
+
\uD83D\uDD0D Para verificar a vers\xE3o da API rodando:`);
|
|
1068
|
+
console.log(" http://localhost:8000/debug/version");
|
|
980
1069
|
}
|
|
981
1070
|
|
|
982
1071
|
// src/index.ts
|
|
@@ -993,7 +1082,7 @@ var COMMANDS = {
|
|
|
993
1082
|
open: "Abre o AgroPlan AI no navegador"
|
|
994
1083
|
};
|
|
995
1084
|
function showHelp() {
|
|
996
|
-
console.log("\uD83C\uDF31 AgroPlan AI - CLI Local v1.0.
|
|
1085
|
+
console.log("\uD83C\uDF31 AgroPlan AI - CLI Local v1.0.21");
|
|
997
1086
|
console.log(` Launcher para modo local acelerado
|
|
998
1087
|
`);
|
|
999
1088
|
console.log("\uD83D\uDCCB Comandos dispon\xEDveis:");
|