ai-pack-cli 1.0.0

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/CHANGELOG.md ADDED
@@ -0,0 +1,93 @@
1
+ # Changelog
2
+
3
+ 本文件遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/),版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
4
+
5
+ ## [1.0.0](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/compare/v0.1.22...v1.0.0) (2026-06-04)
6
+
7
+
8
+ ### Changed
9
+
10
+ * **release:** 0.1.22 ([d59bcdf](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/commit/d59bcdf9a04e923eacabdaad3d81b733ae19196f))
11
+
12
+
13
+ ### Added
14
+
15
+ * **ligang:** 添加静默更新功能并切换发布源至 npm 官方仓库 ([09c38a7](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/commit/09c38a72d64a68160d1057e93699ca0f8e68d5c2))
16
+ * **ligang:** 新增 silent-update 子命令及按月分目录日志记录 ([883a3d7](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/commit/883a3d7f1b7cae1432d1bef890365fcb7473dd49))
17
+
18
+ ### [0.1.22](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/compare/v0.1.21...v0.1.22) (2026-06-04)
19
+
20
+ ### [0.1.21](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/compare/v0.1.20...v0.1.21) (2026-06-04)
21
+
22
+ ### [0.1.20](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/compare/v0.1.17...v0.1.20) (2026-06-03)
23
+
24
+
25
+ ### Added
26
+
27
+ * **ligang:** 重构安装流程由 CLI 在 Node 进程内直接执行,不再依赖 install.sh ([29496f1](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/commit/29496f1e902df7a2e50b4191cfe204b4d212939b))
28
+
29
+ ### [0.1.19](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/compare/v0.1.17...v0.1.19) (2026-06-03)
30
+
31
+
32
+ ### Added
33
+
34
+ * **ligang:** 重构安装流程由 CLI 在 Node 进程内直接执行,不再依赖 install.sh ([29496f1](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/commit/29496f1e902df7a2e50b4191cfe204b4d212939b))
35
+
36
+ ### [0.1.18](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/compare/v0.1.17...v0.1.18) (2026-06-03)
37
+
38
+
39
+ ### Added
40
+
41
+ * **ligang:** 重构安装流程由 CLI 在 Node 进程内直接执行,不再依赖 install.sh ([29496f1](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/commit/29496f1e902df7a2e50b4191cfe204b4d212939b))
42
+
43
+ ### [0.1.17](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/compare/v0.1.16...v0.1.17) (2026-06-03)
44
+
45
+ ### [0.1.16](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/compare/v0.1.15...v0.1.16) (2026-06-03)
46
+
47
+ ### [0.1.15](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/compare/v0.1.14...v0.1.15) (2026-06-03)
48
+
49
+ ### [0.1.14](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/compare/v0.1.13...v0.1.14) (2026-06-02)
50
+
51
+ ### [0.1.13](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/compare/v0.1.12...v0.1.13) (2026-06-02)
52
+
53
+ ### [0.1.12](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/compare/v0.1.11...v0.1.12) (2026-06-02)
54
+
55
+ ### [0.1.11](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/compare/v0.1.10...v0.1.11) (2026-06-02)
56
+
57
+ ### [0.1.10](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/compare/v0.1.9...v0.1.10) (2026-06-02)
58
+
59
+ ### [0.1.9](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/compare/v0.1.8...v0.1.9) (2026-06-02)
60
+
61
+ ### [0.1.8](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/compare/v0.1.7...v0.1.8) (2026-06-02)
62
+
63
+ ### [0.1.7](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/compare/v0.1.6...v0.1.7) (2026-06-02)
64
+
65
+ ### [0.1.6](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/compare/v0.1.5...v0.1.6) (2026-06-02)
66
+
67
+ ### [0.1.5](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/compare/v0.1.4...v0.1.5) (2026-06-02)
68
+
69
+ ### [0.1.4](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/compare/v0.1.3...v0.1.4) (2026-06-02)
70
+
71
+ ### [0.1.3](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/compare/v0.1.2...v0.1.3) (2026-06-02)
72
+
73
+ ### [0.1.2](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/compare/v0.1.1...v0.1.2) (2026-06-01)
74
+
75
+
76
+ ### Added
77
+
78
+ * **ligang:** 重构 CLI 架构以支持 Node 10+ 并统一安装流程 ([a53e1ba](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/commit/a53e1ba5a7c88a43048eb5741fa1a457bf796eb2))
79
+
80
+ ### 0.1.1 (2026-06-01)
81
+
82
+
83
+ ### Fixed
84
+
85
+ * **ligang:** 初始化项目结构与核心功能 ([97dd600](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/commit/97dd600489df6732925ed29910b6052811346769))
86
+
87
+ ## [0.1.0] - 2026-05-29
88
+
89
+ ### Added
90
+
91
+ - monorepo 结构(`shared` / `core` / `cli`)
92
+ - `npx ai-pack-cli` 默认安装与 `init` 交互式安装
93
+ - 克隆 ai-pack 仓库并调用 `install.sh` / `install.ps1`
package/README.md ADDED
@@ -0,0 +1,52 @@
1
+ # ai-pack-cli
2
+
3
+ 通过 `npx` 把 AI Pack 安装到当前项目目录。
4
+
5
+ ## 使用逻辑
6
+
7
+ - 默认执行:读取 `~/.config/ai-pack/ai-pack.json` 中的 `role`
8
+ - 如果没有有效 `role`:交互选择角色并写回配置文件
9
+ - 然后选择要安装的 IDE 目录
10
+ - 安装完成后按角色和所选 IDE 写入对应配置
11
+
12
+ ## 安装命令
13
+
14
+ ```bash
15
+ npx ai-pack-cli
16
+ npx ai-pack-cli backend
17
+ npx ai-pack-cli frontend
18
+ npx ai-pack-cli testing
19
+ ```
20
+
21
+ 也可以使用参数形式:
22
+
23
+ ```bash
24
+ npx ai-pack-cli -r backend
25
+ ```
26
+
27
+ ## npx 版本说明
28
+
29
+ - `npx -y` 需要 `npm >= 5.5.0`
30
+ - 低于 `5.5.0` 时,`npx -y` 会直接报错
31
+ - 为了兼容低版本 npm,文档示例默认不带 `-y`
32
+
33
+ ## 环境要求
34
+
35
+ - Node.js `>= 10`
36
+ - Python `>= 3.8`
37
+ - Git 已安装并在 `PATH` 中
38
+
39
+ ## 更新日志
40
+
41
+ <!-- CHANGELOG:START -->
42
+
43
+ ### [1.0.0]
44
+
45
+ ### Changed
46
+ * **release:** 0.1.22 ([d59bcdf](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/commit/d59bcdf9a04e923eacabdaad3d81b733ae19196f))
47
+
48
+ ### Added
49
+ * **ligang:** 添加静默更新功能并切换发布源至 npm 官方仓库 ([09c38a7](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/commit/09c38a72d64a68160d1057e93699ca0f8e68d5c2))
50
+ * **ligang:** 新增 silent-update 子命令及按月分目录日志记录 ([883a3d7](http://10.96.105.158/gitlab/ZhiHuiNongShang/XinFaDi/base-framework/project-initializer/ai-pack-cli/commit/883a3d7f1b7cae1432d1bef890365fcb7473dd49))
51
+
52
+ <!-- CHANGELOG:END -->
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+
4
+ const chalk = require("chalk");
5
+ const { runCli } = require("../dist/cli.js");
6
+
7
+ runCli(process.argv).catch((err) => {
8
+ console.error(chalk.red(err.message || String(err)));
9
+ process.exit(1);
10
+ });
package/bin/backend.js ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+
4
+ require("./run-role.js").runRole("backend");
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+
4
+ require("./run-role.js").runRole("frontend");
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+
4
+ const chalk = require("chalk");
5
+ const { runDefaultInstall } = require("../dist/commands/default.js");
6
+
7
+ /**
8
+ * 供 backend / frontend / testing 等角色 bin 入口复用。
9
+ * 旧版 npx(Node 10)会把 `npx ai-pack-cli backend` 解析为执行包内 backend 命令。
10
+ */
11
+ function runRole(role) {
12
+ runDefaultInstall(role).catch((err) => {
13
+ console.error(chalk.red(err.message || String(err)));
14
+ process.exit(1);
15
+ });
16
+ }
17
+
18
+ module.exports = { runRole };
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+
4
+ const chalk = require("chalk");
5
+ const { runSilentUpdate } = require("../dist/commands/silent-update.js");
6
+
7
+ runSilentUpdate().catch((err) => {
8
+ console.error(chalk.red(err.message || String(err)));
9
+ process.exit(1);
10
+ });
package/bin/testing.js ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+
4
+ require("./run-role.js").runRole("testing");
package/dist/cli.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ export interface ParsedArgs {
2
+ roleArg?: string;
3
+ showVersion: boolean;
4
+ showHelp: boolean;
5
+ command?: "install" | "silent-update";
6
+ }
7
+ export declare function parseCliArgs(argv: string[]): ParsedArgs;
8
+ export declare function getHelpText(): string;
9
+ export declare function getCliBannerText(): string;
10
+ export declare function buildLocalAgentConfigSummary(targetDir: string): string;
11
+ export declare function runCli(argv?: string[]): Promise<void>;
12
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,SAAS,GAAG,eAAe,CAAC;CACvC;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAmDvD;AAED,wBAAgB,WAAW,IAAI,MAAM,CAmBpC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAQD,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAuBtE;AAED,wBAAsB,MAAM,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBzE"}
package/dist/cli.js ADDED
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.parseCliArgs = parseCliArgs;
7
+ exports.getHelpText = getHelpText;
8
+ exports.getCliBannerText = getCliBannerText;
9
+ exports.buildLocalAgentConfigSummary = buildLocalAgentConfigSummary;
10
+ exports.runCli = runCli;
11
+ const fs_1 = require("fs");
12
+ const chalk_1 = __importDefault(require("chalk"));
13
+ const path_1 = require("path");
14
+ const shared_1 = require("@ai-pack-cli/shared");
15
+ const default_1 = require("./commands/default");
16
+ const silent_update_1 = require("./commands/silent-update");
17
+ function readVersion() {
18
+ var _a;
19
+ try {
20
+ const pkgPath = (0, path_1.join)(__dirname, "..", "package.json");
21
+ const pkg = JSON.parse((0, fs_1.readFileSync)(pkgPath, "utf-8"));
22
+ return (_a = pkg.version) !== null && _a !== void 0 ? _a : "0.0.0";
23
+ }
24
+ catch (_b) {
25
+ return "0.0.0";
26
+ }
27
+ }
28
+ function parseCliArgs(argv) {
29
+ const args = argv.slice(2);
30
+ let roleFromOption;
31
+ let roleFromArg;
32
+ let showVersion = false;
33
+ let showHelp = false;
34
+ let command = "install";
35
+ for (let i = 0; i < args.length; i += 1) {
36
+ const current = args[i];
37
+ if (current === "-v" || current === "--version") {
38
+ showVersion = true;
39
+ continue;
40
+ }
41
+ if (current === "-h" || current === "--help") {
42
+ showHelp = true;
43
+ continue;
44
+ }
45
+ if (current === "silent-update") {
46
+ command = "silent-update";
47
+ continue;
48
+ }
49
+ if (current === "-r" || current === "--role") {
50
+ const next = args[i + 1];
51
+ if (next && !next.startsWith("-")) {
52
+ roleFromOption = next;
53
+ i += 1;
54
+ }
55
+ else {
56
+ throw new Error("Missing value for --role. Expected backend | frontend | testing.");
57
+ }
58
+ continue;
59
+ }
60
+ if (!current.startsWith("-") && !roleFromArg) {
61
+ roleFromArg = current;
62
+ continue;
63
+ }
64
+ throw new Error(`Unsupported argument: ${current}`);
65
+ }
66
+ return {
67
+ command,
68
+ roleArg: roleFromOption !== null && roleFromOption !== void 0 ? roleFromOption : roleFromArg,
69
+ showVersion,
70
+ showHelp,
71
+ };
72
+ }
73
+ function getHelpText() {
74
+ return [
75
+ chalk_1.default.bold.cyan("ai-pack-cli"),
76
+ "",
77
+ chalk_1.default.gray("Install AI Pack into the current project directory."),
78
+ "",
79
+ chalk_1.default.yellow("Usage:"),
80
+ " ai-pack-cli [role] [options]",
81
+ " ai-pack-cli silent-update",
82
+ "",
83
+ chalk_1.default.yellow("Arguments:"),
84
+ " role backend | frontend | testing",
85
+ "",
86
+ chalk_1.default.yellow("Options:"),
87
+ " -r, --role <role> Set install role",
88
+ " -v, --version Show version",
89
+ " -h, --help Show help",
90
+ "",
91
+ ].join("\n");
92
+ }
93
+ function getCliBannerText() {
94
+ return "AI Pack CLI";
95
+ }
96
+ function renderCliBannerText() {
97
+ const accent = chalk_1.default.hex("#38bdf8");
98
+ const glow = chalk_1.default.hex("#f59e0b");
99
+ return `${accent("╭──────")} ${chalk_1.default.bold.white(getCliBannerText())} ${glow("✦")} ${accent("──────╮")}\n`;
100
+ }
101
+ function buildLocalAgentConfigSummary(targetDir) {
102
+ const lines = ["本地 AI Pack 配置概览"];
103
+ const envRole = (0, shared_1.parseRole)(process.env.AI_PACK_ROLE);
104
+ const installedRole = (0, shared_1.readInstalledRole)(targetDir);
105
+ const snapshots = (0, shared_1.readAgentConfigSnapshots)(targetDir);
106
+ lines.push(` 环境变量角色: ${envRole !== null && envRole !== void 0 ? envRole : "未设置"}`);
107
+ lines.push(` 已安装角色: ${installedRole !== null && installedRole !== void 0 ? installedRole : "未检测到"}`);
108
+ lines.push(" 已存在 IDE 目录:");
109
+ for (const snapshot of snapshots) {
110
+ if (!snapshot.exists) {
111
+ continue;
112
+ }
113
+ const roleText = snapshot.role ? `,角色: ${snapshot.role}` : "";
114
+ lines.push(` ${snapshot.configDir}${roleText}`);
115
+ }
116
+ if (lines[lines.length - 1] === " 已存在 IDE 目录:") {
117
+ lines.push(" 未检测到");
118
+ }
119
+ return lines.join("\n");
120
+ }
121
+ async function runCli(argv = process.argv) {
122
+ const parsed = parseCliArgs(argv);
123
+ if (parsed.showVersion) {
124
+ console.log(chalk_1.default.green(readVersion()));
125
+ return;
126
+ }
127
+ if (parsed.showHelp) {
128
+ console.log(getHelpText());
129
+ return;
130
+ }
131
+ if (parsed.command === "silent-update") {
132
+ await (0, silent_update_1.runSilentUpdate)();
133
+ return;
134
+ }
135
+ console.log(renderCliBannerText());
136
+ await (0, default_1.runDefaultInstall)(parsed.roleArg);
137
+ }
138
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runDefaultInstall(roleArg?: string): Promise<void>;
2
+ //# sourceMappingURL=default.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default.d.ts","sourceRoot":"","sources":["../../src/commands/default.ts"],"names":[],"mappings":"AA6FA,wBAAsB,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBvE"}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runDefaultInstall = runDefaultInstall;
7
+ const core_1 = require("@ai-pack-cli/core");
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const shared_1 = require("@ai-pack-cli/shared");
10
+ const ides_1 = require("../prompts/ides");
11
+ const role_1 = require("../prompts/role");
12
+ async function promptAndPersistRole(defaultRole) {
13
+ const role = await (0, role_1.promptRoleSelect)(defaultRole);
14
+ (0, shared_1.writeRoleToUserConfig)(role);
15
+ return role;
16
+ }
17
+ function syncRuntimeRole(role) {
18
+ process.env.AI_PACK_ROLE = role;
19
+ }
20
+ async function resolveInstallIdeTypes(targetDir) {
21
+ if (!(0, shared_1.isInteractive)()) {
22
+ throw new Error("安装需要选择 IDE 目录,请在交互终端中运行。");
23
+ }
24
+ const snapshots = (0, shared_1.readAgentConfigSnapshots)(targetDir);
25
+ const preselected = new Set();
26
+ for (const item of snapshots) {
27
+ if (!item.exists) {
28
+ continue;
29
+ }
30
+ const matched = shared_1.INSTALLABLE_IDE_TYPES.find((ide) => ide.dir === item.configDir);
31
+ if (matched) {
32
+ preselected.add(matched.value);
33
+ }
34
+ }
35
+ const selected = await (0, ides_1.promptInstallIdeSelect)([...preselected]);
36
+ process.env.AI_PACK_INSTALL_IDES = selected.join(",");
37
+ return selected;
38
+ }
39
+ async function resolveInstallRole(targetDir, roleArg) {
40
+ var _a;
41
+ const defaults = (0, shared_1.getDefaultConfig)();
42
+ const commandRoleRaw = roleArg === null || roleArg === void 0 ? void 0 : roleArg.trim();
43
+ const commandRole = (0, shared_1.parseRole)(commandRoleRaw);
44
+ const envRole = (0, shared_1.parseRole)(process.env.AI_PACK_ROLE);
45
+ const existingRole = (0, shared_1.readInstalledRole)(targetDir);
46
+ const userConfigRole = (0, shared_1.readRoleFromUserConfig)();
47
+ const fallbackRole = (_a = userConfigRole !== null && userConfigRole !== void 0 ? userConfigRole : existingRole) !== null && _a !== void 0 ? _a : defaults.role;
48
+ if (commandRole) {
49
+ syncRuntimeRole(commandRole);
50
+ (0, shared_1.writeRoleToUserConfig)(commandRole);
51
+ return commandRole;
52
+ }
53
+ if (commandRoleRaw) {
54
+ if (envRole) {
55
+ syncRuntimeRole(envRole);
56
+ (0, shared_1.writeRoleToUserConfig)(envRole);
57
+ return envRole;
58
+ }
59
+ if ((0, shared_1.isInteractive)()) {
60
+ return promptAndPersistRole(fallbackRole);
61
+ }
62
+ throw new Error(`无效角色: ${roleArg},可选值: backend | frontend | testing`);
63
+ }
64
+ if (envRole) {
65
+ syncRuntimeRole(envRole);
66
+ (0, shared_1.writeRoleToUserConfig)(envRole);
67
+ return envRole;
68
+ }
69
+ if ((0, shared_1.isInteractive)()) {
70
+ return promptAndPersistRole(fallbackRole);
71
+ }
72
+ console.log(chalk_1.default.yellow(`非交互环境:使用默认安装配置(role=${fallbackRole}, branch=${defaults.branch})`));
73
+ return fallbackRole;
74
+ }
75
+ async function runDefaultInstall(roleArg) {
76
+ const defaults = (0, shared_1.getDefaultConfig)();
77
+ const targetDir = (0, shared_1.resolveTargetDir)();
78
+ const role = await resolveInstallRole(targetDir, roleArg);
79
+ const installIdeTypes = await resolveInstallIdeTypes(targetDir);
80
+ const ideTypeForManifest = installIdeTypes.includes(defaults.ideType)
81
+ ? defaults.ideType
82
+ : installIdeTypes[0];
83
+ await (0, core_1.installAiPack)({
84
+ targetDir,
85
+ role,
86
+ branch: defaults.branch,
87
+ gitUrl: defaults.gitUrl,
88
+ ideType: ideTypeForManifest,
89
+ installIdeTypes,
90
+ silent: !(0, shared_1.isInteractive)(),
91
+ trigger: "manual",
92
+ });
93
+ }
94
+ //# sourceMappingURL=default.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default.js","sourceRoot":"","sources":["../../src/commands/default.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface SilentUpdateResult {
2
+ projectPath: string;
3
+ success: boolean;
4
+ error?: string;
5
+ duration: number;
6
+ }
7
+ export declare function runSilentUpdate(): Promise<SilentUpdateResult[]>;
8
+ //# sourceMappingURL=silent-update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"silent-update.d.ts","sourceRoot":"","sources":["../../src/commands/silent-update.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA4HrE"}
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runSilentUpdate = runSilentUpdate;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const core_1 = require("@ai-pack-cli/core");
9
+ const shared_1 = require("@ai-pack-cli/shared");
10
+ async function runSilentUpdate() {
11
+ var _a, _b;
12
+ const projects = (0, shared_1.getAllProjects)();
13
+ const results = [];
14
+ const startedAt = new Date().toISOString();
15
+ const startTime = Date.now();
16
+ (0, shared_1.writeSilentUpdateStatus)({
17
+ status: "running",
18
+ totalProjects: projects.length,
19
+ successProjects: 0,
20
+ failedProjects: 0,
21
+ lastRunStartedAt: startedAt,
22
+ });
23
+ if (projects.length === 0) {
24
+ (0, shared_1.writeSilentUpdateStatus)({
25
+ status: "success",
26
+ totalProjects: 0,
27
+ successProjects: 0,
28
+ failedProjects: 0,
29
+ lastRunFinishedAt: new Date().toISOString(),
30
+ });
31
+ (0, shared_1.logSilentUpdate)({
32
+ timestamp: startedAt,
33
+ level: "info",
34
+ message: "未找到已登记的项目,跳过静默更新",
35
+ type: "silent-update",
36
+ result: { total: 0, success: 0, failed: 0 },
37
+ });
38
+ console.log(chalk_1.default.yellow("没有找到已登记的项目"));
39
+ return results;
40
+ }
41
+ const defaults = (0, shared_1.getDefaultConfig)();
42
+ console.log(chalk_1.default.cyan(`找到 ${projects.length} 个项目,开始静默更新`));
43
+ for (const project of projects) {
44
+ const projectPath = project.path;
45
+ const projectStartTime = Date.now();
46
+ const role = (_a = (0, shared_1.readInstalledRole)(projectPath)) !== null && _a !== void 0 ? _a : project.role;
47
+ const detectedIdes = (0, shared_1.readInstalledIdeTypes)(projectPath);
48
+ const installIdeTypes = detectedIdes.length > 0 ? detectedIdes : project.installedIdes;
49
+ (0, shared_1.recordProjectInstallState)({
50
+ targetDir: projectPath,
51
+ role,
52
+ installedIdes: installIdeTypes,
53
+ trigger: "silent-update",
54
+ status: "running",
55
+ });
56
+ try {
57
+ await (0, core_1.installAiPack)({
58
+ targetDir: projectPath,
59
+ role,
60
+ branch: defaults.branch,
61
+ gitUrl: defaults.gitUrl,
62
+ ideType: (_b = installIdeTypes[0]) !== null && _b !== void 0 ? _b : defaults.ideType,
63
+ installIdeTypes,
64
+ silent: true,
65
+ trigger: "silent-update",
66
+ });
67
+ const duration = Date.now() - projectStartTime;
68
+ results.push({ projectPath, success: true, duration });
69
+ console.log(chalk_1.default.green(`更新成功: ${projectPath}`));
70
+ }
71
+ catch (error) {
72
+ const message = error instanceof Error ? error.message : String(error);
73
+ const duration = Date.now() - projectStartTime;
74
+ results.push({ projectPath, success: false, error: message, duration });
75
+ (0, shared_1.recordProjectInstallState)({
76
+ targetDir: projectPath,
77
+ role,
78
+ installedIdes: installIdeTypes,
79
+ trigger: "silent-update",
80
+ status: "failed",
81
+ error: message,
82
+ durationMs: duration,
83
+ });
84
+ console.error(chalk_1.default.red(`更新失败: ${projectPath}`));
85
+ console.error(chalk_1.default.red(`错误信息: ${message}`));
86
+ }
87
+ }
88
+ const successCount = results.filter((item) => item.success).length;
89
+ const failedCount = results.length - successCount;
90
+ const completedAt = new Date().toISOString();
91
+ const totalDuration = Date.now() - startTime;
92
+ const finalStatus = failedCount === 0 ? "success"
93
+ : successCount === 0 ? "failed"
94
+ : "partial";
95
+ (0, shared_1.writeSilentUpdateStatus)({
96
+ status: finalStatus,
97
+ totalProjects: projects.length,
98
+ successProjects: successCount,
99
+ failedProjects: failedCount,
100
+ lastRunFinishedAt: completedAt,
101
+ });
102
+ (0, shared_1.logSilentUpdate)({
103
+ timestamp: completedAt,
104
+ level: finalStatus === "success" ? "success"
105
+ : finalStatus === "partial" ? "warn"
106
+ : "error",
107
+ message: `静默更新完成: 成功 ${successCount} 个,失败 ${failedCount} 个`,
108
+ type: "silent-update",
109
+ result: {
110
+ total: projects.length,
111
+ success: successCount,
112
+ failed: failedCount,
113
+ },
114
+ projects: results.map((item) => ({
115
+ path: item.projectPath,
116
+ status: item.success ? "success" : "error",
117
+ error: item.error,
118
+ duration: item.duration,
119
+ })),
120
+ });
121
+ console.log(chalk_1.default.cyan(`静默更新完成: 成功 ${successCount} 个,失败 ${failedCount} 个,耗时 ${totalDuration}ms`));
122
+ return results;
123
+ }
124
+ //# sourceMappingURL=silent-update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"silent-update.js","sourceRoot":"","sources":["../../src/commands/silent-update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const chalk_1 = __importDefault(require("chalk"));
7
+ const cli_1 = require("./cli");
8
+ (0, cli_1.runCli)().catch((err) => {
9
+ console.error(chalk_1.default.red(err.message || String(err)));
10
+ process.exit(1);
11
+ });
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,kDAA0B;AAC1B,+BAA+B;AAE/B,IAAA,YAAM,GAAE,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;IAC5B,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type InstallableIdeType } from "@ai-pack-cli/shared";
2
+ export declare function promptInstallIdeSelect(preselected?: InstallableIdeType[]): Promise<InstallableIdeType[]>;
3
+ //# sourceMappingURL=ides.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ides.d.ts","sourceRoot":"","sources":["../../src/prompts/ides.ts"],"names":[],"mappings":"AACA,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAErF,wBAAsB,sBAAsB,CAAC,WAAW,GAAE,kBAAkB,EAAO,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAuBlH"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.promptInstallIdeSelect = promptInstallIdeSelect;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ const shared_1 = require("@ai-pack-cli/shared");
9
+ async function promptInstallIdeSelect(preselected = []) {
10
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
11
+ throw new Error("当前终端不支持交互式 IDE 选择。");
12
+ }
13
+ const defaults = new Set(preselected);
14
+ const answers = await inquirer_1.default.prompt([
15
+ {
16
+ type: "checkbox",
17
+ name: "ideTypes",
18
+ message: "选择要安装的 IDE 目录(可多选,至少 1 个)",
19
+ choices: shared_1.INSTALLABLE_IDE_TYPES.map((item) => ({
20
+ name: `${item.label} [${item.dir}]`,
21
+ value: item.value,
22
+ checked: defaults.has(item.value),
23
+ })),
24
+ pageSize: shared_1.INSTALLABLE_IDE_TYPES.length,
25
+ validate: (value) => value.length > 0 ? true : "至少选择 1 个 IDE 目录后再确认。",
26
+ },
27
+ ]);
28
+ return answers.ideTypes;
29
+ }
30
+ //# sourceMappingURL=ides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ides.js","sourceRoot":"","sources":["../../src/prompts/ides.ts"],"names":[],"mappings":";;;;;AAGA,wDAuBC;AA1BD,wDAAgC;AAChC,gDAAqF;AAE9E,KAAK,UAAU,sBAAsB,CAAC,cAAoC,EAAE;IACjF,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAqC;QACxE;YACE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,2BAA2B;YACpC,OAAO,EAAE,8BAAqB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC5C,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,GAAG,GAAG;gBACnC,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;aAClC,CAAC,CAAC;YACH,QAAQ,EAAE,8BAAqB,CAAC,MAAM;YACtC,QAAQ,EAAE,CAAC,KAA2B,EAAE,EAAE,CACxC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,sBAAsB;SACnD;KACF,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC,QAAQ,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type AiPackRole } from "@ai-pack-cli/shared";
2
+ export declare function promptRoleSelect(defaultRole: AiPackRole): Promise<AiPackRole>;
3
+ //# sourceMappingURL=role.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role.d.ts","sourceRoot":"","sources":["../../src/prompts/role.ts"],"names":[],"mappings":"AACA,OAAO,EAAS,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE7D,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAuBnF"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.promptRoleSelect = promptRoleSelect;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ const shared_1 = require("@ai-pack-cli/shared");
9
+ async function promptRoleSelect(defaultRole) {
10
+ const defaultIndex = shared_1.ROLES.findIndex((item) => item.value === defaultRole);
11
+ const resolvedDefaultIndex = defaultIndex >= 0 ? defaultIndex : 0;
12
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
13
+ return shared_1.ROLES[resolvedDefaultIndex].value;
14
+ }
15
+ const answers = await inquirer_1.default.prompt([
16
+ {
17
+ type: "list",
18
+ name: "role",
19
+ message: "选择角色",
20
+ default: shared_1.ROLES[resolvedDefaultIndex].value,
21
+ choices: shared_1.ROLES.map((role) => ({
22
+ name: role.label,
23
+ value: role.value,
24
+ })),
25
+ pageSize: shared_1.ROLES.length,
26
+ },
27
+ ]);
28
+ return answers.role;
29
+ }
30
+ //# sourceMappingURL=role.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role.js","sourceRoot":"","sources":["../../src/prompts/role.ts"],"names":[],"mappings":";;;;;AAGA,4CAuBC;AA1BD,wDAAgC;AAChC,gDAA6D;AAEtD,KAAK,UAAU,gBAAgB,CAAC,WAAuB;IAC5D,MAAM,YAAY,GAAG,cAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC;IAC3E,MAAM,oBAAoB,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAElE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClD,OAAO,cAAK,CAAC,oBAAoB,CAAC,CAAC,KAAK,CAAC;IAC3C,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAuB;QAC1D;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,cAAK,CAAC,oBAAoB,CAAC,CAAC,KAAK;YAC1C,OAAO,EAAE,cAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC5B,IAAI,EAAE,IAAI,CAAC,KAAK;gBAChB,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC,CAAC;YACH,QAAQ,EAAE,cAAK,CAAC,MAAM;SACvB;KACF,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC,IAAI,CAAC;AACtB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "ai-pack-cli",
3
+ "version": "1.0.0",
4
+ "description": "CLI for installing AI Pack into projects",
5
+ "main": "dist/cli.js",
6
+ "bin": {
7
+ "ai-pack-cli": "./bin/ai-pack-cli.js",
8
+ "backend": "./bin/backend.js",
9
+ "frontend": "./bin/frontend.js",
10
+ "testing": "./bin/testing.js",
11
+ "ai-pack-silent-update": "./bin/silent-update.js"
12
+ },
13
+ "keywords": [
14
+ "ai-pack",
15
+ "cli",
16
+ "cursor",
17
+ "scaffold",
18
+ "installer"
19
+ ],
20
+ "author": "",
21
+ "license": "MIT",
22
+ "engines": {
23
+ "node": ">=10"
24
+ },
25
+ "publishConfig": {
26
+ "registry": "https://registry.npmjs.org/",
27
+ "access": "public"
28
+ },
29
+ "files": [
30
+ "bin",
31
+ "dist",
32
+ "README.md",
33
+ "CHANGELOG.md"
34
+ ],
35
+ "dependencies": {
36
+ "chalk": "4.1.2",
37
+ "inquirer": "7.3.3",
38
+ "@ai-pack-cli/core": "1.0.0",
39
+ "@ai-pack-cli/shared": "1.0.0"
40
+ },
41
+ "devDependencies": {
42
+ "@types/inquirer": "7.3.3",
43
+ "@types/node": "^22.13.10",
44
+ "standard-version": "^9.5.0",
45
+ "typescript": "^5.8.2"
46
+ },
47
+ "scripts": {
48
+ "build": "tsc -b tsconfig.json --force",
49
+ "dev": "tsc -p tsconfig.json --watch",
50
+ "typecheck": "tsc -p tsconfig.json --noEmit",
51
+ "release": "standard-version",
52
+ "release:patch": "standard-version --release-as patch",
53
+ "release:minor": "standard-version --release-as minor",
54
+ "release:major": "standard-version --release-as major"
55
+ }
56
+ }