Documente et illustre deux contrats SDK : - Multi-fichiers ESM : le `main` du manifeste peut importer d'autres fichiers du package via specifiers relatifs, servis par IdeA sur `idea-plugin://` (build `tsc` non bundlé). Le packager embarque tout `dist/**/*.js` et vérifie la présence du `main`. Les bare specifiers (`node_modules`) restent hors contrat : à bundler ou vendorer. - Storage plugin-owned : `ctx.storage` est la place canonique de l'état interne du plugin (compteurs, flags, préférences, caches), hors des fichiers projet. Les APIs workspace/config restent pour le contenu project-owned. L'exemple hello-plugin est éclaté en modules (constants, core/layout, core/workspace, core/storage) pour exercer l'import relatif et le storage. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
33 lines
1.1 KiB
TypeScript
33 lines
1.1 KiB
TypeScript
import type { ActivateContext } from "@idea/plugin-sdk";
|
|
import { STORAGE_KEYS } from "../constants.js";
|
|
|
|
export async function initializePluginStorage(ctx: ActivateContext): Promise<void> {
|
|
if (!ctx.storage) {
|
|
ctx.logger.warn("plugin-owned storage unavailable");
|
|
return;
|
|
}
|
|
|
|
const activationCount = await incrementStoredNumber(ctx, STORAGE_KEYS.activationCount);
|
|
const initialized = await ctx.storage.get<boolean>(STORAGE_KEYS.initialized);
|
|
if (!initialized) {
|
|
await ctx.storage.set(STORAGE_KEYS.initialized, true);
|
|
}
|
|
|
|
ctx.logger.info("plugin-owned storage ready", {
|
|
activationCount,
|
|
initialized: initialized ?? false
|
|
});
|
|
}
|
|
|
|
export async function recordCommandRun(ctx: ActivateContext): Promise<number | undefined> {
|
|
if (!ctx.storage) return undefined;
|
|
return incrementStoredNumber(ctx, STORAGE_KEYS.commandRunCount);
|
|
}
|
|
|
|
async function incrementStoredNumber(ctx: ActivateContext, key: string): Promise<number> {
|
|
const current = await ctx.storage?.get<number>(key);
|
|
const next = typeof current === "number" && Number.isFinite(current) ? current + 1 : 1;
|
|
await ctx.storage?.set(key, next);
|
|
return next;
|
|
}
|