@vegamo/loom 0.1.8 → 0.1.9

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/README.md CHANGED
@@ -18,6 +18,7 @@ AI-powered JSON Schema document generator with TUI, web viewer and mock server
18
18
  - **⚡ Mock Server** - Dynamic mock API server that generates realistic test data based on JSON Schema
19
19
  - **🖥️ In-Chat Service Control** - Start/stop/restart mock server and web viewer directly inside TUI (`/mock`, `/view`)
20
20
  - **🗂️ Manifest Indexing** - Built-in manifest rebuild command for dependency/index consistency (`loom manifest rebuild`)
21
+ - **⬆️ Auto Update Prompt** - On startup, Loom checks npm for a newer version and can upgrade automatically after confirmation
21
22
  - **🔧 TypeScript First** - Fully typed with modern TypeScript architecture
22
23
 
23
24
  ## 📦 Installation
@@ -130,6 +131,15 @@ loom serve
130
131
  # - Mock API: http://localhost:3000/mock/...
131
132
  ```
132
133
 
134
+ ### 5. Upgrade Loom
135
+ ```bash
136
+ # Manually trigger upgrade
137
+ loom upgrade
138
+ ```
139
+
140
+ > Loom also checks npm for updates when you run commands.
141
+ > If a newer version is found, you can confirm and let Loom auto-upgrade.
142
+
133
143
  ## 📖 Usage Guide
134
144
 
135
145
  ### `loom chat`
@@ -227,6 +237,13 @@ Options:
227
237
  -h, --help Display help
228
238
  ```
229
239
 
240
+ ### `loom upgrade`
241
+ Upgrade loom to the latest npm version.
242
+
243
+ ```bash
244
+ loom upgrade
245
+ ```
246
+
230
247
  ## 📝 JSON Schema Format
231
248
 
232
249
  Loom uses a custom JSON Schema format optimized for API documentation:
package/dist/index.d.ts CHANGED
@@ -7,6 +7,7 @@
7
7
  * loom view [--port] — Web 文档查看器
8
8
  * loom mock [--port] — Mock 服务
9
9
  * loom serve [--port] — 文档查看 + Mock 合一
10
+ * loom upgrade — 从 npm 升级 loom
10
11
  * loom manifest rebuild — 重建 docs manifest 索引
11
12
  */
12
13
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG"}
package/dist/index.js CHANGED
@@ -7,19 +7,31 @@
7
7
  * loom view [--port] — Web 文档查看器
8
8
  * loom mock [--port] — Mock 服务
9
9
  * loom serve [--port] — 文档查看 + Mock 合一
10
+ * loom upgrade — 从 npm 升级 loom
10
11
  * loom manifest rebuild — 重建 docs manifest 索引
11
12
  */
12
13
  import { Command } from 'commander';
13
14
  import { loadConfig, getOutDir } from './shared/config.js';
14
15
  import { ensureChatConfig } from './shared/config-wizard.js';
15
16
  import { logger } from './shared/logger.js';
16
- import { getPackageVersion } from './shared/version.js';
17
+ import { checkForUpdatesAndPromptUpgrade, upgradeLoomPackage } from './shared/update.js';
18
+ import { getPackageName, getPackageVersion } from './shared/version.js';
17
19
  const program = new Command();
18
20
  const VERSION = getPackageVersion();
21
+ const PACKAGE_NAME = getPackageName();
19
22
  program
20
23
  .name('loom')
21
24
  .description('AI-powered JSON Schema document generator')
22
25
  .version(VERSION);
26
+ program.hook('preAction', async (_thisCommand, actionCommand) => {
27
+ if (actionCommand.name() === 'upgrade') {
28
+ return;
29
+ }
30
+ await checkForUpdatesAndPromptUpgrade({
31
+ packageName: PACKAGE_NAME,
32
+ currentVersion: VERSION,
33
+ });
34
+ });
23
35
  // ============================================================
24
36
  // loom chat
25
37
  // ============================================================
@@ -102,5 +114,21 @@ manifestCommand
102
114
  logger.info(`Indexed ${manifest.endpointIndex.length} endpoints, ` +
103
115
  `${manifest.entities.length} entities, ${manifest.references.length} references.`);
104
116
  });
105
- program.parse();
117
+ // ============================================================
118
+ // loom upgrade
119
+ // ============================================================
120
+ program
121
+ .command('upgrade')
122
+ .alias('update')
123
+ .description('Upgrade loom to latest version from npm')
124
+ .action(async () => {
125
+ const upgraded = await upgradeLoomPackage(PACKAGE_NAME);
126
+ if (upgraded) {
127
+ logger.success('升级完成,请重新运行 loom。');
128
+ return;
129
+ }
130
+ logger.error(`自动升级失败,请手动执行: npm install -g ${PACKAGE_NAME}@latest`);
131
+ process.exitCode = 1;
132
+ });
133
+ await program.parseAsync(process.argv);
106
134
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ type UpdatePromptOptions = {
2
+ packageName: string;
3
+ currentVersion: string;
4
+ };
5
+ export declare function compareVersions(leftVersion: string, rightVersion: string): number;
6
+ export declare function upgradeLoomPackage(packageName: string): Promise<boolean>;
7
+ export declare function checkForUpdatesAndPromptUpgrade(options: UpdatePromptOptions): Promise<void>;
8
+ export {};
9
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/shared/update.ts"],"names":[],"mappings":"AAmBA,KAAK,mBAAmB,GAAG;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAyDF,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAwBjF;AAuGD,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAa9E;AAED,wBAAsB,+BAA+B,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoEjG"}
@@ -0,0 +1,231 @@
1
+ import fs from 'node:fs';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import readline from 'node:readline/promises';
5
+ import { execFile, spawn } from 'node:child_process';
6
+ import { promisify } from 'node:util';
7
+ import { logger } from './logger.js';
8
+ const execFileAsync = promisify(execFile);
9
+ const UPDATE_CHECK_INTERVAL_MS = 12 * 60 * 60 * 1000;
10
+ const UPDATE_STATE_PATH = path.join(os.homedir(), '.loom', 'update-check.json');
11
+ const UPDATE_TIMEOUT_MS = 5000;
12
+ function parseVersion(version) {
13
+ const [stablePart, prereleasePart = ''] = version.trim().split('-', 2);
14
+ const stable = stablePart
15
+ .split('.')
16
+ .map((part) => Number.parseInt(part, 10))
17
+ .map((num) => (Number.isNaN(num) ? 0 : num));
18
+ const prerelease = prereleasePart === '' ? [] : prereleasePart.split('.');
19
+ return { stable, prerelease };
20
+ }
21
+ function comparePrerelease(left, right) {
22
+ const length = Math.max(left.length, right.length);
23
+ for (let i = 0; i < length; i += 1) {
24
+ const l = left[i];
25
+ const r = right[i];
26
+ if (l === undefined && r === undefined) {
27
+ return 0;
28
+ }
29
+ if (l === undefined) {
30
+ return -1;
31
+ }
32
+ if (r === undefined) {
33
+ return 1;
34
+ }
35
+ const leftNum = Number.parseInt(l, 10);
36
+ const rightNum = Number.parseInt(r, 10);
37
+ const leftIsNum = /^[0-9]+$/.test(l);
38
+ const rightIsNum = /^[0-9]+$/.test(r);
39
+ if (leftIsNum && rightIsNum) {
40
+ if (leftNum !== rightNum) {
41
+ return leftNum > rightNum ? 1 : -1;
42
+ }
43
+ continue;
44
+ }
45
+ if (leftIsNum && !rightIsNum) {
46
+ return -1;
47
+ }
48
+ if (!leftIsNum && rightIsNum) {
49
+ return 1;
50
+ }
51
+ if (l !== r) {
52
+ return l > r ? 1 : -1;
53
+ }
54
+ }
55
+ return 0;
56
+ }
57
+ export function compareVersions(leftVersion, rightVersion) {
58
+ const left = parseVersion(leftVersion);
59
+ const right = parseVersion(rightVersion);
60
+ const stableLength = Math.max(left.stable.length, right.stable.length, 3);
61
+ for (let i = 0; i < stableLength; i += 1) {
62
+ const l = left.stable[i] ?? 0;
63
+ const r = right.stable[i] ?? 0;
64
+ if (l !== r) {
65
+ return l > r ? 1 : -1;
66
+ }
67
+ }
68
+ if (left.prerelease.length === 0 && right.prerelease.length === 0) {
69
+ return 0;
70
+ }
71
+ if (left.prerelease.length === 0) {
72
+ return 1;
73
+ }
74
+ if (right.prerelease.length === 0) {
75
+ return -1;
76
+ }
77
+ return comparePrerelease(left.prerelease, right.prerelease);
78
+ }
79
+ function readUpdateState() {
80
+ try {
81
+ const content = fs.readFileSync(UPDATE_STATE_PATH, 'utf8');
82
+ const parsed = JSON.parse(content);
83
+ if (typeof parsed.lastCheckedAt === 'number' &&
84
+ Number.isFinite(parsed.lastCheckedAt) &&
85
+ typeof parsed.latestVersion === 'string' &&
86
+ parsed.latestVersion.trim() !== '') {
87
+ return {
88
+ lastCheckedAt: parsed.lastCheckedAt,
89
+ latestVersion: parsed.latestVersion,
90
+ skippedVersion: typeof parsed.skippedVersion === 'string' && parsed.skippedVersion.trim() !== ''
91
+ ? parsed.skippedVersion
92
+ : undefined,
93
+ };
94
+ }
95
+ }
96
+ catch {
97
+ // Ignore cache parsing failures.
98
+ }
99
+ return null;
100
+ }
101
+ function writeUpdateState(state) {
102
+ try {
103
+ fs.mkdirSync(path.dirname(UPDATE_STATE_PATH), { recursive: true });
104
+ fs.writeFileSync(UPDATE_STATE_PATH, JSON.stringify(state), 'utf8');
105
+ }
106
+ catch {
107
+ // Ignore cache write failures.
108
+ }
109
+ }
110
+ function shouldSkipUpdateCheck() {
111
+ return Boolean(process.env.CI || process.env.LOOM_DISABLE_UPDATE_CHECK);
112
+ }
113
+ function normalizeNpmVersionOutput(stdout) {
114
+ const trimmed = stdout.trim();
115
+ if (trimmed === '') {
116
+ return null;
117
+ }
118
+ if (trimmed.startsWith('"') || trimmed.startsWith("'")) {
119
+ try {
120
+ const parsed = JSON.parse(trimmed);
121
+ if (typeof parsed === 'string' && parsed.trim() !== '') {
122
+ return parsed.trim();
123
+ }
124
+ }
125
+ catch {
126
+ return null;
127
+ }
128
+ }
129
+ return trimmed;
130
+ }
131
+ async function fetchLatestVersionFromNpm(packageName) {
132
+ try {
133
+ const { stdout } = await execFileAsync('npm', ['view', packageName, 'version', '--json'], { timeout: UPDATE_TIMEOUT_MS });
134
+ return normalizeNpmVersionOutput(stdout);
135
+ }
136
+ catch {
137
+ return null;
138
+ }
139
+ }
140
+ function shouldPromptUpgrade() {
141
+ return Boolean(process.stdin.isTTY && process.stdout.isTTY);
142
+ }
143
+ async function askUpgradeDecision(latestVersion) {
144
+ const rl = readline.createInterface({
145
+ input: process.stdin,
146
+ output: process.stdout,
147
+ });
148
+ try {
149
+ logger.info(`检测到新版本 ${latestVersion},请选择: [1] 立即升级 [2] 忽略此版本 [3] 下次再说`);
150
+ const answer = (await rl.question('请输入选项 (1/2/3,默认 1): ')).trim().toLowerCase();
151
+ if (answer === '' || answer === '1' || answer === 'y' || answer === 'yes') {
152
+ return 'upgrade';
153
+ }
154
+ if (answer === '2' || answer === 'i' || answer === 'ignore') {
155
+ return 'skip-version';
156
+ }
157
+ return 'later';
158
+ }
159
+ finally {
160
+ rl.close();
161
+ }
162
+ }
163
+ export async function upgradeLoomPackage(packageName) {
164
+ const installTarget = `${packageName}@latest`;
165
+ logger.info(`正在执行升级: npm install -g ${installTarget}`);
166
+ return new Promise((resolve) => {
167
+ const child = spawn('npm', ['install', '-g', installTarget], {
168
+ stdio: 'inherit',
169
+ shell: process.platform === 'win32',
170
+ });
171
+ child.once('error', () => resolve(false));
172
+ child.once('exit', (code) => resolve(code === 0));
173
+ });
174
+ }
175
+ export async function checkForUpdatesAndPromptUpgrade(options) {
176
+ if (shouldSkipUpdateCheck()) {
177
+ return;
178
+ }
179
+ const now = Date.now();
180
+ const state = readUpdateState();
181
+ const canUseCache = state !== null && now - state.lastCheckedAt < UPDATE_CHECK_INTERVAL_MS && state.latestVersion !== '';
182
+ let latestVersion = null;
183
+ if (canUseCache) {
184
+ latestVersion = state.latestVersion;
185
+ }
186
+ else {
187
+ latestVersion = await fetchLatestVersionFromNpm(options.packageName);
188
+ if (latestVersion) {
189
+ const skippedVersion = state?.skippedVersion && compareVersions(latestVersion, state.skippedVersion) <= 0
190
+ ? state.skippedVersion
191
+ : undefined;
192
+ writeUpdateState({
193
+ lastCheckedAt: now,
194
+ latestVersion,
195
+ skippedVersion,
196
+ });
197
+ }
198
+ }
199
+ if (!latestVersion || compareVersions(latestVersion, options.currentVersion) <= 0) {
200
+ return;
201
+ }
202
+ if (state?.skippedVersion && compareVersions(latestVersion, state.skippedVersion) <= 0) {
203
+ return;
204
+ }
205
+ logger.warn(`发现 loom 新版本: ${options.currentVersion} -> ${latestVersion}`);
206
+ if (!shouldPromptUpgrade()) {
207
+ logger.info(`请手动执行: npm install -g ${options.packageName}@latest`);
208
+ return;
209
+ }
210
+ const decision = await askUpgradeDecision(latestVersion);
211
+ if (decision === 'skip-version') {
212
+ writeUpdateState({
213
+ lastCheckedAt: now,
214
+ latestVersion,
215
+ skippedVersion: latestVersion,
216
+ });
217
+ logger.info(`已忽略版本 ${latestVersion},可稍后执行: npm install -g ${options.packageName}@latest`);
218
+ return;
219
+ }
220
+ if (decision === 'later') {
221
+ logger.info(`本次不升级,可稍后执行: npm install -g ${options.packageName}@latest`);
222
+ return;
223
+ }
224
+ const upgraded = await upgradeLoomPackage(options.packageName);
225
+ if (upgraded) {
226
+ logger.success('升级完成,请重新运行 loom。');
227
+ process.exit(0);
228
+ }
229
+ logger.error(`自动升级失败,请手动执行: npm install -g ${options.packageName}@latest`);
230
+ }
231
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/shared/update.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,3 @@
1
1
  export declare function getPackageVersion(): string;
2
+ export declare function getPackageName(): string;
2
3
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/shared/version.ts"],"names":[],"mappings":"AASA,wBAAgB,iBAAiB,IAAI,MAAM,CAkB1C"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/shared/version.ts"],"names":[],"mappings":"AAwBA,wBAAgB,iBAAiB,IAAI,MAAM,CAa1C;AAED,wBAAgB,cAAc,IAAI,MAAM,CAavC"}
@@ -4,22 +4,38 @@ import { fileURLToPath } from 'node:url';
4
4
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
5
5
  const packageJsonPath = path.resolve(__dirname, '..', '..', 'package.json');
6
6
  let cachedVersion = null;
7
- export function getPackageVersion() {
8
- if (cachedVersion) {
9
- return cachedVersion;
10
- }
7
+ let cachedPackageName = null;
8
+ function readPackageMeta() {
11
9
  try {
12
10
  const content = fs.readFileSync(packageJsonPath, 'utf8');
13
- const parsed = JSON.parse(content);
14
- if (typeof parsed.version === 'string' && parsed.version.trim() !== '') {
15
- cachedVersion = parsed.version;
16
- return cachedVersion;
17
- }
11
+ return JSON.parse(content);
18
12
  }
19
13
  catch {
20
- // Ignore and fallback
14
+ return null;
15
+ }
16
+ }
17
+ export function getPackageVersion() {
18
+ if (cachedVersion) {
19
+ return cachedVersion;
20
+ }
21
+ const meta = readPackageMeta();
22
+ if (meta && typeof meta.version === 'string' && meta.version.trim() !== '') {
23
+ cachedVersion = meta.version;
24
+ return cachedVersion;
21
25
  }
22
26
  cachedVersion = '0.0.0';
23
27
  return cachedVersion;
24
28
  }
29
+ export function getPackageName() {
30
+ if (cachedPackageName) {
31
+ return cachedPackageName;
32
+ }
33
+ const meta = readPackageMeta();
34
+ if (meta && typeof meta.name === 'string' && meta.name.trim() !== '') {
35
+ cachedPackageName = meta.name;
36
+ return cachedPackageName;
37
+ }
38
+ cachedPackageName = 'loom';
39
+ return cachedPackageName;
40
+ }
25
41
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/shared/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AAE5E,IAAI,aAAa,GAAkB,IAAI,CAAC;AAExC,MAAM,UAAU,iBAAiB;IAC/B,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA0B,CAAC;QAC5D,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACvE,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC;YAC/B,OAAO,aAAa,CAAC;QACvB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB;IACxB,CAAC;IAED,aAAa,GAAG,OAAO,CAAC;IACxB,OAAO,aAAa,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/shared/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AAE5E,IAAI,aAAa,GAAkB,IAAI,CAAC;AACxC,IAAI,iBAAiB,GAAkB,IAAI,CAAC;AAO5C,SAAS,eAAe;IACtB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAoB,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3E,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,aAAa,GAAG,OAAO,CAAC;IACxB,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,IAAI,iBAAiB,EAAE,CAAC;QACtB,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACrE,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC;QAC9B,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,iBAAiB,GAAG,MAAM,CAAC;IAC3B,OAAO,iBAAiB,CAAC;AAC3B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vegamo/loom",
3
- "version": "0.1.8",
3
+ "version": "0.1.9",
4
4
  "description": "AI-powered JSON Schema document generator with TUI, web viewer and mock server",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",