noah-cursor 1.5.9 → 1.5.10

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 (169) hide show
  1. package/README.md +253 -182
  2. package/dist/commands/add.d.ts.map +1 -1
  3. package/dist/commands/add.js +2 -1
  4. package/dist/commands/add.js.map +1 -1
  5. package/dist/commands/analyze.d.ts +3 -0
  6. package/dist/commands/analyze.d.ts.map +1 -0
  7. package/dist/commands/analyze.js +48 -0
  8. package/dist/commands/analyze.js.map +1 -0
  9. package/dist/commands/auth.d.ts +3 -0
  10. package/dist/commands/auth.d.ts.map +1 -0
  11. package/dist/commands/auth.js +67 -0
  12. package/dist/commands/auth.js.map +1 -0
  13. package/dist/commands/bootstrap.d.ts +3 -0
  14. package/dist/commands/bootstrap.d.ts.map +1 -0
  15. package/dist/commands/bootstrap.js +92 -0
  16. package/dist/commands/bootstrap.js.map +1 -0
  17. package/dist/commands/config.d.ts +3 -0
  18. package/dist/commands/config.d.ts.map +1 -0
  19. package/dist/commands/config.js +109 -0
  20. package/dist/commands/config.js.map +1 -0
  21. package/dist/commands/dashboard.d.ts +3 -0
  22. package/dist/commands/dashboard.d.ts.map +1 -0
  23. package/dist/commands/dashboard.js +21 -0
  24. package/dist/commands/dashboard.js.map +1 -0
  25. package/dist/commands/doctor.d.ts.map +1 -1
  26. package/dist/commands/doctor.js +3 -2
  27. package/dist/commands/doctor.js.map +1 -1
  28. package/dist/commands/explain.d.ts +3 -0
  29. package/dist/commands/explain.d.ts.map +1 -0
  30. package/dist/commands/explain.js +27 -0
  31. package/dist/commands/explain.js.map +1 -0
  32. package/dist/commands/favorite.d.ts +3 -0
  33. package/dist/commands/favorite.d.ts.map +1 -0
  34. package/dist/commands/favorite.js +64 -0
  35. package/dist/commands/favorite.js.map +1 -0
  36. package/dist/commands/install.d.ts +3 -0
  37. package/dist/commands/install.d.ts.map +1 -0
  38. package/dist/commands/install.js +83 -0
  39. package/dist/commands/install.js.map +1 -0
  40. package/dist/commands/new.d.ts +3 -0
  41. package/dist/commands/new.d.ts.map +1 -0
  42. package/dist/commands/new.js +27 -0
  43. package/dist/commands/new.js.map +1 -0
  44. package/dist/commands/plugin.d.ts +3 -0
  45. package/dist/commands/plugin.d.ts.map +1 -0
  46. package/dist/commands/plugin.js +39 -0
  47. package/dist/commands/plugin.js.map +1 -0
  48. package/dist/commands/preview.d.ts +3 -0
  49. package/dist/commands/preview.d.ts.map +1 -0
  50. package/dist/commands/preview.js +25 -0
  51. package/dist/commands/preview.js.map +1 -0
  52. package/dist/commands/publish.d.ts +3 -0
  53. package/dist/commands/publish.d.ts.map +1 -0
  54. package/dist/commands/publish.js +22 -0
  55. package/dist/commands/publish.js.map +1 -0
  56. package/dist/commands/recent.d.ts +3 -0
  57. package/dist/commands/recent.d.ts.map +1 -0
  58. package/dist/commands/recent.js +27 -0
  59. package/dist/commands/recent.js.map +1 -0
  60. package/dist/commands/remove.d.ts.map +1 -1
  61. package/dist/commands/remove.js +2 -1
  62. package/dist/commands/remove.js.map +1 -1
  63. package/dist/commands/search.d.ts.map +1 -1
  64. package/dist/commands/search.js +39 -2
  65. package/dist/commands/search.js.map +1 -1
  66. package/dist/commands/try.d.ts +3 -0
  67. package/dist/commands/try.d.ts.map +1 -0
  68. package/dist/commands/try.js +22 -0
  69. package/dist/commands/try.js.map +1 -0
  70. package/dist/commands/undo.d.ts +3 -0
  71. package/dist/commands/undo.d.ts.map +1 -0
  72. package/dist/commands/undo.js +24 -0
  73. package/dist/commands/undo.js.map +1 -0
  74. package/dist/commands/uninstall.d.ts +3 -0
  75. package/dist/commands/uninstall.d.ts.map +1 -0
  76. package/dist/commands/uninstall.js +52 -0
  77. package/dist/commands/uninstall.js.map +1 -0
  78. package/dist/commands/update.d.ts.map +1 -1
  79. package/dist/commands/update.js +2 -1
  80. package/dist/commands/update.js.map +1 -1
  81. package/dist/commands/wizard.d.ts +3 -0
  82. package/dist/commands/wizard.d.ts.map +1 -0
  83. package/dist/commands/wizard.js +61 -0
  84. package/dist/commands/wizard.js.map +1 -0
  85. package/dist/commands/workspace.d.ts +3 -0
  86. package/dist/commands/workspace.d.ts.map +1 -0
  87. package/dist/commands/workspace.js +84 -0
  88. package/dist/commands/workspace.js.map +1 -0
  89. package/dist/constants/ides.d.ts +2 -2
  90. package/dist/constants/ides.d.ts.map +1 -1
  91. package/dist/constants/ides.js +47 -3
  92. package/dist/constants/ides.js.map +1 -1
  93. package/dist/constants/index.d.ts +4 -0
  94. package/dist/constants/index.d.ts.map +1 -1
  95. package/dist/constants/index.js +4 -0
  96. package/dist/constants/index.js.map +1 -1
  97. package/dist/core/program.d.ts.map +1 -1
  98. package/dist/core/program.js +38 -5
  99. package/dist/core/program.js.map +1 -1
  100. package/dist/index.js +36 -1
  101. package/dist/index.js.map +1 -1
  102. package/dist/metadata/user-store.d.ts +16 -0
  103. package/dist/metadata/user-store.d.ts.map +1 -0
  104. package/dist/metadata/user-store.js +99 -0
  105. package/dist/metadata/user-store.js.map +1 -0
  106. package/dist/noah-registry/manifest.json +129 -16
  107. package/dist/services/doctor-service.d.ts.map +1 -1
  108. package/dist/services/doctor-service.js +74 -7
  109. package/dist/services/doctor-service.js.map +1 -1
  110. package/dist/services/ecosystem.d.ts +17 -0
  111. package/dist/services/ecosystem.d.ts.map +1 -0
  112. package/dist/services/ecosystem.js +136 -0
  113. package/dist/services/ecosystem.js.map +1 -0
  114. package/dist/services/extras.d.ts +29 -0
  115. package/dist/services/extras.d.ts.map +1 -0
  116. package/dist/services/extras.js +164 -0
  117. package/dist/services/extras.js.map +1 -0
  118. package/dist/services/install-service.d.ts +12 -0
  119. package/dist/services/install-service.d.ts.map +1 -1
  120. package/dist/services/install-service.js +169 -12
  121. package/dist/services/install-service.js.map +1 -1
  122. package/dist/services/intelligence.d.ts +20 -0
  123. package/dist/services/intelligence.d.ts.map +1 -0
  124. package/dist/services/intelligence.js +146 -0
  125. package/dist/services/intelligence.js.map +1 -0
  126. package/dist/services/lockfile-service.d.ts +7 -0
  127. package/dist/services/lockfile-service.d.ts.map +1 -0
  128. package/dist/services/lockfile-service.js +36 -0
  129. package/dist/services/lockfile-service.js.map +1 -0
  130. package/dist/services/project-awareness.d.ts +12 -0
  131. package/dist/services/project-awareness.d.ts.map +1 -0
  132. package/dist/services/project-awareness.js +200 -0
  133. package/dist/services/project-awareness.js.map +1 -0
  134. package/dist/services/workspace-service.d.ts +49 -0
  135. package/dist/services/workspace-service.d.ts.map +1 -0
  136. package/dist/services/workspace-service.js +92 -0
  137. package/dist/services/workspace-service.js.map +1 -0
  138. package/dist/types/index.d.ts +508 -4
  139. package/dist/types/index.d.ts.map +1 -1
  140. package/dist/types/index.js +72 -0
  141. package/dist/types/index.js.map +1 -1
  142. package/dist/ui/banner.d.ts.map +1 -1
  143. package/dist/ui/banner.js +2 -3
  144. package/dist/ui/banner.js.map +1 -1
  145. package/dist/ui/homeMenu.d.ts +6 -0
  146. package/dist/ui/homeMenu.d.ts.map +1 -0
  147. package/dist/ui/homeMenu.js +72 -0
  148. package/dist/ui/homeMenu.js.map +1 -0
  149. package/dist/ui/preview.d.ts +3 -0
  150. package/dist/ui/preview.d.ts.map +1 -0
  151. package/dist/ui/preview.js +36 -0
  152. package/dist/ui/preview.js.map +1 -0
  153. package/dist/utils/assets.d.ts +7 -0
  154. package/dist/utils/assets.d.ts.map +1 -1
  155. package/dist/utils/assets.js +18 -14
  156. package/dist/utils/assets.js.map +1 -1
  157. package/dist/utils/fuzzy.d.ts +6 -0
  158. package/dist/utils/fuzzy.d.ts.map +1 -0
  159. package/dist/utils/fuzzy.js +51 -0
  160. package/dist/utils/fuzzy.js.map +1 -0
  161. package/dist/utils/registry.d.ts +8 -1
  162. package/dist/utils/registry.d.ts.map +1 -1
  163. package/dist/utils/registry.js +13 -5
  164. package/dist/utils/registry.js.map +1 -1
  165. package/dist/utils/semver.d.ts +11 -0
  166. package/dist/utils/semver.d.ts.map +1 -0
  167. package/dist/utils/semver.js +41 -0
  168. package/dist/utils/semver.js.map +1 -0
  169. package/package.json +6 -4
@@ -0,0 +1,84 @@
1
+ import chalk from "chalk";
2
+ import { createSpinner, handleCommandError, logInfo, logTitle } from "../core/logger.js";
3
+ import { IDE_IDS, WORKSPACE_FILE, parseIdeId } from "../constants/index.js";
4
+ import { initWorkspace, readWorkspace, syncWorkspace, writeWorkspace, } from "../services/workspace-service.js";
5
+ export function registerWorkspaceCommand(program) {
6
+ const workspace = program
7
+ .command("workspace")
8
+ .description("Manage team workspace configuration (noah.config.json)");
9
+ workspace
10
+ .command("init")
11
+ .description(`Create ${WORKSPACE_FILE}`)
12
+ .option("--ide <name>", `Default IDE (${IDE_IDS.join("|")})`, "cursor")
13
+ .option("-v, --verbose", "Verbose output", false)
14
+ .action(async (opts) => {
15
+ try {
16
+ const ide = parseIdeId(opts.ide);
17
+ await initWorkspace({ ide });
18
+ }
19
+ catch (error) {
20
+ handleCommandError(error, opts.verbose);
21
+ }
22
+ });
23
+ workspace
24
+ .command("show")
25
+ .description(`Show ${WORKSPACE_FILE}`)
26
+ .option("-v, --verbose", "Verbose output", false)
27
+ .action(async (opts) => {
28
+ try {
29
+ const config = await readWorkspace();
30
+ if (!config) {
31
+ logInfo(`No ${WORKSPACE_FILE} found. Run \`noah-cursor workspace init\`.`);
32
+ return;
33
+ }
34
+ logTitle(WORKSPACE_FILE);
35
+ console.log(` IDE: ${config.ide ?? "cursor"}`);
36
+ console.log(` Packages (${config.packages.length}):`);
37
+ for (const pkg of config.packages) {
38
+ console.log(` • ${chalk.bold(pkg)}`);
39
+ }
40
+ }
41
+ catch (error) {
42
+ handleCommandError(error, opts.verbose);
43
+ }
44
+ });
45
+ workspace
46
+ .command("add")
47
+ .description("Add a package to the workspace config")
48
+ .argument("<package>", "Package name")
49
+ .option("-v, --verbose", "Verbose output", false)
50
+ .action(async (pkg, opts) => {
51
+ try {
52
+ const config = (await readWorkspace()) ?? { packages: [] };
53
+ if (!config.packages.includes(pkg)) {
54
+ config.packages.push(pkg);
55
+ await writeWorkspace(config);
56
+ }
57
+ logInfo(`Workspace packages: ${config.packages.join(", ")}`);
58
+ }
59
+ catch (error) {
60
+ handleCommandError(error, opts.verbose);
61
+ }
62
+ });
63
+ program
64
+ .command("sync")
65
+ .description(`Install packages from ${WORKSPACE_FILE}`)
66
+ .option("--dry-run", "Show what would be installed", false)
67
+ .option("-y, --yes", "Skip confirmation prompts", false)
68
+ .option("--force", "Overwrite existing assets", true)
69
+ .option("-v, --verbose", "Verbose output", false)
70
+ .action(async (opts) => {
71
+ const spinner = createSpinner("Syncing workspace…");
72
+ try {
73
+ spinner.start();
74
+ const results = await syncWorkspace(opts);
75
+ spinner.stop();
76
+ logTitle(`Synced ${results.filter((r) => !r.skipped).length} asset(s)`);
77
+ }
78
+ catch (error) {
79
+ spinner.stop();
80
+ handleCommandError(error, opts.verbose);
81
+ }
82
+ });
83
+ }
84
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/commands/workspace.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- export declare const IDE_IDS: readonly ["cursor", "windsurf", "claude-code", "continue", "vscode", "cline"];
1
+ export declare const IDE_IDS: readonly ["cursor", "windsurf", "claude-code", "continue", "vscode", "cline", "gemini", "codex", "roo", "aider"];
2
2
  export type IdeId = (typeof IDE_IDS)[number];
3
3
  export declare const DEFAULT_IDE: IdeId;
4
4
  export interface IdeDefinition {
@@ -8,7 +8,7 @@ export interface IdeDefinition {
8
8
  rootDir: string;
9
9
  hint: string;
10
10
  }
11
- /** Supported IDE install targets. Assets land under `{rootDir}/{skills,rules,...}`. */
11
+ /** Supported IDE / AI assistant install targets. */
12
12
  export declare const IDE_DEFINITIONS: readonly IdeDefinition[];
13
13
  export declare function isIdeId(value: string): value is IdeId;
14
14
  export declare function getIdeDefinition(id: IdeId): IdeDefinition;
@@ -1 +1 @@
1
- {"version":3,"file":"ides.d.ts","sourceRoot":"","sources":["../../src/constants/ides.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,+EAOV,CAAC;AAEX,MAAM,MAAM,KAAK,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7C,eAAO,MAAM,WAAW,EAAE,KAAgB,CAAC;AAE3C,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,KAAK,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,uFAAuF;AACvF,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EAqC1C,CAAC;AAEX,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,KAAK,CAErD;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,KAAK,GAAG,aAAa,CAMzD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,GAAE,KAAmB,GAAG,KAAK,CAW1F"}
1
+ {"version":3,"file":"ides.d.ts","sourceRoot":"","sources":["../../src/constants/ides.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,kHAWV,CAAC;AAEX,MAAM,MAAM,KAAK,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7C,eAAO,MAAM,WAAW,EAAE,KAAgB,CAAC;AAE3C,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,KAAK,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,oDAAoD;AACpD,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EA6D1C,CAAC;AAEX,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,KAAK,CAErD;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,KAAK,GAAG,aAAa,CAMzD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,GAAE,KAAmB,GAAG,KAAK,CAyB1F"}
@@ -5,9 +5,13 @@ export const IDE_IDS = [
5
5
  "continue",
6
6
  "vscode",
7
7
  "cline",
8
+ "gemini",
9
+ "codex",
10
+ "roo",
11
+ "aider",
8
12
  ];
9
13
  export const DEFAULT_IDE = "cursor";
10
- /** Supported IDE install targets. Assets land under `{rootDir}/{skills,rules,...}`. */
14
+ /** Supported IDE / AI assistant install targets. */
11
15
  export const IDE_DEFINITIONS = [
12
16
  {
13
17
  id: "cursor",
@@ -45,6 +49,30 @@ export const IDE_DEFINITIONS = [
45
49
  rootDir: ".cline",
46
50
  hint: "Cline rules and prompts under .cline/",
47
51
  },
52
+ {
53
+ id: "gemini",
54
+ name: "Gemini CLI",
55
+ rootDir: ".gemini",
56
+ hint: "Gemini CLI assets under .gemini/",
57
+ },
58
+ {
59
+ id: "codex",
60
+ name: "Codex CLI",
61
+ rootDir: ".codex",
62
+ hint: "Codex CLI assets under .codex/",
63
+ },
64
+ {
65
+ id: "roo",
66
+ name: "Roo Code",
67
+ rootDir: ".roo",
68
+ hint: "Roo Code assets under .roo/",
69
+ },
70
+ {
71
+ id: "aider",
72
+ name: "Aider",
73
+ rootDir: ".aider",
74
+ hint: "Aider conventions under .aider/",
75
+ },
48
76
  ];
49
77
  export function isIdeId(value) {
50
78
  return IDE_IDS.includes(value);
@@ -61,9 +89,25 @@ export function parseIdeId(value, fallback = DEFAULT_IDE) {
61
89
  return fallback;
62
90
  }
63
91
  const normalized = value.trim().toLowerCase();
64
- if (!isIdeId(normalized)) {
92
+ // Aliases from roadmap --target names
93
+ const aliases = {
94
+ claude: "claude-code",
95
+ "claude-code": "claude-code",
96
+ gemini: "gemini",
97
+ codex: "codex",
98
+ continue: "continue",
99
+ windsurf: "windsurf",
100
+ cline: "cline",
101
+ roo: "roo",
102
+ "roo-code": "roo",
103
+ aider: "aider",
104
+ cursor: "cursor",
105
+ vscode: "vscode",
106
+ };
107
+ const mapped = aliases[normalized] ?? normalized;
108
+ if (!isIdeId(mapped)) {
65
109
  throw new Error(`Unknown IDE "${value}". Supported: ${IDE_IDS.join(", ")}`);
66
110
  }
67
- return normalized;
111
+ return mapped;
68
112
  }
69
113
  //# sourceMappingURL=ides.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ides.js","sourceRoot":"","sources":["../../src/constants/ides.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,QAAQ;IACR,UAAU;IACV,aAAa;IACb,UAAU;IACV,QAAQ;IACR,OAAO;CACC,CAAC;AAIX,MAAM,CAAC,MAAM,WAAW,GAAU,QAAQ,CAAC;AAU3C,uFAAuF;AACvF,MAAM,CAAC,MAAM,eAAe,GAA6B;IACvD;QACE,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,uCAAuC;KAC9C;IACD;QACE,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,WAAW;QACpB,IAAI,EAAE,8CAA8C;KACrD;IACD;QACE,EAAE,EAAE,aAAa;QACjB,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,gDAAgD;KACvD;IACD;QACE,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,WAAW;QACpB,IAAI,EAAE,6CAA6C;KACpD;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,oCAAoC;KAC3C;IACD;QACE,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,QAAQ;QACjB,IAAI,EAAE,uCAAuC;KAC9C;CACO,CAAC;AAEX,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,OAAQ,OAA6B,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAS;IACxC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAyB,EAAE,WAAkB,WAAW;IACjF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,gBAAgB,KAAK,iBAAiB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC3D,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
1
+ {"version":3,"file":"ides.js","sourceRoot":"","sources":["../../src/constants/ides.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,10 @@ export declare const CLI_VERSION: string;
4
4
  export declare const CURSOR_DIR = ".cursor";
5
5
  export declare const METADATA_FILE = "noah.json";
6
6
  export declare const MANIFEST_FILE = "manifest.json";
7
+ /** Project-root team workspace config (distinct from per-IDE install ledger). */
8
+ export declare const WORKSPACE_FILE = "noah.config.json";
9
+ export declare const LOCKFILE_NAME = "noah.lock";
10
+ export declare const USER_DIR_NAME = ".noah";
7
11
  export { DEFAULT_IDE, IDE_DEFINITIONS, IDE_IDS, getIdeDefinition, isIdeId, parseIdeId, type IdeDefinition, type IdeId, } from "./ides.js";
8
12
  /** Official Noah asset registry (Skills, Rules, Prompts, MCP, Presets). */
9
13
  export declare const OFFICIAL_REGISTRY_OWNER = "itsmenoahpoli";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,QAAQ,gBAAgB,CAAC;AACtC,eAAO,MAAM,WAAW,QAAc,CAAC;AACvC,kFAAkF;AAClF,eAAO,MAAM,UAAU,YAAY,CAAC;AACpC,eAAO,MAAM,aAAa,cAAc,CAAC;AACzC,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAE7C,OAAO,EACL,WAAW,EACX,eAAe,EACf,OAAO,EACP,gBAAgB,EAChB,OAAO,EACP,UAAU,EACV,KAAK,aAAa,EAClB,KAAK,KAAK,GACX,MAAM,WAAW,CAAC;AAEnB,2EAA2E;AAC3E,eAAO,MAAM,uBAAuB,kBAAkB,CAAC;AACvD,eAAO,MAAM,sBAAsB,gBAAgB,CAAC;AACpD,eAAO,MAAM,iBAAiB,iDAA4E,CAAC;AAE3G,yEAAyE;AACzE,eAAO,MAAM,qBAAqB,kBAAkB,CAAC;AAErD,kFAAkF;AAClF,eAAO,MAAM,gBAAgB,wBAAwB,CAAC;AAEtD,eAAO,MAAM,WAAW,uDAAwD,CAAC;AAEjF,eAAO,MAAM,iBAAiB;;;;;;CAMpB,CAAC;AAEX,eAAO,MAAM,sBAAsB,2DAA4D,CAAC;AAEhG,eAAO,MAAM,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,QAAQ,gBAAgB,CAAC;AACtC,eAAO,MAAM,WAAW,QAAc,CAAC;AACvC,kFAAkF;AAClF,eAAO,MAAM,UAAU,YAAY,CAAC;AACpC,eAAO,MAAM,aAAa,cAAc,CAAC;AACzC,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAC7C,iFAAiF;AACjF,eAAO,MAAM,cAAc,qBAAqB,CAAC;AACjD,eAAO,MAAM,aAAa,cAAc,CAAC;AACzC,eAAO,MAAM,aAAa,UAAU,CAAC;AAErC,OAAO,EACL,WAAW,EACX,eAAe,EACf,OAAO,EACP,gBAAgB,EAChB,OAAO,EACP,UAAU,EACV,KAAK,aAAa,EAClB,KAAK,KAAK,GACX,MAAM,WAAW,CAAC;AAEnB,2EAA2E;AAC3E,eAAO,MAAM,uBAAuB,kBAAkB,CAAC;AACvD,eAAO,MAAM,sBAAsB,gBAAgB,CAAC;AACpD,eAAO,MAAM,iBAAiB,iDAA4E,CAAC;AAE3G,yEAAyE;AACzE,eAAO,MAAM,qBAAqB,kBAAkB,CAAC;AAErD,kFAAkF;AAClF,eAAO,MAAM,gBAAgB,wBAAwB,CAAC;AAEtD,eAAO,MAAM,WAAW,uDAAwD,CAAC;AAEjF,eAAO,MAAM,iBAAiB;;;;;;CAMpB,CAAC;AAEX,eAAO,MAAM,sBAAsB,2DAA4D,CAAC;AAEhG,eAAO,MAAM,eAAe,iBAAiB,CAAC"}
@@ -7,6 +7,10 @@ export const CLI_VERSION = pkg.version;
7
7
  export const CURSOR_DIR = ".cursor";
8
8
  export const METADATA_FILE = "noah.json";
9
9
  export const MANIFEST_FILE = "manifest.json";
10
+ /** Project-root team workspace config (distinct from per-IDE install ledger). */
11
+ export const WORKSPACE_FILE = "noah.config.json";
12
+ export const LOCKFILE_NAME = "noah.lock";
13
+ export const USER_DIR_NAME = ".noah";
10
14
  export { DEFAULT_IDE, IDE_DEFINITIONS, IDE_IDS, getIdeDefinition, isIdeId, parseIdeId, } from "./ides.js";
11
15
  /** Official Noah asset registry (Skills, Rules, Prompts, MCP, Presets). */
12
16
  export const OFFICIAL_REGISTRY_OWNER = "itsmenoahpoli";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAwB,CAAC;AAEjE,MAAM,CAAC,MAAM,QAAQ,GAAG,aAAa,CAAC;AACtC,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC;AACvC,kFAAkF;AAClF,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC;AACpC,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAC;AACzC,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAE7C,OAAO,EACL,WAAW,EACX,eAAe,EACf,OAAO,EACP,gBAAgB,EAChB,OAAO,EACP,UAAU,GAGX,MAAM,WAAW,CAAC;AAEnB,2EAA2E;AAC3E,MAAM,CAAC,MAAM,uBAAuB,GAAG,eAAe,CAAC;AACvD,MAAM,CAAC,MAAM,sBAAsB,GAAG,aAAa,CAAC;AACpD,MAAM,CAAC,MAAM,iBAAiB,GAAG,sBAAsB,uBAAuB,IAAI,sBAAsB,EAAE,CAAC;AAE3G,yEAAyE;AACzE,MAAM,CAAC,MAAM,qBAAqB,GAAG,eAAe,CAAC;AAErD,kFAAkF;AAClF,MAAM,CAAC,MAAM,gBAAgB,GAAG,qBAAqB,CAAC;AAEtD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAU,CAAC;AAEjF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,KAAK,EAAE,QAAQ;IACf,IAAI,EAAE,OAAO;IACb,MAAM,EAAE,SAAS;IACjB,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,SAAS;CACT,CAAC;AAEX,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAU,CAAC;AAEhG,MAAM,CAAC,MAAM,eAAe,GAAG,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAwB,CAAC;AAEjE,MAAM,CAAC,MAAM,QAAQ,GAAG,aAAa,CAAC;AACtC,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC;AACvC,kFAAkF;AAClF,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC;AACpC,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAC;AACzC,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAC7C,iFAAiF;AACjF,MAAM,CAAC,MAAM,cAAc,GAAG,kBAAkB,CAAC;AACjD,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAC;AACzC,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC;AAErC,OAAO,EACL,WAAW,EACX,eAAe,EACf,OAAO,EACP,gBAAgB,EAChB,OAAO,EACP,UAAU,GAGX,MAAM,WAAW,CAAC;AAEnB,2EAA2E;AAC3E,MAAM,CAAC,MAAM,uBAAuB,GAAG,eAAe,CAAC;AACvD,MAAM,CAAC,MAAM,sBAAsB,GAAG,aAAa,CAAC;AACpD,MAAM,CAAC,MAAM,iBAAiB,GAAG,sBAAsB,uBAAuB,IAAI,sBAAsB,EAAE,CAAC;AAE3G,yEAAyE;AACzE,MAAM,CAAC,MAAM,qBAAqB,GAAG,eAAe,CAAC;AAErD,kFAAkF;AAClF,MAAM,CAAC,MAAM,gBAAgB,GAAG,qBAAqB,CAAC;AAEtD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAU,CAAC;AAEjF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,KAAK,EAAE,QAAQ;IACf,IAAI,EAAE,OAAO;IACb,MAAM,EAAE,SAAS;IACjB,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,SAAS;CACT,CAAC;AAEX,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAU,CAAC;AAEhG,MAAM,CAAC,MAAM,eAAe,GAAG,cAAc,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../../src/core/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,aAAa,IAAI,OAAO,CA8CvC"}
1
+ {"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../../src/core/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BpC,wBAAgB,aAAa,IAAI,OAAO,CA6DvC"}
@@ -7,43 +7,76 @@ import { registerListCommand } from "../commands/list.js";
7
7
  import { registerRemoveCommand } from "../commands/remove.js";
8
8
  import { registerUpdateCommand } from "../commands/update.js";
9
9
  import { registerDoctorCommand } from "../commands/doctor.js";
10
+ import { registerInstallCommand } from "../commands/install.js";
11
+ import { registerUninstallCommand } from "../commands/uninstall.js";
12
+ import { registerPreviewCommand } from "../commands/preview.js";
13
+ import { registerRecentCommand } from "../commands/recent.js";
14
+ import { registerFavoriteCommands } from "../commands/favorite.js";
15
+ import { registerBootstrapCommand } from "../commands/bootstrap.js";
16
+ import { registerWorkspaceCommand } from "../commands/workspace.js";
17
+ import { registerExplainCommand } from "../commands/explain.js";
18
+ import { registerAnalyzeCommand } from "../commands/analyze.js";
19
+ import { registerWizardCommands } from "../commands/wizard.js";
20
+ import { registerPublishCommand } from "../commands/publish.js";
21
+ import { registerAuthCommands } from "../commands/auth.js";
22
+ import { registerDashboardCommand } from "../commands/dashboard.js";
23
+ import { registerPluginCommand } from "../commands/plugin.js";
24
+ import { registerUndoCommand } from "../commands/undo.js";
25
+ import { registerTryCommand } from "../commands/try.js";
26
+ import { registerNewCommand } from "../commands/new.js";
27
+ import { registerConfigCommands } from "../commands/config.js";
10
28
  import { renderBanner, shouldShowBanner } from "../ui/banner.js";
11
29
  export function createProgram() {
12
30
  const program = new Command();
13
31
  program
14
32
  .name(CLI_NAME)
15
- .description("Install Noah's reusable Cursor assets (Skills, Rules, Prompts, MCP, Presets)")
33
+ .description("The package manager for AI-assisted software development — Skills, Rules, Prompts, MCP, Presets")
16
34
  .version(CLI_VERSION)
17
35
  .option("--no-banner", "Hide the NOAH DEV CLI banner")
18
36
  .showHelpAfterError()
19
37
  .showSuggestionAfterError();
20
- // Show branding above help (`noah-cursor`, `noah-cursor --help`, `… help`)
21
38
  program.configureHelp({
22
39
  helpWidth: process.stdout.columns || 80,
23
40
  });
24
41
  program.addHelpText("beforeAll", () => {
25
- // Banner for explicit --help / help command (empty argv is handled in index.ts)
26
42
  if (shouldShowBanner()) {
27
43
  renderBanner();
28
44
  }
29
45
  return "";
30
46
  });
31
- // Show branding before every subcommand action
32
47
  program.hook("preAction", () => {
33
48
  renderBanner();
34
49
  });
35
- // If Commander still routes to the root with no subcommand, show help (exit 0)
50
+ // Root action: help when routed without subcommand (TTY home is handled in index.ts)
36
51
  program.action(() => {
37
52
  renderBanner();
38
53
  program.outputHelp();
39
54
  });
40
55
  registerAddCommand(program);
56
+ registerInstallCommand(program);
41
57
  registerBrowseCommand(program);
42
58
  registerSearchCommand(program);
59
+ registerPreviewCommand(program);
43
60
  registerListCommand(program);
44
61
  registerRemoveCommand(program);
62
+ registerUninstallCommand(program);
45
63
  registerUpdateCommand(program);
46
64
  registerDoctorCommand(program);
65
+ registerRecentCommand(program);
66
+ registerFavoriteCommands(program);
67
+ registerBootstrapCommand(program);
68
+ registerWorkspaceCommand(program);
69
+ registerExplainCommand(program);
70
+ registerAnalyzeCommand(program);
71
+ registerWizardCommands(program);
72
+ registerPublishCommand(program);
73
+ registerAuthCommands(program);
74
+ registerDashboardCommand(program);
75
+ registerPluginCommand(program);
76
+ registerUndoCommand(program);
77
+ registerTryCommand(program);
78
+ registerNewCommand(program);
79
+ registerConfigCommands(program);
47
80
  return program;
48
81
  }
49
82
  //# sourceMappingURL=program.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"program.js","sourceRoot":"","sources":["../../src/core/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEjE,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,QAAQ,CAAC;SACd,WAAW,CACV,8EAA8E,CAC/E;SACA,OAAO,CAAC,WAAW,CAAC;SACpB,MAAM,CAAC,aAAa,EAAE,8BAA8B,CAAC;SACrD,kBAAkB,EAAE;SACpB,wBAAwB,EAAE,CAAC;IAE9B,2EAA2E;IAC3E,OAAO,CAAC,aAAa,CAAC;QACpB,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE;KACxC,CAAC,CAAC;IAEH,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,GAAG,EAAE;QACpC,gFAAgF;QAChF,IAAI,gBAAgB,EAAE,EAAE,CAAC;YACvB,YAAY,EAAE,CAAC;QACjB,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,+CAA+C;IAC/C,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;QAC7B,YAAY,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,+EAA+E;IAC/E,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE;QAClB,YAAY,EAAE,CAAC;QACf,OAAO,CAAC,UAAU,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAE/B,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../../src/core/program.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,12 +1,47 @@
1
1
  #!/usr/bin/env node
2
2
  import { createProgram } from "./core/program.js";
3
3
  import { renderBanner } from "./ui/banner.js";
4
+ import { resolveHomeArgv } from "./ui/homeMenu.js";
5
+ import { analyzeProject } from "./services/project-awareness.js";
6
+ import chalk from "chalk";
7
+ import { logTitle } from "./core/logger.js";
4
8
  async function main() {
5
9
  const program = createProgram();
6
10
  const args = process.argv.slice(2);
7
- // No arguments: show branding + help, exit successfully (not an error)
11
+ // No arguments: interactive home on TTY, else smart project summary + help
8
12
  if (args.length === 0) {
9
13
  renderBanner(true);
14
+ if (process.stdout.isTTY && process.env.NOAH_CURSOR_NO_HOME !== "1") {
15
+ const homeArgs = await resolveHomeArgv();
16
+ if (!homeArgs)
17
+ return;
18
+ process.argv = [process.argv[0], process.argv[1], ...homeArgs];
19
+ await createProgram().parseAsync(process.argv);
20
+ return;
21
+ }
22
+ // Non-interactive: show project-aware north-star summary then help
23
+ try {
24
+ const analysis = await analyzeProject(process.cwd());
25
+ if (analysis.stack.frameworks.length > 0 || analysis.recommendations.length > 0) {
26
+ logTitle("Project Detected");
27
+ console.log(` ${chalk.bold(analysis.stack.frameworks.join(", ") || "Unknown")} · Health ${Math.round(analysis.health.overall * 10)}%`);
28
+ if (analysis.missing.length) {
29
+ console.log(chalk.yellow(` Missing: ${analysis.missing.join(", ")}`));
30
+ }
31
+ if (analysis.recommendations.length) {
32
+ console.log(chalk.dim(" Recommended:"));
33
+ for (const r of analysis.recommendations.slice(0, 5)) {
34
+ console.log(chalk.dim(` ✓ ${r.type}/${r.id}`));
35
+ }
36
+ console.log();
37
+ console.log(chalk.dim(" Run `noah-cursor bootstrap` to review and install recommendations."));
38
+ console.log();
39
+ }
40
+ }
41
+ }
42
+ catch {
43
+ // ignore analysis failures on bare invoke
44
+ }
10
45
  program.outputHelp();
11
46
  return;
12
47
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,uEAAuE;IACvE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,CAAC,UAAU,EAAE,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type AssetType, type FavoriteEntry, type RecentEntry, type UserStore } from "../types/index.js";
2
+ export declare function getUserDir(): string;
3
+ export declare function getUserStorePath(): string;
4
+ export declare function readUserStore(): Promise<UserStore>;
5
+ export declare function writeUserStore(store: UserStore): Promise<void>;
6
+ export declare function addRecent(type: AssetType, id: string, action: RecentEntry["action"]): Promise<void>;
7
+ export declare function listRecent(): Promise<RecentEntry[]>;
8
+ export declare function addFavorite(type: AssetType, id: string): Promise<FavoriteEntry>;
9
+ export declare function removeFavorite(type: AssetType, id: string): Promise<boolean>;
10
+ export declare function listFavorites(): Promise<FavoriteEntry[]>;
11
+ export declare function pushUndo(entry: UserStore["undoStack"][number]): Promise<void>;
12
+ export declare function popUndo(): Promise<UserStore["undoStack"][number] | null>;
13
+ export declare function appendAudit(action: string, detail?: string): Promise<void>;
14
+ export declare function getSettings(): Promise<UserStore["settings"]>;
15
+ export declare function updateSettings(patch: Partial<UserStore["settings"]>): Promise<UserStore["settings"]>;
16
+ //# sourceMappingURL=user-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-store.d.ts","sourceRoot":"","sources":["../../src/metadata/user-store.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,SAAS,EACf,MAAM,mBAAmB,CAAC;AAM3B,wBAAgB,UAAU,IAAI,MAAM,CAKnC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,SAAS,CAAC,CAWxD;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAKpE;AAED,wBAAsB,SAAS,CAC7B,IAAI,EAAE,SAAS,EACf,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CAQf;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAGzD;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAQrF;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOlF;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAG9D;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAInF;AAED,wBAAsB,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAK9E;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOhF;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAElE;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,GACpC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAKhC"}
@@ -0,0 +1,99 @@
1
+ import path from "node:path";
2
+ import os from "node:os";
3
+ import fs from "fs-extra";
4
+ import { USER_DIR_NAME } from "../constants/index.js";
5
+ import { UserStoreSchema, } from "../types/index.js";
6
+ const MAX_RECENT = 50;
7
+ const MAX_UNDO = 20;
8
+ const MAX_AUDIT = 200;
9
+ export function getUserDir() {
10
+ if (process.env.NOAH_HOME) {
11
+ return path.resolve(process.env.NOAH_HOME);
12
+ }
13
+ return path.join(os.homedir(), USER_DIR_NAME);
14
+ }
15
+ export function getUserStorePath() {
16
+ return path.join(getUserDir(), "store.json");
17
+ }
18
+ export async function readUserStore() {
19
+ const storePath = getUserStorePath();
20
+ if (!(await fs.pathExists(storePath))) {
21
+ return UserStoreSchema.parse({});
22
+ }
23
+ try {
24
+ const raw = await fs.readJson(storePath);
25
+ return UserStoreSchema.parse(raw);
26
+ }
27
+ catch {
28
+ return UserStoreSchema.parse({});
29
+ }
30
+ }
31
+ export async function writeUserStore(store) {
32
+ const storePath = getUserStorePath();
33
+ await fs.ensureDir(path.dirname(storePath));
34
+ const parsed = UserStoreSchema.parse(store);
35
+ await fs.writeJson(storePath, parsed, { spaces: 2 });
36
+ }
37
+ export async function addRecent(type, id, action) {
38
+ const store = await readUserStore();
39
+ const entry = { type, id, action, at: new Date().toISOString() };
40
+ store.recent = [entry, ...store.recent.filter((r) => !(r.type === type && r.id === id))].slice(0, MAX_RECENT);
41
+ await writeUserStore(store);
42
+ }
43
+ export async function listRecent() {
44
+ const store = await readUserStore();
45
+ return store.recent;
46
+ }
47
+ export async function addFavorite(type, id) {
48
+ const store = await readUserStore();
49
+ const existing = store.favorites.find((f) => f.type === type && f.id === id);
50
+ if (existing)
51
+ return existing;
52
+ const entry = { type, id, addedAt: new Date().toISOString() };
53
+ store.favorites.push(entry);
54
+ await writeUserStore(store);
55
+ return entry;
56
+ }
57
+ export async function removeFavorite(type, id) {
58
+ const store = await readUserStore();
59
+ const before = store.favorites.length;
60
+ store.favorites = store.favorites.filter((f) => !(f.type === type && f.id === id));
61
+ if (store.favorites.length === before)
62
+ return false;
63
+ await writeUserStore(store);
64
+ return true;
65
+ }
66
+ export async function listFavorites() {
67
+ const store = await readUserStore();
68
+ return store.favorites;
69
+ }
70
+ export async function pushUndo(entry) {
71
+ const store = await readUserStore();
72
+ store.undoStack = [entry, ...store.undoStack].slice(0, MAX_UNDO);
73
+ await writeUserStore(store);
74
+ }
75
+ export async function popUndo() {
76
+ const store = await readUserStore();
77
+ const entry = store.undoStack.shift() ?? null;
78
+ if (entry)
79
+ await writeUserStore(store);
80
+ return entry;
81
+ }
82
+ export async function appendAudit(action, detail) {
83
+ const store = await readUserStore();
84
+ store.auditLog = [
85
+ { at: new Date().toISOString(), action, detail },
86
+ ...store.auditLog,
87
+ ].slice(0, MAX_AUDIT);
88
+ await writeUserStore(store);
89
+ }
90
+ export async function getSettings() {
91
+ return (await readUserStore()).settings;
92
+ }
93
+ export async function updateSettings(patch) {
94
+ const store = await readUserStore();
95
+ store.settings = { ...store.settings, ...patch };
96
+ await writeUserStore(store);
97
+ return store.settings;
98
+ }
99
+ //# sourceMappingURL=user-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-store.js","sourceRoot":"","sources":["../../src/metadata/user-store.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EACL,eAAe,GAKhB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,QAAQ,GAAG,EAAE,CAAC;AACpB,MAAM,SAAS,GAAG,GAAG,CAAC;AAEtB,MAAM,UAAU,UAAU;IACxB,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,YAAY,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;IACrC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QACtC,OAAO,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACzC,OAAO,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAgB;IACnD,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;IACrC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,IAAe,EACf,EAAU,EACV,MAA6B;IAE7B,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;IACpC,MAAM,KAAK,GAAgB,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;IAC9E,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAC5F,CAAC,EACD,UAAU,CACX,CAAC;IACF,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;IACpC,OAAO,KAAK,CAAC,MAAM,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAe,EAAE,EAAU;IAC3D,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7E,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,KAAK,GAAkB,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;IAC7E,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;IAC5B,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAe,EAAE,EAAU;IAC9D,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;IACtC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACnF,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IACpD,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;IAC5B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;IACpC,OAAO,KAAK,CAAC,SAAS,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAqC;IAClE,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;IACpC,KAAK,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACjE,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC;IAC9C,IAAI,KAAK;QAAE,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;IACvC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAc,EAAE,MAAe;IAC/D,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;IACpC,KAAK,CAAC,QAAQ,GAAG;QACf,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;QAChD,GAAG,KAAK,CAAC,QAAQ;KAClB,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACtB,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,OAAO,CAAC,MAAM,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC;AAC1C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAqC;IAErC,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;IACpC,KAAK,CAAC,QAAQ,GAAG,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC;IACjD,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;IAC5B,OAAO,KAAK,CAAC,QAAQ,CAAC;AACxB,CAAC"}