apiskill 0.1.4 → 0.1.6
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 +11 -1
- package/README.zh.md +13 -1
- package/dist/assets/index-B_wAJLu_.js +324 -0
- package/dist/assets/index-CHOQ6xhP.css +1 -0
- package/dist/index.html +2 -2
- package/docs/cli.md +16 -2
- package/docs/cli.zh.md +16 -2
- package/docs/mcp.ja.md +2 -4
- package/docs/mcp.ko.md +2 -4
- package/docs/mcp.md +2 -4
- package/docs/mcp.zh.md +2 -4
- package/docs/web.md +3 -1
- package/docs/web.zh.md +3 -1
- package/mcp-config.example.json +1 -5
- package/package.json +4 -3
- package/scripts/apiskill-cli.mjs +48 -9
- package/scripts/lib/apiskill-core.mjs +6 -0
- package/scripts/lib/cache-paths.mjs +94 -4
- package/scripts/test-shared-cache.mjs +175 -0
- package/src/App.tsx +29 -0
- package/src/CacheSettingsDialog.tsx +166 -0
- package/src/DocumentVersionManager.tsx +47 -1
- package/src/styles.css +119 -0
- package/src/swagger.ts +2 -0
- package/vite.config.ts +92 -1
- package/dist/assets/index-CV6e3HAP.js +0 -299
- package/dist/assets/index-slFOragU.css +0 -1
package/vite.config.ts
CHANGED
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
openApiStats,
|
|
16
16
|
} from './src/manualApiConfig';
|
|
17
17
|
import { startMockServer } from './scripts/lib/mock-server.mjs';
|
|
18
|
-
import { getDefaultCacheDir } from './scripts/lib/cache-paths.mjs';
|
|
18
|
+
import { getCacheSettings, getDefaultCacheDir, resetDefaultCacheDir, setDefaultCacheDir } from './scripts/lib/cache-paths.mjs';
|
|
19
19
|
|
|
20
20
|
const appRootDir = process.env.APISKILL_ROOT || process.cwd();
|
|
21
21
|
const cacheDir = getDefaultCacheDir();
|
|
@@ -91,6 +91,26 @@ function openapiImportPlugin() {
|
|
|
91
91
|
}
|
|
92
92
|
});
|
|
93
93
|
|
|
94
|
+
server.middlewares.use('/api/cache-settings', async (req, res) => {
|
|
95
|
+
try {
|
|
96
|
+
if (req.method === 'GET') {
|
|
97
|
+
sendJson(res, 200, webCacheSettings());
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (req.method !== 'POST') {
|
|
101
|
+
sendJson(res, 405, { error: 'Method Not Allowed' });
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const body = (await readJsonBody(req)) as { cacheDir?: unknown; reset?: boolean };
|
|
106
|
+
if (body.reset) await resetDefaultCacheDir();
|
|
107
|
+
else await setDefaultCacheDir(requiredText(body.cacheDir, '请输入默认缓存地址'));
|
|
108
|
+
sendJson(res, 200, webCacheSettings());
|
|
109
|
+
} catch (error) {
|
|
110
|
+
sendJson(res, 400, { error: error instanceof Error ? error.message : 'Save cache settings failed' });
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
|
|
94
114
|
server.middlewares.use('/api/openapi/version-select', async (req, res) => {
|
|
95
115
|
if (req.method !== 'POST') {
|
|
96
116
|
sendJson(res, 405, { error: 'Method Not Allowed' });
|
|
@@ -197,6 +217,66 @@ function openapiImportPlugin() {
|
|
|
197
217
|
}
|
|
198
218
|
});
|
|
199
219
|
|
|
220
|
+
server.middlewares.use('/api/openapi/version-sync-cache', async (req, res) => {
|
|
221
|
+
if (req.method !== 'POST') {
|
|
222
|
+
sendJson(res, 405, { error: 'Method Not Allowed' });
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
try {
|
|
227
|
+
const body = (await readJsonBody(req)) as { versionId?: string };
|
|
228
|
+
const versionId = requiredText(body.versionId, '请选择要同步的文档版本');
|
|
229
|
+
assertSafeVersionId(versionId);
|
|
230
|
+
const settings = getCacheSettings();
|
|
231
|
+
const targetCacheDir = settings.defaultCacheDir;
|
|
232
|
+
const payload = await readCachedDocument(versionId);
|
|
233
|
+
const sourceDocumentPath = typeof payload.meta?.savedPath === 'string'
|
|
234
|
+
? payload.meta.savedPath
|
|
235
|
+
: resolve(versionsDir, `${versionId}.json`);
|
|
236
|
+
|
|
237
|
+
if (resolve(targetCacheDir) === resolve(cacheDir)) {
|
|
238
|
+
sendJson(res, 200, {
|
|
239
|
+
status: 'already-current',
|
|
240
|
+
versionId,
|
|
241
|
+
sourceCacheDir: cacheDir,
|
|
242
|
+
sourceDocumentPath,
|
|
243
|
+
targetCacheDir,
|
|
244
|
+
targetDocumentPath: sourceDocumentPath,
|
|
245
|
+
});
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
const targetVersionsDir = resolve(targetCacheDir, 'versions');
|
|
250
|
+
const targetDocumentPath = resolve(targetVersionsDir, `${versionId}.json`);
|
|
251
|
+
const targetMetaPath = resolve(targetVersionsDir, `${versionId}.meta.json`);
|
|
252
|
+
const syncedAt = new Date().toISOString();
|
|
253
|
+
const targetMeta = {
|
|
254
|
+
...(payload.meta ?? {}),
|
|
255
|
+
versionId,
|
|
256
|
+
savedFile: basename(targetDocumentPath),
|
|
257
|
+
savedPath: targetDocumentPath,
|
|
258
|
+
cacheSyncedAt: syncedAt,
|
|
259
|
+
cacheSyncedFrom: sourceDocumentPath,
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
await mkdir(targetVersionsDir, { recursive: true });
|
|
263
|
+
await writeFile(targetDocumentPath, JSON.stringify(payload.document, null, 2));
|
|
264
|
+
await writeFile(targetMetaPath, JSON.stringify(targetMeta, null, 2));
|
|
265
|
+
await writeFile(resolve(targetCacheDir, 'latest-import.json'), JSON.stringify(targetMeta, null, 2));
|
|
266
|
+
sendJson(res, 200, {
|
|
267
|
+
status: 'synced',
|
|
268
|
+
versionId,
|
|
269
|
+
sourceCacheDir: cacheDir,
|
|
270
|
+
sourceDocumentPath,
|
|
271
|
+
targetCacheDir,
|
|
272
|
+
targetDocumentPath,
|
|
273
|
+
syncedAt,
|
|
274
|
+
});
|
|
275
|
+
} catch (error) {
|
|
276
|
+
sendJson(res, 400, { error: error instanceof Error ? error.message : 'Sync version cache failed' });
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
|
|
200
280
|
server.middlewares.use('/api/openapi/auth-check', async (req, res) => {
|
|
201
281
|
if (req.method !== 'POST') {
|
|
202
282
|
sendJson(res, 405, { error: 'Method Not Allowed' });
|
|
@@ -536,6 +616,17 @@ function openapiImportPlugin() {
|
|
|
536
616
|
};
|
|
537
617
|
}
|
|
538
618
|
|
|
619
|
+
function webCacheSettings() {
|
|
620
|
+
const settings = getCacheSettings();
|
|
621
|
+
return {
|
|
622
|
+
...settings,
|
|
623
|
+
activeCacheDir: cacheDir,
|
|
624
|
+
effectiveNextCacheDir: settings.cacheDir,
|
|
625
|
+
restartRequired: resolve(cacheDir) !== resolve(settings.cacheDir),
|
|
626
|
+
activeMatchesDefault: resolve(cacheDir) === resolve(settings.defaultCacheDir),
|
|
627
|
+
};
|
|
628
|
+
}
|
|
629
|
+
|
|
539
630
|
async function readCachedDocument(versionId?: string) {
|
|
540
631
|
if (versionId) {
|
|
541
632
|
assertSafeVersionId(versionId);
|