okit-cli 2.1.0 → 2.1.1

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.
Files changed (73) hide show
  1. package/dist/commands/auth.d.ts +4 -0
  2. package/dist/commands/auth.d.ts.map +1 -0
  3. package/dist/commands/auth.js +134 -0
  4. package/dist/commands/auth.js.map +1 -0
  5. package/dist/commands/check.d.ts +2 -0
  6. package/dist/commands/check.d.ts.map +1 -1
  7. package/dist/commands/check.js +122 -29
  8. package/dist/commands/check.js.map +1 -1
  9. package/dist/commands/menu.d.ts.map +1 -1
  10. package/dist/commands/menu.js +5 -0
  11. package/dist/commands/menu.js.map +1 -1
  12. package/dist/commands/profile.d.ts +18 -0
  13. package/dist/commands/profile.d.ts.map +1 -0
  14. package/dist/commands/profile.js +409 -0
  15. package/dist/commands/profile.js.map +1 -0
  16. package/dist/commands/relay.d.ts +13 -0
  17. package/dist/commands/relay.d.ts.map +1 -0
  18. package/dist/commands/relay.js +208 -0
  19. package/dist/commands/relay.js.map +1 -0
  20. package/dist/commands/repo.js +0 -16
  21. package/dist/commands/repo.js.map +1 -1
  22. package/dist/commands/uninstall.d.ts.map +1 -1
  23. package/dist/commands/uninstall.js +21 -72
  24. package/dist/commands/uninstall.js.map +1 -1
  25. package/dist/commands/upgrade.d.ts +1 -3
  26. package/dist/commands/upgrade.d.ts.map +1 -1
  27. package/dist/commands/upgrade.js +45 -110
  28. package/dist/commands/upgrade.js.map +1 -1
  29. package/dist/commands/vault.d.ts +14 -0
  30. package/dist/commands/vault.d.ts.map +1 -0
  31. package/dist/commands/vault.js +255 -0
  32. package/dist/commands/vault.js.map +1 -0
  33. package/dist/config/i18n.d.ts +71 -0
  34. package/dist/config/i18n.d.ts.map +1 -1
  35. package/dist/config/i18n.js +150 -0
  36. package/dist/config/i18n.js.map +1 -1
  37. package/dist/config/registry.d.ts +14 -6
  38. package/dist/config/registry.d.ts.map +1 -1
  39. package/dist/config/registry.js +638 -68
  40. package/dist/config/registry.js.map +1 -1
  41. package/dist/config/user.d.ts +4 -0
  42. package/dist/config/user.d.ts.map +1 -1
  43. package/dist/config/user.js +1 -0
  44. package/dist/config/user.js.map +1 -1
  45. package/dist/executor/deps/BrewDependencyProvider.d.ts.map +1 -1
  46. package/dist/executor/deps/BrewDependencyProvider.js +4 -2
  47. package/dist/executor/deps/BrewDependencyProvider.js.map +1 -1
  48. package/dist/executor/deps/NpmDependencyProvider.d.ts.map +1 -1
  49. package/dist/executor/deps/NpmDependencyProvider.js +4 -2
  50. package/dist/executor/deps/NpmDependencyProvider.js.map +1 -1
  51. package/dist/executor/deps/PipxDependencyProvider.d.ts.map +1 -1
  52. package/dist/executor/deps/PipxDependencyProvider.js +4 -2
  53. package/dist/executor/deps/PipxDependencyProvider.js.map +1 -1
  54. package/dist/executor/deps/UvToolDependencyProvider.d.ts.map +1 -1
  55. package/dist/executor/deps/UvToolDependencyProvider.js +4 -2
  56. package/dist/executor/deps/UvToolDependencyProvider.js.map +1 -1
  57. package/dist/executor/plan/registryDeps.d.ts.map +1 -1
  58. package/dist/executor/plan/registryDeps.js +13 -5
  59. package/dist/executor/plan/registryDeps.js.map +1 -1
  60. package/dist/executor/runner.d.ts.map +1 -1
  61. package/dist/executor/runner.js +11 -9
  62. package/dist/executor/runner.js.map +1 -1
  63. package/dist/main.js +188 -4
  64. package/dist/main.js.map +1 -1
  65. package/dist/utils/semver.d.ts +12 -0
  66. package/dist/utils/semver.d.ts.map +1 -0
  67. package/dist/utils/semver.js +71 -0
  68. package/dist/utils/semver.js.map +1 -0
  69. package/dist/vault/store.d.ts +51 -0
  70. package/dist/vault/store.d.ts.map +1 -0
  71. package/dist/vault/store.js +260 -0
  72. package/dist/vault/store.js.map +1 -0
  73. package/package.json +8 -3
package/dist/main.js CHANGED
@@ -46,6 +46,10 @@ const upgrade_1 = require("./commands/upgrade");
46
46
  const uninstall_1 = require("./commands/uninstall");
47
47
  const repo_1 = require("./commands/repo");
48
48
  const check_1 = require("./commands/check");
49
+ const auth_1 = require("./commands/auth");
50
+ const relay_1 = require("./commands/relay");
51
+ const vault_1 = require("./commands/vault");
52
+ const profile_1 = require("./commands/profile");
49
53
  const registry_1 = require("./config/registry");
50
54
  const i18n_1 = require("./config/i18n");
51
55
  const user_1 = require("./config/user");
@@ -61,11 +65,11 @@ function showBanner() {
61
65
  ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝
62
66
  `;
63
67
  console.log(kleur_1.default.cyan(banner));
64
- console.log(kleur_1.default.gray(" OKIT v1 - macOS 开发工具管理器\n"));
68
+ console.log(kleur_1.default.gray(` OKIT v${package_json_1.default.version} - macOS 开发工具管理器\n`));
65
69
  }
66
70
  program
67
71
  .name("okit")
68
- .description("OKIT v1 - 精简版工具执行器")
72
+ .description("OKIT - Agent 基础设施管理工具")
69
73
  .version(package_json_1.default.version);
70
74
  function getUnknownSubcommand() {
71
75
  const argv = process.argv.slice(2);
@@ -198,6 +202,185 @@ program
198
202
  await selectLanguageIfNeeded();
199
203
  await (0, check_1.runCheck)({ json: options.json });
200
204
  });
205
+ // profile 子命令
206
+ const profile = program
207
+ .command("profile")
208
+ .description("管理工具 Profile(一键安装预设工具集)")
209
+ .action(async () => {
210
+ checkPlatform();
211
+ await selectLanguageIfNeeded();
212
+ configurePrompts((0, i18n_1.getLanguage)());
213
+ await (0, profile_1.showProfileMenu)();
214
+ });
215
+ profile
216
+ .command("create")
217
+ .description("创建新 Profile")
218
+ .action(async () => {
219
+ checkPlatform();
220
+ await selectLanguageIfNeeded();
221
+ configurePrompts((0, i18n_1.getLanguage)());
222
+ await (0, profile_1.createProfile)();
223
+ });
224
+ profile
225
+ .command("apply [name]")
226
+ .description("应用 Profile(安装所有工具)")
227
+ .action(async (name) => {
228
+ checkPlatform();
229
+ await selectLanguageIfNeeded();
230
+ configurePrompts((0, i18n_1.getLanguage)());
231
+ await (0, profile_1.applyProfile)(name);
232
+ });
233
+ profile
234
+ .command("list")
235
+ .description("列出所有 Profile")
236
+ .action(async () => {
237
+ checkPlatform();
238
+ await selectLanguageIfNeeded();
239
+ await (0, profile_1.showProfiles)();
240
+ });
241
+ profile
242
+ .command("show <name>")
243
+ .description("查看 Profile 详情及安装状态")
244
+ .action(async (name) => {
245
+ checkPlatform();
246
+ await selectLanguageIfNeeded();
247
+ await (0, profile_1.showProfileDetail)(name);
248
+ });
249
+ profile
250
+ .command("delete [name]")
251
+ .description("删除 Profile")
252
+ .action(async (name) => {
253
+ checkPlatform();
254
+ await selectLanguageIfNeeded();
255
+ configurePrompts((0, i18n_1.getLanguage)());
256
+ await (0, profile_1.removeProfile)(name);
257
+ });
258
+ profile
259
+ .command("export [name]")
260
+ .description("导出 Profile 为 JSON 文件")
261
+ .option("-o, --output <path>", "输出路径")
262
+ .action(async (name, options) => {
263
+ checkPlatform();
264
+ await selectLanguageIfNeeded();
265
+ configurePrompts((0, i18n_1.getLanguage)());
266
+ await (0, profile_1.exportProfile)(name, options?.output);
267
+ });
268
+ profile
269
+ .command("import <file>")
270
+ .description("从 JSON 文件导入 Profile")
271
+ .action(async (file) => {
272
+ checkPlatform();
273
+ await selectLanguageIfNeeded();
274
+ configurePrompts((0, i18n_1.getLanguage)());
275
+ await (0, profile_1.importProfile)(file);
276
+ });
277
+ // auth 子命令 - 授权生命周期管理
278
+ program
279
+ .command("auth")
280
+ .description("检查并修复工具授权状态")
281
+ .option("--fix", "尝试自动修复授权问题")
282
+ .action(async (options) => {
283
+ checkPlatform();
284
+ await selectLanguageIfNeeded();
285
+ await (0, auth_1.runAuth)({ fix: options.fix });
286
+ });
287
+ // vault 子命令 - 密钥管理
288
+ const vault = program
289
+ .command("vault")
290
+ .description("密钥管理(加密存储、按需注入、项目关联)")
291
+ .action(async () => {
292
+ await (0, vault_1.vaultList)();
293
+ });
294
+ vault
295
+ .command("set <key> <value>")
296
+ .description("存储密钥(支持 KEY/alias 格式,如 GITHUB_TOKEN/company)")
297
+ .action(async (key, value) => {
298
+ await (0, vault_1.vaultSet)(key, value);
299
+ });
300
+ vault
301
+ .command("get <key>")
302
+ .description("获取密钥明文(支持 KEY/alias 格式)")
303
+ .action(async (key) => {
304
+ await (0, vault_1.vaultGet)(key);
305
+ });
306
+ vault
307
+ .command("list")
308
+ .description("列出所有密钥(脱敏显示)")
309
+ .action(async () => {
310
+ await (0, vault_1.vaultList)();
311
+ });
312
+ vault
313
+ .command("delete <key>")
314
+ .description("删除密钥")
315
+ .action(async (key) => {
316
+ await (0, vault_1.vaultDelete)(key);
317
+ });
318
+ vault
319
+ .command("inject")
320
+ .description("输出 shell export 语句(配合 eval 使用)")
321
+ .option("--keys <keys>", "手动指定 key 列表(逗号分隔)")
322
+ .option("--dir <dir>", "指定项目目录")
323
+ .action(async (options) => {
324
+ await (0, vault_1.vaultInject)(options);
325
+ });
326
+ vault
327
+ .command("env [file]")
328
+ .description("根据 .okitenv 生成 .env 文件并注册关联")
329
+ .option("--dir <dir>", "指定项目目录")
330
+ .action(async (file, options) => {
331
+ await (0, vault_1.vaultEnv)(file, options);
332
+ });
333
+ vault
334
+ .command("where <key>")
335
+ .description("查看密钥在哪些项目中使用")
336
+ .action(async (key) => {
337
+ await (0, vault_1.vaultWhere)(key);
338
+ });
339
+ vault
340
+ .command("sync")
341
+ .description("同步所有关联文件(更新密钥后自动刷新)")
342
+ .action(async () => {
343
+ await (0, vault_1.vaultSync)();
344
+ });
345
+ // relay 子命令 - 中继服务器
346
+ const relay = program
347
+ .command("relay")
348
+ .description("中继服务器(本地服务安全暴露到外网)");
349
+ relay
350
+ .command("config")
351
+ .description("配置中继服务器地址和认证 token")
352
+ .option("--url <url>", "中继服务器 URL")
353
+ .option("--token <token>", "认证 token")
354
+ .action(async (options) => {
355
+ await (0, relay_1.relayConfig)(options);
356
+ });
357
+ relay
358
+ .command("connect")
359
+ .description("连接本地服务到中继")
360
+ .requiredOption("--tunnel <id>", "隧道 ID")
361
+ .requiredOption("--agent <name>", "Agent 名称(用于注册和路由)")
362
+ .option("--target <url>", "本地目标地址", "http://localhost:3000")
363
+ .action(async (options) => {
364
+ await (0, relay_1.relayConnect)(options);
365
+ });
366
+ relay
367
+ .command("status <tunnel>")
368
+ .description("查看隧道状态")
369
+ .action(async (tunnel) => {
370
+ await (0, relay_1.relayStatus)(tunnel);
371
+ });
372
+ relay
373
+ .command("create [tunnel]")
374
+ .description("创建隧道")
375
+ .action(async (tunnel) => {
376
+ await (0, relay_1.relayCreate)(tunnel);
377
+ });
378
+ relay
379
+ .command("agents")
380
+ .description("列出所有在线 Agent")
381
+ .action(async () => {
382
+ await (0, relay_1.relayAgents)();
383
+ });
201
384
  // reset 子命令 - 不需要选择语言
202
385
  program
203
386
  .command("reset")
@@ -228,8 +411,9 @@ program
228
411
  startServer(port);
229
412
  });
230
413
  function checkPlatform() {
231
- if (process.platform !== "darwin") {
232
- console.log(kleur_1.default.red("✗ 当前仅支持 macOS 平台"));
414
+ const supported = ["darwin", "linux"];
415
+ if (!supported.includes(process.platform)) {
416
+ console.log(kleur_1.default.red(`✗ 当前不支持 ${process.platform} 平台 (支持: macOS, Linux)`));
233
417
  process.exit(1);
234
418
  }
235
419
  }
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface SemVer {
2
+ major: number;
3
+ minor: number;
4
+ patch: number;
5
+ raw: string;
6
+ }
7
+ export type UpgradeLevel = "patch" | "minor" | "major" | "unknown";
8
+ export declare function parseSemVer(raw: string): SemVer | null;
9
+ export declare function compareVersions(current: SemVer, available: SemVer): UpgradeLevel;
10
+ export declare function upgradeLevelLabel(level: UpgradeLevel, lang?: "zh" | "en"): string;
11
+ export declare function upgradeAdvice(level: UpgradeLevel, lang?: "zh" | "en"): string;
12
+ //# sourceMappingURL=semver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semver.d.ts","sourceRoot":"","sources":["../../src/utils/semver.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;AAQnE,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWtD;AAGD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,YAAY,CAShF;AAGD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,GAAE,IAAI,GAAG,IAAW,GAAG,MAAM,CAQvF;AAGD,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,GAAE,IAAI,GAAG,IAAW,GAAG,MAAM,CAoBnF"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseSemVer = parseSemVer;
4
+ exports.compareVersions = compareVersions;
5
+ exports.upgradeLevelLabel = upgradeLevelLabel;
6
+ exports.upgradeAdvice = upgradeAdvice;
7
+ // 从杂乱的版本字符串中提取 semver
8
+ // 例: "git version 2.50.1 (Apple Git-155)" → { major: 2, minor: 50, patch: 1 }
9
+ // 例: "v24.13.0" → { major: 24, minor: 13, patch: 0 }
10
+ // 例: "Homebrew 5.1.3" → { major: 5, minor: 1, patch: 3 }
11
+ // 例: "0.67.0 (Homebrew)" → { major: 0, minor: 67, patch: 0 }
12
+ // 例: "8.0.1" → { major: 8, minor: 0, patch: 1 }
13
+ function parseSemVer(raw) {
14
+ if (!raw)
15
+ return null;
16
+ // 匹配 x.y.z 或 x.y 格式的版本号
17
+ const match = raw.match(/(\d+)\.(\d+)(?:\.(\d+))?/);
18
+ if (!match)
19
+ return null;
20
+ return {
21
+ major: parseInt(match[1], 10),
22
+ minor: parseInt(match[2], 10),
23
+ patch: match[3] !== undefined ? parseInt(match[3], 10) : 0,
24
+ raw,
25
+ };
26
+ }
27
+ // 比较两个版本,返回升级级别
28
+ function compareVersions(current, available) {
29
+ if (available.major > current.major)
30
+ return "major";
31
+ if (available.major === current.major && available.minor > current.minor)
32
+ return "minor";
33
+ if (available.major === current.major &&
34
+ available.minor === current.minor &&
35
+ available.patch > current.patch)
36
+ return "patch";
37
+ return "unknown";
38
+ }
39
+ // 获取升级级别的风险描述
40
+ function upgradeLevelLabel(level, lang = "zh") {
41
+ const labels = {
42
+ patch: { zh: "补丁", en: "patch" },
43
+ minor: { zh: "次版本", en: "minor" },
44
+ major: { zh: "主版本", en: "major" },
45
+ unknown: { zh: "未知", en: "unknown" },
46
+ };
47
+ return labels[level][lang] || labels[level].en;
48
+ }
49
+ // 获取升级建议
50
+ function upgradeAdvice(level, lang = "zh") {
51
+ const advice = {
52
+ patch: {
53
+ zh: "安全升级,建议自动执行",
54
+ en: "Safe to auto-upgrade",
55
+ },
56
+ minor: {
57
+ zh: "一般安全,建议检查 changelog",
58
+ en: "Generally safe, check changelog",
59
+ },
60
+ major: {
61
+ zh: "可能有 breaking changes,需评估影响",
62
+ en: "May have breaking changes, assess impact",
63
+ },
64
+ unknown: {
65
+ zh: "无法判断,建议手动检查",
66
+ en: "Cannot determine, check manually",
67
+ },
68
+ };
69
+ return advice[level][lang] || advice[level].en;
70
+ }
71
+ //# sourceMappingURL=semver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semver.js","sourceRoot":"","sources":["../../src/utils/semver.ts"],"names":[],"mappings":";;AAeA,kCAWC;AAGD,0CASC;AAGD,8CAQC;AAGD,sCAoBC;AA/DD,sBAAsB;AACtB,8EAA8E;AAC9E,qDAAqD;AACrD,yDAAyD;AACzD,6DAA6D;AAC7D,gDAAgD;AAChD,SAAgB,WAAW,CAAC,GAAW;IACrC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,wBAAwB;IACxB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACpD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO;QACL,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC7B,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC7B,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,GAAG;KACJ,CAAC;AACJ,CAAC;AAED,gBAAgB;AAChB,SAAgB,eAAe,CAAC,OAAe,EAAE,SAAiB;IAChE,IAAI,SAAS,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK;QAAE,OAAO,OAAO,CAAC;IACpD,IAAI,SAAS,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK;QAAE,OAAO,OAAO,CAAC;IACzF,IACE,SAAS,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK;QACjC,SAAS,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK;QACjC,SAAS,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK;QAC/B,OAAO,OAAO,CAAC;IACjB,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,cAAc;AACd,SAAgB,iBAAiB,CAAC,KAAmB,EAAE,OAAoB,IAAI;IAC7E,MAAM,MAAM,GAAiD;QAC3D,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE;QAChC,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE;QACjC,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE;QACjC,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE;KACrC,CAAC;IACF,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;AACjD,CAAC;AAED,SAAS;AACT,SAAgB,aAAa,CAAC,KAAmB,EAAE,OAAoB,IAAI;IACzE,MAAM,MAAM,GAAiD;QAC3D,KAAK,EAAE;YACL,EAAE,EAAE,aAAa;YACjB,EAAE,EAAE,sBAAsB;SAC3B;QACD,KAAK,EAAE;YACL,EAAE,EAAE,qBAAqB;YACzB,EAAE,EAAE,iCAAiC;SACtC;QACD,KAAK,EAAE;YACL,EAAE,EAAE,4BAA4B;YAChC,EAAE,EAAE,0CAA0C;SAC/C;QACD,OAAO,EAAE;YACP,EAAE,EAAE,aAAa;YACjB,EAAE,EAAE,kCAAkC;SACvC;KACF,CAAC;IACF,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;AACjD,CAAC"}
@@ -0,0 +1,51 @@
1
+ export interface SecretEntry {
2
+ key: string;
3
+ alias: string;
4
+ value: string;
5
+ createdAt: string;
6
+ updatedAt: string;
7
+ }
8
+ export interface ProjectBinding {
9
+ projectPath: string;
10
+ file: string;
11
+ key: string;
12
+ alias: string;
13
+ envName?: string;
14
+ }
15
+ export interface VaultData {
16
+ secrets: SecretEntry[];
17
+ bindings: ProjectBinding[];
18
+ }
19
+ export declare class VaultStore {
20
+ private key;
21
+ private data;
22
+ constructor();
23
+ private load;
24
+ reload(): Promise<void>;
25
+ private save;
26
+ static parseKeyAlias(input: string): {
27
+ key: string;
28
+ alias: string;
29
+ };
30
+ set(keyAlias: string, value: string): Promise<void>;
31
+ get(keyAlias: string): Promise<string | null>;
32
+ delete(keyAlias: string): Promise<boolean>;
33
+ list(): Promise<Array<{
34
+ key: string;
35
+ alias: string;
36
+ masked: string;
37
+ updatedAt: string;
38
+ }>>;
39
+ getAliases(key: string): Promise<string[]>;
40
+ resolve(key: string, alias?: string): Promise<string | null>;
41
+ addBinding(binding: ProjectBinding): Promise<void>;
42
+ getBindings(keyAlias?: string): Promise<ProjectBinding[]>;
43
+ removeBindingsForProject(projectPath: string): Promise<void>;
44
+ sync(): Promise<Array<{
45
+ file: string;
46
+ key: string;
47
+ success: boolean;
48
+ error?: string;
49
+ }>>;
50
+ }
51
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/vault/store.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAGD,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AA8CD,qBAAa,UAAU;IACrB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,IAAI,CAA0B;;YAOxB,IAAI;IAsBZ,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;YAKf,IAAI;IAalB,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IAQ7D,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBnD,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAO7C,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAc1C,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAWzF,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAM1C,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgB5D,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBlD,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IASzD,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5D,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CA+D9F"}
@@ -0,0 +1,260 @@
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.VaultStore = void 0;
7
+ const fs_extra_1 = __importDefault(require("fs-extra"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const crypto_1 = __importDefault(require("crypto"));
10
+ const os_1 = __importDefault(require("os"));
11
+ const registry_1 = require("../config/registry");
12
+ const VAULT_DIR = path_1.default.join(registry_1.OKIT_DIR, "vault");
13
+ const SECRETS_FILE = path_1.default.join(VAULT_DIR, "secrets.enc");
14
+ const MASTER_KEY_FILE = path_1.default.join(VAULT_DIR, "master.key");
15
+ const REGISTRY_FILE = path_1.default.join(VAULT_DIR, "registry.json");
16
+ const ALGORITHM = "aes-256-gcm";
17
+ const KEY_LENGTH = 32;
18
+ const IV_LENGTH = 16;
19
+ const TAG_LENGTH = 16;
20
+ // Derive encryption key from machine fingerprint
21
+ function deriveMasterKey() {
22
+ const fp = path_1.default.join(VAULT_DIR, "master.key");
23
+ if (fs_extra_1.default.existsSync(fp)) {
24
+ return Buffer.from(fs_extra_1.default.readFileSync(fp, "utf-8"), "hex");
25
+ }
26
+ // Generate from machine identity
27
+ const identity = `${os_1.default.hostname()}:${os_1.default.userInfo().username}:okit-vault`;
28
+ const key = crypto_1.default.pbkdf2Sync(identity, "okit-vault-salt", 100000, KEY_LENGTH, "sha256");
29
+ fs_extra_1.default.ensureDirSync(VAULT_DIR);
30
+ fs_extra_1.default.writeFileSync(fp, key.toString("hex"), { mode: 0o600 });
31
+ return key;
32
+ }
33
+ function encrypt(plaintext, key) {
34
+ const iv = crypto_1.default.randomBytes(IV_LENGTH);
35
+ const cipher = crypto_1.default.createCipheriv(ALGORITHM, key, iv);
36
+ let encrypted = cipher.update(plaintext, "utf8");
37
+ encrypted = Buffer.concat([encrypted, cipher.final()]);
38
+ const tag = cipher.getAuthTag();
39
+ // Format: iv:tag:ciphertext (all hex)
40
+ return `${iv.toString("hex")}:${tag.toString("hex")}:${encrypted.toString("hex")}`;
41
+ }
42
+ function decrypt(data, key) {
43
+ const parts = data.split(":");
44
+ if (parts.length !== 3)
45
+ throw new Error("Invalid encrypted data format");
46
+ const iv = Buffer.from(parts[0], "hex");
47
+ const tag = Buffer.from(parts[1], "hex");
48
+ const encrypted = Buffer.from(parts[2], "hex");
49
+ const decipher = crypto_1.default.createDecipheriv(ALGORITHM, key, iv);
50
+ decipher.setAuthTag(tag);
51
+ let decrypted = decipher.update(encrypted);
52
+ decrypted = Buffer.concat([decrypted, decipher.final()]);
53
+ return decrypted.toString("utf8");
54
+ }
55
+ function maskValue(value) {
56
+ if (value.length <= 6)
57
+ return "***";
58
+ return value.slice(0, 3) + "***" + value.slice(-3);
59
+ }
60
+ class VaultStore {
61
+ constructor() {
62
+ this.data = null;
63
+ fs_extra_1.default.ensureDirSync(VAULT_DIR);
64
+ this.key = deriveMasterKey();
65
+ }
66
+ async load() {
67
+ if (this.data)
68
+ return this.data;
69
+ let secrets = [];
70
+ let bindings = [];
71
+ if (await fs_extra_1.default.pathExists(SECRETS_FILE)) {
72
+ const raw = await fs_extra_1.default.readFile(SECRETS_FILE, "utf-8");
73
+ const decrypted = decrypt(raw, this.key);
74
+ secrets = JSON.parse(decrypted);
75
+ }
76
+ if (await fs_extra_1.default.pathExists(REGISTRY_FILE)) {
77
+ const reg = await fs_extra_1.default.readFile(REGISTRY_FILE, "utf-8");
78
+ bindings = JSON.parse(reg);
79
+ }
80
+ this.data = { secrets, bindings };
81
+ return this.data;
82
+ }
83
+ async reload() {
84
+ this.data = null;
85
+ await this.load();
86
+ }
87
+ async save() {
88
+ if (!this.data)
89
+ return;
90
+ // Encrypt secrets
91
+ const secretsJson = JSON.stringify(this.data.secrets);
92
+ const encrypted = encrypt(secretsJson, this.key);
93
+ await fs_extra_1.default.writeFile(SECRETS_FILE, encrypted, { mode: 0o600 });
94
+ // Save bindings separately (unencrypted, just paths)
95
+ await fs_extra_1.default.writeFile(REGISTRY_FILE, JSON.stringify(this.data.bindings, null, 2));
96
+ }
97
+ // Parse "KEY/alias" format, default alias is "default"
98
+ static parseKeyAlias(input) {
99
+ const slashIdx = input.indexOf("/");
100
+ if (slashIdx === -1) {
101
+ return { key: input, alias: "default" };
102
+ }
103
+ return { key: input.slice(0, slashIdx), alias: input.slice(slashIdx + 1) };
104
+ }
105
+ async set(keyAlias, value) {
106
+ const { key, alias } = VaultStore.parseKeyAlias(keyAlias);
107
+ const data = await this.load();
108
+ const now = new Date().toISOString();
109
+ const existing = data.secrets.find((s) => s.key === key && s.alias === alias);
110
+ if (existing) {
111
+ existing.value = value;
112
+ existing.updatedAt = now;
113
+ }
114
+ else {
115
+ data.secrets.push({ key, alias, value, createdAt: now, updatedAt: now });
116
+ }
117
+ await this.save();
118
+ }
119
+ async get(keyAlias) {
120
+ const { key, alias } = VaultStore.parseKeyAlias(keyAlias);
121
+ const data = await this.load();
122
+ const entry = data.secrets.find((s) => s.key === key && s.alias === alias);
123
+ return entry?.value ?? null;
124
+ }
125
+ async delete(keyAlias) {
126
+ const { key, alias } = VaultStore.parseKeyAlias(keyAlias);
127
+ const data = await this.load();
128
+ const idx = data.secrets.findIndex((s) => s.key === key && s.alias === alias);
129
+ if (idx === -1)
130
+ return false;
131
+ data.secrets.splice(idx, 1);
132
+ // Remove related bindings
133
+ data.bindings = data.bindings.filter((b) => !(b.key === key && b.alias === alias));
134
+ await this.save();
135
+ return true;
136
+ }
137
+ async list() {
138
+ const data = await this.load();
139
+ return data.secrets.map((s) => ({
140
+ key: s.key,
141
+ alias: s.alias,
142
+ masked: maskValue(s.value),
143
+ updatedAt: s.updatedAt,
144
+ }));
145
+ }
146
+ // Get all aliases for a key
147
+ async getAliases(key) {
148
+ const data = await this.load();
149
+ return data.secrets.filter((s) => s.key === key).map((s) => s.alias);
150
+ }
151
+ // Resolve a key for a project: look up .okitenv mapping, fall back to "default"
152
+ async resolve(key, alias) {
153
+ const data = await this.load();
154
+ const targetAlias = alias || "default";
155
+ const entry = data.secrets.find((s) => s.key === key && s.alias === targetAlias);
156
+ if (entry)
157
+ return entry.value;
158
+ // Fall back to default if specific alias not found
159
+ if (targetAlias !== "default") {
160
+ const def = data.secrets.find((s) => s.key === key && s.alias === "default");
161
+ return def?.value ?? null;
162
+ }
163
+ // Fall back to first available alias
164
+ const any = data.secrets.find((s) => s.key === key);
165
+ return any?.value ?? null;
166
+ }
167
+ // Project binding management
168
+ async addBinding(binding) {
169
+ const data = await this.load();
170
+ // Deduplicate by project + file + envName
171
+ const targetEnvName = binding.envName || binding.key;
172
+ const exists = data.bindings.find((b) => b.projectPath === binding.projectPath &&
173
+ b.file === binding.file &&
174
+ (b.envName || b.key) === targetEnvName);
175
+ if (exists) {
176
+ exists.key = binding.key;
177
+ exists.alias = binding.alias;
178
+ exists.envName = binding.envName;
179
+ }
180
+ else {
181
+ data.bindings.push(binding);
182
+ }
183
+ await this.save();
184
+ }
185
+ async getBindings(keyAlias) {
186
+ const data = await this.load();
187
+ if (!keyAlias)
188
+ return data.bindings;
189
+ const { key, alias } = VaultStore.parseKeyAlias(keyAlias);
190
+ return data.bindings.filter((b) => b.key === key && (alias === "default" || b.alias === alias));
191
+ }
192
+ async removeBindingsForProject(projectPath) {
193
+ const data = await this.load();
194
+ data.bindings = data.bindings.filter((b) => b.projectPath !== projectPath);
195
+ await this.save();
196
+ }
197
+ // Sync: update all bound files with current secret values
198
+ async sync() {
199
+ const data = await this.load();
200
+ const results = [];
201
+ // Group bindings by target file
202
+ const fileMap = new Map();
203
+ for (const b of data.bindings) {
204
+ const fullPath = path_1.default.join(b.projectPath, b.file);
205
+ const existing = fileMap.get(fullPath) || [];
206
+ existing.push(b);
207
+ fileMap.set(fullPath, existing);
208
+ }
209
+ for (const [filePath, bindings] of fileMap) {
210
+ try {
211
+ // Read existing file or start empty
212
+ let content = "";
213
+ if (await fs_extra_1.default.pathExists(filePath)) {
214
+ content = await fs_extra_1.default.readFile(filePath, "utf-8");
215
+ }
216
+ for (const binding of bindings) {
217
+ const value = await this.resolve(binding.key, binding.alias);
218
+ if (value === null) {
219
+ results.push({
220
+ file: filePath,
221
+ key: binding.envName || binding.key,
222
+ success: false,
223
+ error: "Secret not found in vault",
224
+ });
225
+ continue;
226
+ }
227
+ // Use envName if set, otherwise vault key
228
+ const envKey = binding.envName || binding.key;
229
+ const regex = new RegExp(`^${escapeRegex(envKey)}=.*$`, "m");
230
+ const newLine = `${envKey}=${value}`;
231
+ if (regex.test(content)) {
232
+ content = content.replace(regex, newLine);
233
+ }
234
+ else {
235
+ content = content.trimEnd() + (content.length > 0 ? "\n" : "") + newLine + "\n";
236
+ }
237
+ results.push({ file: filePath, key: binding.key, success: true });
238
+ }
239
+ await fs_extra_1.default.ensureDir(path_1.default.dirname(filePath));
240
+ await fs_extra_1.default.writeFile(filePath, content);
241
+ }
242
+ catch (err) {
243
+ for (const binding of bindings) {
244
+ results.push({
245
+ file: filePath,
246
+ key: binding.key,
247
+ success: false,
248
+ error: err.message,
249
+ });
250
+ }
251
+ }
252
+ }
253
+ return results;
254
+ }
255
+ }
256
+ exports.VaultStore = VaultStore;
257
+ function escapeRegex(str) {
258
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
259
+ }
260
+ //# sourceMappingURL=store.js.map