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.
@@ -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.20";
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.20";
329
+ currentVersion = packageJson.version || "1.0.21";
313
330
  } catch {
314
- currentVersion = "1.0.20";
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.20";
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.20";
513
+ currentVersion = packageJson.version || "1.0.21";
479
514
  } catch {
480
- currentVersion = "1.0.20";
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.20";
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.20";
780
+ currentVersion = packageJson.version || "1.0.21";
746
781
  } catch {
747
- currentVersion = "1.0.20";
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.20";
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.20";
927
+ version = packageJson.version || "1.0.21";
893
928
  } catch {
894
- version = "1.0.20";
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.20";
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.20";
975
+ currentVersion = packageJson.version || "1.0.21";
940
976
  } catch {
941
- currentVersion = "1.0.20";
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
- console.log(`2\uFE0F\u20E3 Reinstalando backend atualizado...
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
- 3\uFE0F\u20E3 Atualiza\xE7\xE3o conclu\xEDda!`);
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.20");
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:");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agroplan-ai-cli",
3
- "version": "1.0.20",
3
+ "version": "1.0.21",
4
4
  "description": "CLI global para AgroPlan AI - modo local acelerado",
5
5
  "type": "module",
6
6
  "bin": {