@downcity/city 1.1.23 → 1.1.24

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.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `city update`:更新全局 downcity CLI。
2
+ * `city update`:更新当前全局安装来源对应的 Downcity CLI。
3
3
  *
4
4
  * 关键点(中文)
5
5
  * - 优先根据当前 CLI 所在的全局模块目录,自动判断是 npm 还是 pnpm 安装。
@@ -17,9 +17,10 @@ export interface UpdateCommandOptions {
17
17
  manager?: UpdateManager | "auto";
18
18
  }
19
19
  /**
20
- * 构造全局更新命令。
20
+ * 检测当前 CLI 实际安装来源的包名。
21
21
  */
22
- export declare function buildGlobalUpdateInvocation(manager: UpdateManager): {
22
+ export declare function detectInstalledPackageName(): string;
23
+ export declare function buildGlobalUpdateInvocation(manager: UpdateManager, packageName: string): {
23
24
  command: string;
24
25
  args: string[];
25
26
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Update.d.ts","sourceRoot":"","sources":["../../../src/cli/shared/Update.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,CAAC;AAE3C,MAAM,WAAW,oBAAoB;IACnC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC;CAClC;AAID;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,aAAa,GAAG;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,CAYA;AAED;;GAEG;AACH,wBAAgB,mCAAmC,CAAC,MAAM,EAAE;IAC1D,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,aAAa,GAAG,IAAI,CAQvB;AA8BD;;GAEG;AACH,wBAAgB,4BAA4B,IAAI,aAAa,CAU5D;AAmBD;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAiDf"}
1
+ {"version":3,"file":"Update.d.ts","sourceRoot":"","sources":["../../../src/cli/shared/Update.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,CAAC;AAE3C,MAAM,WAAW,oBAAoB;IACnC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC;CAClC;AAgCD;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAEnD;AAED,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,MAAM,GAClB;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,CAYA;AAED;;GAEG;AACH,wBAAgB,mCAAmC,CAAC,MAAM,EAAE;IAC1D,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,aAAa,GAAG,IAAI,CAQvB;AA8BD;;GAEG;AACH,wBAAgB,4BAA4B,IAAI,aAAa,CAQ5D;AAmBD;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAkDf"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `city update`:更新全局 downcity CLI。
2
+ * `city update`:更新当前全局安装来源对应的 Downcity CLI。
3
3
  *
4
4
  * 关键点(中文)
5
5
  * - 优先根据当前 CLI 所在的全局模块目录,自动判断是 npm 还是 pnpm 安装。
@@ -13,20 +13,50 @@ import { fileURLToPath } from "url";
13
13
  import { emitCliBlock } from "./CliReporter.js";
14
14
  import { CliError } from "./CliError.js";
15
15
  import { runWithSpinner } from "../../utils/cli/Spinner.js";
16
- const GLOBAL_PACKAGE_NAME = "downcity";
16
+ const FALLBACK_GLOBAL_PACKAGE_NAME = "downcity";
17
17
  /**
18
- * 构造全局更新命令。
18
+ * 解析当前 CLI 安装包根目录。
19
+ *
20
+ * 关键点(中文)
21
+ * - 开发态路径是 `src/cli/shared`,构建后路径是 `bin/cli/shared`。
22
+ * - 两种目录结构都可以通过回退三级拿到 package 根目录。
19
23
  */
20
- export function buildGlobalUpdateInvocation(manager) {
24
+ function resolveInstalledPackageRoot() {
25
+ const __filename = fileURLToPath(import.meta.url);
26
+ const __dirname = path.dirname(__filename);
27
+ return path.resolve(__dirname, "../../..");
28
+ }
29
+ /**
30
+ * 读取当前 CLI 实际对应的 npm 包名。
31
+ */
32
+ function readInstalledPackageName(packageRoot) {
33
+ try {
34
+ const packageJsonPath = path.join(packageRoot, "package.json");
35
+ const raw = fs.readFileSync(packageJsonPath, "utf8");
36
+ const parsed = JSON.parse(raw);
37
+ const packageName = typeof parsed.name === "string" ? parsed.name.trim() : "";
38
+ return packageName || FALLBACK_GLOBAL_PACKAGE_NAME;
39
+ }
40
+ catch {
41
+ return FALLBACK_GLOBAL_PACKAGE_NAME;
42
+ }
43
+ }
44
+ /**
45
+ * 检测当前 CLI 实际安装来源的包名。
46
+ */
47
+ export function detectInstalledPackageName() {
48
+ return readInstalledPackageName(resolveInstalledPackageRoot());
49
+ }
50
+ export function buildGlobalUpdateInvocation(manager, packageName) {
21
51
  if (manager === "pnpm") {
22
52
  return {
23
53
  command: "pnpm",
24
- args: ["add", "-g", `${GLOBAL_PACKAGE_NAME}@latest`],
54
+ args: ["add", "-g", `${packageName}@latest`],
25
55
  };
26
56
  }
27
57
  return {
28
58
  command: "npm",
29
- args: ["install", "-g", `${GLOBAL_PACKAGE_NAME}@latest`],
59
+ args: ["install", "-g", `${packageName}@latest`],
30
60
  };
31
61
  }
32
62
  /**
@@ -74,9 +104,7 @@ function readGlobalRoot(manager) {
74
104
  * 自动判断当前全局安装使用的包管理器。
75
105
  */
76
106
  export function detectInstalledUpdateManager() {
77
- const __filename = fileURLToPath(import.meta.url);
78
- const __dirname = path.dirname(__filename);
79
- const packageRoot = path.resolve(__dirname, "../..");
107
+ const packageRoot = resolveInstalledPackageRoot();
80
108
  const detected = resolveUpdateManagerFromGlobalRoots({
81
109
  packageRoot,
82
110
  npmRoot: readGlobalRoot("npm") || undefined,
@@ -104,10 +132,11 @@ async function runCommand(command, args) {
104
132
  * update 命令入口。
105
133
  */
106
134
  export async function updateCommand(options = {}) {
135
+ const packageName = detectInstalledPackageName();
107
136
  const manager = options.manager && options.manager !== "auto"
108
137
  ? options.manager
109
138
  : detectInstalledUpdateManager();
110
- const invocation = buildGlobalUpdateInvocation(manager);
139
+ const invocation = buildGlobalUpdateInvocation(manager, packageName);
111
140
  emitCliBlock({
112
141
  tone: "accent",
113
142
  title: "Updating downcity",
@@ -123,7 +152,7 @@ export async function updateCommand(options = {}) {
123
152
  ],
124
153
  });
125
154
  try {
126
- await runWithSpinner(() => runCommand(invocation.command, invocation.args), { text: `Installing ${GLOBAL_PACKAGE_NAME}@latest via ${manager}...` });
155
+ await runWithSpinner(() => runCommand(invocation.command, invocation.args), { text: `Installing ${packageName}@latest via ${manager}...` });
127
156
  }
128
157
  catch (error) {
129
158
  throw new CliError({
@@ -137,7 +166,7 @@ export async function updateCommand(options = {}) {
137
166
  facts: [
138
167
  {
139
168
  label: "Package",
140
- value: `${GLOBAL_PACKAGE_NAME}@latest`,
169
+ value: `${packageName}@latest`,
141
170
  },
142
171
  {
143
172
  label: "Manager",
@@ -1 +1 @@
1
- {"version":3,"file":"Update.js","sourceRoot":"","sources":["../../../src/cli/shared/Update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Update.js","sourceRoot":"","sources":["../../../src/cli/shared/Update.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@downcity/city",
3
- "version": "1.1.23",
3
+ "version": "1.1.24",
4
4
  "type": "module",
5
5
  "description": "Downcity City 平台 — CLI、daemon 管理、Console 网关、能力平台",
6
6
  "bin": {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `city update`:更新全局 downcity CLI。
2
+ * `city update`:更新当前全局安装来源对应的 Downcity CLI。
3
3
  *
4
4
  * 关键点(中文)
5
5
  * - 优先根据当前 CLI 所在的全局模块目录,自动判断是 npm 还是 pnpm 安装。
@@ -27,25 +27,60 @@ export interface UpdateCommandOptions {
27
27
  manager?: UpdateManager | "auto";
28
28
  }
29
29
 
30
- const GLOBAL_PACKAGE_NAME = "downcity";
30
+ const FALLBACK_GLOBAL_PACKAGE_NAME = "downcity";
31
31
 
32
32
  /**
33
- * 构造全局更新命令。
33
+ * 解析当前 CLI 安装包根目录。
34
+ *
35
+ * 关键点(中文)
36
+ * - 开发态路径是 `src/cli/shared`,构建后路径是 `bin/cli/shared`。
37
+ * - 两种目录结构都可以通过回退三级拿到 package 根目录。
38
+ */
39
+ function resolveInstalledPackageRoot(): string {
40
+ const __filename = fileURLToPath(import.meta.url);
41
+ const __dirname = path.dirname(__filename);
42
+ return path.resolve(__dirname, "../../..");
43
+ }
44
+
45
+ /**
46
+ * 读取当前 CLI 实际对应的 npm 包名。
34
47
  */
35
- export function buildGlobalUpdateInvocation(manager: UpdateManager): {
48
+ function readInstalledPackageName(packageRoot: string): string {
49
+ try {
50
+ const packageJsonPath = path.join(packageRoot, "package.json");
51
+ const raw = fs.readFileSync(packageJsonPath, "utf8");
52
+ const parsed = JSON.parse(raw) as { name?: unknown };
53
+ const packageName = typeof parsed.name === "string" ? parsed.name.trim() : "";
54
+ return packageName || FALLBACK_GLOBAL_PACKAGE_NAME;
55
+ } catch {
56
+ return FALLBACK_GLOBAL_PACKAGE_NAME;
57
+ }
58
+ }
59
+
60
+ /**
61
+ * 检测当前 CLI 实际安装来源的包名。
62
+ */
63
+ export function detectInstalledPackageName(): string {
64
+ return readInstalledPackageName(resolveInstalledPackageRoot());
65
+ }
66
+
67
+ export function buildGlobalUpdateInvocation(
68
+ manager: UpdateManager,
69
+ packageName: string,
70
+ ): {
36
71
  command: string;
37
72
  args: string[];
38
73
  } {
39
74
  if (manager === "pnpm") {
40
75
  return {
41
76
  command: "pnpm",
42
- args: ["add", "-g", `${GLOBAL_PACKAGE_NAME}@latest`],
77
+ args: ["add", "-g", `${packageName}@latest`],
43
78
  };
44
79
  }
45
80
 
46
81
  return {
47
82
  command: "npm",
48
- args: ["install", "-g", `${GLOBAL_PACKAGE_NAME}@latest`],
83
+ args: ["install", "-g", `${packageName}@latest`],
49
84
  };
50
85
  }
51
86
 
@@ -98,9 +133,7 @@ function readGlobalRoot(manager: UpdateManager): string | null {
98
133
  * 自动判断当前全局安装使用的包管理器。
99
134
  */
100
135
  export function detectInstalledUpdateManager(): UpdateManager {
101
- const __filename = fileURLToPath(import.meta.url);
102
- const __dirname = path.dirname(__filename);
103
- const packageRoot = path.resolve(__dirname, "../..");
136
+ const packageRoot = resolveInstalledPackageRoot();
104
137
  const detected = resolveUpdateManagerFromGlobalRoots({
105
138
  packageRoot,
106
139
  npmRoot: readGlobalRoot("npm") || undefined,
@@ -132,11 +165,12 @@ async function runCommand(command: string, args: string[]): Promise<void> {
132
165
  export async function updateCommand(
133
166
  options: UpdateCommandOptions = {},
134
167
  ): Promise<void> {
168
+ const packageName = detectInstalledPackageName();
135
169
  const manager =
136
170
  options.manager && options.manager !== "auto"
137
171
  ? options.manager
138
172
  : detectInstalledUpdateManager();
139
- const invocation = buildGlobalUpdateInvocation(manager);
173
+ const invocation = buildGlobalUpdateInvocation(manager, packageName);
140
174
 
141
175
  emitCliBlock({
142
176
  tone: "accent",
@@ -156,7 +190,7 @@ export async function updateCommand(
156
190
  try {
157
191
  await runWithSpinner(
158
192
  () => runCommand(invocation.command, invocation.args),
159
- { text: `Installing ${GLOBAL_PACKAGE_NAME}@latest via ${manager}...` },
193
+ { text: `Installing ${packageName}@latest via ${manager}...` },
160
194
  );
161
195
  } catch (error) {
162
196
  throw new CliError({
@@ -171,7 +205,7 @@ export async function updateCommand(
171
205
  facts: [
172
206
  {
173
207
  label: "Package",
174
- value: `${GLOBAL_PACKAGE_NAME}@latest`,
208
+ value: `${packageName}@latest`,
175
209
  },
176
210
  {
177
211
  label: "Manager",