layero 0.8.21 → 0.8.22

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/dist/api.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { CLI_VERSION, userAgent } from "./version.js";
1
2
  export class ApiError extends Error {
2
3
  status;
3
4
  body;
@@ -17,6 +18,12 @@ export class ApiClient {
17
18
  if (this.cfg.token) {
18
19
  h.Authorization = `Bearer ${this.cfg.token}`;
19
20
  }
21
+ // Версия — в КАЖДОМ запросе, а не только в деплое: иначе доля старых
22
+ // сборок в поле остаётся неизмеримой (02.08.2026 — так и было).
23
+ // Отдельный заголовок рядом с User-Agent, потому что UA по дороге может
24
+ // переписать прокси или корпоративный шлюз, а этот — нет.
25
+ h["User-Agent"] = userAgent();
26
+ h["X-Layero-Cli-Version"] = CLI_VERSION;
20
27
  return h;
21
28
  }
22
29
  async request(method, path, body) {
@@ -1,7 +1,4 @@
1
1
  #!/usr/bin/env node
2
- import { readFileSync } from "node:fs";
3
- import { fileURLToPath } from "node:url";
4
- import path from "node:path";
5
2
  import { Command } from "commander";
6
3
  import chalk from "chalk";
7
4
  import { whoamiCmd } from "../commands/whoami.js";
@@ -24,9 +21,10 @@ import { domainsAddCmd, domainsListCmd, domainsPrimaryCmd, domainsRemoveCmd, dom
24
21
  import { LayeroError, detectMode, emit } from "../agent.js";
25
22
  import { ApiError } from "../api.js";
26
23
  import { notifyIfOutdated } from "../update-notifier.js";
27
- // Read version from the shipped package.json (two levels up from dist/bin/).
28
- const pkgPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..", "package.json");
29
- const VERSION = JSON.parse(readFileSync(pkgPath, "utf-8")).version;
24
+ import { CLI_VERSION } from "../version.js";
25
+ // Одно чтение package.json на процесс — версия нужна и здесь (`--version`,
26
+ // нагон обновления), и в каждом запросе к API (заголовок).
27
+ const VERSION = CLI_VERSION;
30
28
  async function main() {
31
29
  const program = new Command();
32
30
  program
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Версия CLI и то, как она представляется платформе.
3
+ *
4
+ * WHY (02.08.2026): до этого CLI не сообщал о себе НИЧЕГО — ни `User-Agent`,
5
+ * ни своего заголовка. На вопрос «на какой версии сидят люди» из прода ответить
6
+ * было нельзя, а он не праздный: нагон версии не работал ни в одном релизе
7
+ * (запрос к реестру возвращал 406 и глотался), и сколько машин осталось на
8
+ * старом коде, мы не знали даже порядково. На рабочем ноутбуке при этом стоял
9
+ * глобальный 0.8.11 при опубликованном 0.8.20.
10
+ *
11
+ * Версия читается из package.json пакета, а не хардкодится: единственный
12
+ * источник правды — тот же файл, который публикуется в npm.
13
+ */
14
+ import { readFileSync } from "node:fs";
15
+ import { fileURLToPath } from "node:url";
16
+ import path from "node:path";
17
+ function readVersion() {
18
+ try {
19
+ // dist/version.js → корень пакета на уровень выше.
20
+ const pkgPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "package.json");
21
+ return JSON.parse(readFileSync(pkgPath, "utf-8")).version;
22
+ }
23
+ catch {
24
+ // Пакет собран необычно или файл недоступен. Версия — не то, ради чего
25
+ // стоит валить команду: отдаём заглушку и работаем дальше.
26
+ return "0.0.0-unknown";
27
+ }
28
+ }
29
+ export const CLI_VERSION = readVersion();
30
+ /**
31
+ * Строка для `User-Agent`. Ни имени пользователя, ни путей, ни токена — только
32
+ * то, что нужно, чтобы отличить сборочные окружения друг от друга при разборе
33
+ * отказов: своя версия, версия Node и платформа.
34
+ */
35
+ export function userAgent() {
36
+ return `layero-cli/${CLI_VERSION} node/${process.versions.node} ${process.platform}-${process.arch}`;
37
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "layero",
3
- "version": "0.8.21",
3
+ "version": "0.8.22",
4
4
  "description": "Layero CLI — publish a local site with one command. No git, no GitHub, agent-friendly (Cursor, Claude Code).",
5
5
  "license": "MIT",
6
6
  "type": "module",