feat: add scripts/build.sh, test.sh, check.sh
This commit is contained in:
Vendored
+5
@@ -0,0 +1,5 @@
|
||||
export * from './types';
|
||||
export { VerstakPluginAPI, createPluginAPI } from './plugin-api';
|
||||
export { RPCServer, RPCClient } from './rpc';
|
||||
export { createTestManifest, createTestPluginState, createMockPluginAPI, validateManifest, } from './test-utils';
|
||||
//# sourceMappingURL=index.d.ts.map
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,cAAc,CAAC"}
|
||||
Vendored
+6
@@ -0,0 +1,6 @@
|
||||
// Verstak Plugin SDK — Public API
|
||||
export * from './types';
|
||||
export { VerstakPluginAPI, createPluginAPI } from './plugin-api';
|
||||
export { RPCServer, RPCClient } from './rpc';
|
||||
export { createTestManifest, createTestPluginState, createMockPluginAPI, validateManifest, } from './test-utils';
|
||||
//# sourceMappingURL=index.js.map
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAElC,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,cAAc,CAAC"}
|
||||
Vendored
+79
@@ -0,0 +1,79 @@
|
||||
import type { PluginSettings } from './types';
|
||||
/**
|
||||
* VerstakPluginAPI — единственный способ для frontend плагина
|
||||
* общаться с core платформы.
|
||||
*
|
||||
* Экземпляр API передаётся плагину при активации через глобальную
|
||||
* переменную `window.__VERSTAK_PLUGIN_API__`.
|
||||
*/
|
||||
export declare class VerstakPluginAPI {
|
||||
private pluginId;
|
||||
private capabilities;
|
||||
constructor(pluginId: string);
|
||||
/**
|
||||
* Инициализация API — вызывается core после загрузки frontend bundle.
|
||||
* @internal
|
||||
*/
|
||||
_init(capabilities: string[]): void;
|
||||
/**
|
||||
* Зарегистрировать view для отображения в UI Shell.
|
||||
*/
|
||||
registerView(id: string, component: unknown): void;
|
||||
/**
|
||||
* Зарегистрировать панель настроек плагина.
|
||||
*/
|
||||
registerSettingsPanel(id: string, title: string, component: unknown): void;
|
||||
/**
|
||||
* Зарегистрировать команду для command palette.
|
||||
*/
|
||||
registerCommand(id: string, title: string, handler: () => void, keybinding?: string): void;
|
||||
/**
|
||||
* Зарегистрировать действия для файлов.
|
||||
*/
|
||||
registerFileAction(id: string, label: string, handler: (filePath: string) => void, capability?: string): void;
|
||||
/**
|
||||
* Зарегистрировать действия для заметок.
|
||||
*/
|
||||
registerNoteAction(id: string, label: string, handler: (noteId: string) => void, capability?: string): void;
|
||||
/**
|
||||
* Зарегистрировать provider поиска.
|
||||
*/
|
||||
registerSearchProvider(id: string, label: string, handler: (query: string) => unknown[]): void;
|
||||
/**
|
||||
* Проверить, доступна ли capability.
|
||||
*/
|
||||
hasCapability(name: string): boolean;
|
||||
/**
|
||||
* Получить список всех доступных capabilities.
|
||||
*/
|
||||
getAvailableCapabilities(): string[];
|
||||
/**
|
||||
* Вызвать backend метод плагина через RPC.
|
||||
*/
|
||||
callBackend(method: string, args?: unknown[]): Promise<unknown>;
|
||||
/**
|
||||
* Прочитать настройки плагина.
|
||||
*/
|
||||
readSettings(): Promise<PluginSettings>;
|
||||
/**
|
||||
* Записать настройки плагина.
|
||||
*/
|
||||
writeSettings(settings: PluginSettings): Promise<void>;
|
||||
/**
|
||||
* Подписаться на событие event bus.
|
||||
*/
|
||||
subscribe(event: string, handler: (payload: unknown) => void): void;
|
||||
/**
|
||||
* Опубликовать событие в event bus.
|
||||
*/
|
||||
publish(event: string, payload: unknown): void;
|
||||
private _postMessage;
|
||||
private _rpcCall;
|
||||
}
|
||||
/**
|
||||
* Создать экземпляр VerstakPluginAPI.
|
||||
* Core вызывает эту функцию после загрузки frontend bundle,
|
||||
* передавая pluginId и список доступных capabilities.
|
||||
*/
|
||||
export declare function createPluginAPI(pluginId: string): VerstakPluginAPI;
|
||||
//# sourceMappingURL=plugin-api.d.ts.map
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"plugin-api.d.ts","sourceRoot":"","sources":["../src/plugin-api.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C;;;;;;GAMG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAqB;gBAE7B,QAAQ,EAAE,MAAM;IAI5B;;;OAGG;IACH,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI;IAMnC;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI;IAIlD;;OAEG;IACH,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI;IAI1E;;OAEG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAI1F;;OAEG;IACH,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAI7G;;OAEG;IACH,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAI3G;;OAEG;IACH,sBAAsB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,EAAE,GAAG,IAAI;IAM9F;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIpC;;OAEG;IACH,wBAAwB,IAAI,MAAM,EAAE;IAMpC;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAMzE;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,cAAc,CAAC;IAK7C;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5D;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;IAInE;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAM9C,OAAO,CAAC,YAAY;YAMN,QAAQ;CAiBvB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAGlE"}
|
||||
Vendored
+141
@@ -0,0 +1,141 @@
|
||||
// Verstak Plugin SDK — VerstakPluginAPI
|
||||
// The official runtime API available to all plugins in the frontend context.
|
||||
/**
|
||||
* VerstakPluginAPI — единственный способ для frontend плагина
|
||||
* общаться с core платформы.
|
||||
*
|
||||
* Экземпляр API передаётся плагину при активации через глобальную
|
||||
* переменную `window.__VERSTAK_PLUGIN_API__`.
|
||||
*/
|
||||
export class VerstakPluginAPI {
|
||||
pluginId;
|
||||
capabilities = new Set();
|
||||
constructor(pluginId) {
|
||||
this.pluginId = pluginId;
|
||||
}
|
||||
/**
|
||||
* Инициализация API — вызывается core после загрузки frontend bundle.
|
||||
* @internal
|
||||
*/
|
||||
_init(capabilities) {
|
||||
this.capabilities = new Set(capabilities);
|
||||
}
|
||||
// ─── View Registration ─────────────────────────────────────
|
||||
/**
|
||||
* Зарегистрировать view для отображения в UI Shell.
|
||||
*/
|
||||
registerView(id, component) {
|
||||
this._postMessage('register.view', { id, component });
|
||||
}
|
||||
/**
|
||||
* Зарегистрировать панель настроек плагина.
|
||||
*/
|
||||
registerSettingsPanel(id, title, component) {
|
||||
this._postMessage('register.settingsPanel', { id, title, component });
|
||||
}
|
||||
/**
|
||||
* Зарегистрировать команду для command palette.
|
||||
*/
|
||||
registerCommand(id, title, handler, keybinding) {
|
||||
this._postMessage('register.command', { id, title, keybinding, handler: handler.toString() });
|
||||
}
|
||||
/**
|
||||
* Зарегистрировать действия для файлов.
|
||||
*/
|
||||
registerFileAction(id, label, handler, capability) {
|
||||
this._postMessage('register.fileAction', { id, label, handler: handler.toString(), capability });
|
||||
}
|
||||
/**
|
||||
* Зарегистрировать действия для заметок.
|
||||
*/
|
||||
registerNoteAction(id, label, handler, capability) {
|
||||
this._postMessage('register.noteAction', { id, label, handler: handler.toString(), capability });
|
||||
}
|
||||
/**
|
||||
* Зарегистрировать provider поиска.
|
||||
*/
|
||||
registerSearchProvider(id, label, handler) {
|
||||
this._postMessage('register.searchProvider', { id, label, handler: handler.toString() });
|
||||
}
|
||||
// ─── Capabilities ──────────────────────────────────────────
|
||||
/**
|
||||
* Проверить, доступна ли capability.
|
||||
*/
|
||||
hasCapability(name) {
|
||||
return this.capabilities.has(name);
|
||||
}
|
||||
/**
|
||||
* Получить список всех доступных capabilities.
|
||||
*/
|
||||
getAvailableCapabilities() {
|
||||
return Array.from(this.capabilities);
|
||||
}
|
||||
// ─── Backend Communication ─────────────────────────────────
|
||||
/**
|
||||
* Вызвать backend метод плагина через RPC.
|
||||
*/
|
||||
async callBackend(method, args = []) {
|
||||
return this._rpcCall(method, args);
|
||||
}
|
||||
// ─── Settings ──────────────────────────────────────────────
|
||||
/**
|
||||
* Прочитать настройки плагина.
|
||||
*/
|
||||
async readSettings() {
|
||||
const result = await this._rpcCall('readSettings', []);
|
||||
return result;
|
||||
}
|
||||
/**
|
||||
* Записать настройки плагина.
|
||||
*/
|
||||
async writeSettings(settings) {
|
||||
await this._rpcCall('writeSettings', [settings]);
|
||||
}
|
||||
// ─── Event Bus ─────────────────────────────────────────────
|
||||
/**
|
||||
* Подписаться на событие event bus.
|
||||
*/
|
||||
subscribe(event, handler) {
|
||||
this._postMessage('subscribe', { event, handler: handler.toString() });
|
||||
}
|
||||
/**
|
||||
* Опубликовать событие в event bus.
|
||||
*/
|
||||
publish(event, payload) {
|
||||
this._postMessage('publish', { event, payload });
|
||||
}
|
||||
// ─── Internal ──────────────────────────────────────────────
|
||||
_postMessage(type, data) {
|
||||
window.dispatchEvent(new CustomEvent('verstak:plugin', {
|
||||
detail: { pluginId: this.pluginId, type, data }
|
||||
}));
|
||||
}
|
||||
async _rpcCall(method, args) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const callId = `${this.pluginId}:${Date.now()}:${Math.random()}`;
|
||||
const handler = (event) => {
|
||||
if (event.detail.callId === callId) {
|
||||
window.removeEventListener('verstak:rpc:response', handler);
|
||||
if (event.detail.error) {
|
||||
reject(new Error(event.detail.error));
|
||||
}
|
||||
else {
|
||||
resolve(event.detail.result);
|
||||
}
|
||||
}
|
||||
};
|
||||
window.addEventListener('verstak:rpc:response', handler);
|
||||
this._postMessage('rpc', { callId, method, args });
|
||||
});
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Создать экземпляр VerstakPluginAPI.
|
||||
* Core вызывает эту функцию после загрузки frontend bundle,
|
||||
* передавая pluginId и список доступных capabilities.
|
||||
*/
|
||||
export function createPluginAPI(pluginId) {
|
||||
const api = new VerstakPluginAPI(pluginId);
|
||||
return api;
|
||||
}
|
||||
//# sourceMappingURL=plugin-api.js.map
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"plugin-api.js","sourceRoot":"","sources":["../src/plugin-api.ts"],"names":[],"mappings":"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"}
|
||||
Vendored
+57
@@ -0,0 +1,57 @@
|
||||
export type RPCTransport = 'stdio' | 'tcp';
|
||||
export interface RPCRequest {
|
||||
jsonrpc: '2.0';
|
||||
id: string;
|
||||
method: string;
|
||||
params: unknown[];
|
||||
}
|
||||
export interface RPCResponse {
|
||||
jsonrpc: '2.0';
|
||||
id: string;
|
||||
result?: unknown;
|
||||
error?: RPCError;
|
||||
}
|
||||
export interface RPCError {
|
||||
code: number;
|
||||
message: string;
|
||||
data?: unknown;
|
||||
}
|
||||
/**
|
||||
* RPC клиент для общения backend sidecar с core платформы.
|
||||
* Использует JSON-RPC 2.0 протокол.
|
||||
*/
|
||||
export declare class RPCServer {
|
||||
private handlers;
|
||||
constructor();
|
||||
/**
|
||||
* Зарегистрировать обработчик RPC метода.
|
||||
*/
|
||||
registerMethod(method: string, handler: (params: unknown[]) => Promise<unknown>): void;
|
||||
/**
|
||||
* Обработать входящий RPC запрос.
|
||||
*/
|
||||
handleRequest(request: RPCRequest): Promise<RPCResponse>;
|
||||
/**
|
||||
* Создать RPC запрос.
|
||||
*/
|
||||
createRequest(method: string, params?: unknown[]): RPCRequest;
|
||||
/**
|
||||
* Разобрать RPC ответ.
|
||||
*/
|
||||
parseResponse(data: string): RPCResponse;
|
||||
}
|
||||
/**
|
||||
* RPC клиент (для core, вызывает методы sidecar).
|
||||
*/
|
||||
export declare class RPCClient {
|
||||
private requestId;
|
||||
/**
|
||||
* Создать JSON-RPC запрос.
|
||||
*/
|
||||
call(method: string, params?: unknown[]): string;
|
||||
/**
|
||||
* Разобрать ответ.
|
||||
*/
|
||||
parseResponse(data: string): RPCResponse;
|
||||
}
|
||||
//# sourceMappingURL=rpc.d.ts.map
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,KAAK,CAAC;AAE3C,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,QAAQ,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;;GAGG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAA8D;;IAK9E;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAItF;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAsB9D;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,EAAO,GAAG,UAAU;IASjE;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;CAGzC;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,SAAS,CAAK;IAEtB;;OAEG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,EAAO,GAAG,MAAM;IAUpD;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;CAGzC"}
|
||||
Vendored
+82
@@ -0,0 +1,82 @@
|
||||
// Verstak Plugin SDK — RPC Client for Sidecar Communication
|
||||
/**
|
||||
* RPC клиент для общения backend sidecar с core платформы.
|
||||
* Использует JSON-RPC 2.0 протокол.
|
||||
*/
|
||||
export class RPCServer {
|
||||
handlers = new Map();
|
||||
constructor() {
|
||||
}
|
||||
/**
|
||||
* Зарегистрировать обработчик RPC метода.
|
||||
*/
|
||||
registerMethod(method, handler) {
|
||||
this.handlers.set(method, handler);
|
||||
}
|
||||
/**
|
||||
* Обработать входящий RPC запрос.
|
||||
*/
|
||||
async handleRequest(request) {
|
||||
const handler = this.handlers.get(request.method);
|
||||
if (!handler) {
|
||||
return {
|
||||
jsonrpc: '2.0',
|
||||
id: request.id,
|
||||
error: { code: -32601, message: `Method not found: ${request.method}` }
|
||||
};
|
||||
}
|
||||
try {
|
||||
const result = await handler(request.params);
|
||||
return { jsonrpc: '2.0', id: request.id, result };
|
||||
}
|
||||
catch (err) {
|
||||
return {
|
||||
jsonrpc: '2.0',
|
||||
id: request.id,
|
||||
error: { code: -32000, message: err instanceof Error ? err.message : String(err) }
|
||||
};
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Создать RPC запрос.
|
||||
*/
|
||||
createRequest(method, params = []) {
|
||||
return {
|
||||
jsonrpc: '2.0',
|
||||
id: `${Date.now()}:${Math.random()}`,
|
||||
method,
|
||||
params
|
||||
};
|
||||
}
|
||||
/**
|
||||
* Разобрать RPC ответ.
|
||||
*/
|
||||
parseResponse(data) {
|
||||
return JSON.parse(data);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* RPC клиент (для core, вызывает методы sidecar).
|
||||
*/
|
||||
export class RPCClient {
|
||||
requestId = 0;
|
||||
/**
|
||||
* Создать JSON-RPC запрос.
|
||||
*/
|
||||
call(method, params = []) {
|
||||
const request = {
|
||||
jsonrpc: '2.0',
|
||||
id: `${++this.requestId}`,
|
||||
method,
|
||||
params
|
||||
};
|
||||
return JSON.stringify(request) + '\n';
|
||||
}
|
||||
/**
|
||||
* Разобрать ответ.
|
||||
*/
|
||||
parseResponse(data) {
|
||||
return JSON.parse(data.trim());
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=rpc.js.map
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAwB5D;;;GAGG;AACH,MAAM,OAAO,SAAS;IACZ,QAAQ,GAAG,IAAI,GAAG,EAAmD,CAAC;IAE9E;IACA,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,MAAc,EAAE,OAAgD;QAC7E,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,OAAmB;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,qBAAqB,OAAO,CAAC,MAAM,EAAE,EAAE;aACxE,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC7C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC;QACpD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;aACnF,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,MAAc,EAAE,SAAoB,EAAE;QAClD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YACpC,MAAM;YACN,MAAM;SACP,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,IAAY;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAgB,CAAC;IACzC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,SAAS;IACZ,SAAS,GAAG,CAAC,CAAC;IAEtB;;OAEG;IACH,IAAI,CAAC,MAAc,EAAE,SAAoB,EAAE;QACzC,MAAM,OAAO,GAAe;YAC1B,OAAO,EAAE,KAAK;YACd,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE;YACzB,MAAM;YACN,MAAM;SACP,CAAC;QACF,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,IAAY;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAgB,CAAC;IAChD,CAAC;CACF"}
|
||||
Vendored
+31
@@ -0,0 +1,31 @@
|
||||
import type { PluginManifest, PluginState } from './types';
|
||||
/**
|
||||
* Создать тестовый manifest для unit-тестов.
|
||||
*/
|
||||
export declare function createTestManifest(overrides?: Partial<PluginManifest>): PluginManifest;
|
||||
/**
|
||||
* Создать тестовое состояние плагина.
|
||||
*/
|
||||
export declare function createTestPluginState(overrides?: Partial<PluginState>): PluginState;
|
||||
/**
|
||||
* Создать заглушку VerstakPluginAPI для тестов.
|
||||
*/
|
||||
export declare function createMockPluginAPI(): {
|
||||
registerView: ReturnType<typeof vi.fn>;
|
||||
registerCommand: ReturnType<typeof vi.fn>;
|
||||
registerSettingsPanel: ReturnType<typeof vi.fn>;
|
||||
hasCapability: ReturnType<typeof vi.fn>;
|
||||
callBackend: ReturnType<typeof vi.fn>;
|
||||
subscribe: ReturnType<typeof vi.fn>;
|
||||
publish: ReturnType<typeof vi.fn>;
|
||||
};
|
||||
/**
|
||||
* Валидатор plugin manifest.
|
||||
*/
|
||||
export declare function validateManifest(manifest: unknown): {
|
||||
valid: boolean;
|
||||
errors: string[];
|
||||
};
|
||||
import { vi } from 'vitest';
|
||||
export { vi };
|
||||
//# sourceMappingURL=test-utils.d.ts.map
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../src/test-utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3D;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,CAetF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CASnF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI;IACrC,YAAY,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IACvC,eAAe,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1C,qBAAqB,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAChD,aAAa,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IACxC,WAAW,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IACtC,SAAS,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IACpC,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;CACnC,CAUA;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAgCxF;AAGD,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,EAAE,EAAE,CAAC"}
|
||||
Vendored
+83
@@ -0,0 +1,83 @@
|
||||
// Verstak Plugin SDK — Test Utilities
|
||||
/**
|
||||
* Создать тестовый manifest для unit-тестов.
|
||||
*/
|
||||
export function createTestManifest(overrides) {
|
||||
return {
|
||||
schemaVersion: 1,
|
||||
id: 'test.plugin',
|
||||
name: 'Test Plugin',
|
||||
version: '0.1.0',
|
||||
apiVersion: '1',
|
||||
description: 'A test plugin for platform verification',
|
||||
source: 'local',
|
||||
provides: ['test.capability'],
|
||||
requires: [],
|
||||
optionalRequires: [],
|
||||
permissions: ['events.publish', 'events.subscribe'],
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
/**
|
||||
* Создать тестовое состояние плагина.
|
||||
*/
|
||||
export function createTestPluginState(overrides) {
|
||||
return {
|
||||
id: 'test.plugin',
|
||||
manifest: createTestManifest(),
|
||||
status: 'loaded',
|
||||
enabled: true,
|
||||
loadedAt: new Date().toISOString(),
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
/**
|
||||
* Создать заглушку VerstakPluginAPI для тестов.
|
||||
*/
|
||||
export function createMockPluginAPI() {
|
||||
return {
|
||||
registerView: vi.fn(),
|
||||
registerCommand: vi.fn(),
|
||||
registerSettingsPanel: vi.fn(),
|
||||
hasCapability: vi.fn().mockReturnValue(false),
|
||||
callBackend: vi.fn().mockResolvedValue(undefined),
|
||||
subscribe: vi.fn(),
|
||||
publish: vi.fn(),
|
||||
};
|
||||
}
|
||||
/**
|
||||
* Валидатор plugin manifest.
|
||||
*/
|
||||
export function validateManifest(manifest) {
|
||||
const errors = [];
|
||||
if (!manifest || typeof manifest !== 'object') {
|
||||
return { valid: false, errors: ['Manifest must be an object'] };
|
||||
}
|
||||
const m = manifest;
|
||||
if (m.schemaVersion !== 1) {
|
||||
errors.push(`schemaVersion must be 1, got ${m.schemaVersion}`);
|
||||
}
|
||||
if (typeof m.id !== 'string' || !m.id) {
|
||||
errors.push('id must be a non-empty string');
|
||||
}
|
||||
if (typeof m.name !== 'string' || !m.name) {
|
||||
errors.push('name must be a non-empty string');
|
||||
}
|
||||
if (typeof m.version !== 'string' || !/^\d+\.\d+\.\d+/.test(m.version)) {
|
||||
errors.push('version must be a valid semver (e.g. 0.1.0)');
|
||||
}
|
||||
if (typeof m.apiVersion !== 'string' || !m.apiVersion) {
|
||||
errors.push('apiVersion must be a non-empty string');
|
||||
}
|
||||
if (!Array.isArray(m.provides) || m.provides.length === 0) {
|
||||
errors.push('provides must be a non-empty array');
|
||||
}
|
||||
if (!Array.isArray(m.permissions) || m.permissions.length === 0) {
|
||||
errors.push('permissions must be a non-empty array');
|
||||
}
|
||||
return { valid: errors.length === 0, errors };
|
||||
}
|
||||
// Re-export vi for test files
|
||||
import { vi } from 'vitest';
|
||||
export { vi };
|
||||
//# sourceMappingURL=test-utils.js.map
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../src/test-utils.ts"],"names":[],"mappings":"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"}
|
||||
Vendored
+263
@@ -0,0 +1,263 @@
|
||||
export type PluginSource = 'official' | 'local' | 'third-party';
|
||||
export interface PluginManifest {
|
||||
schemaVersion: 1;
|
||||
id: string;
|
||||
name: string;
|
||||
version: string;
|
||||
apiVersion: string;
|
||||
description?: string;
|
||||
source?: PluginSource;
|
||||
icon?: string;
|
||||
provides: string[];
|
||||
requires?: string[];
|
||||
optionalRequires?: string[];
|
||||
permissions: Permission[];
|
||||
frontend?: FrontendConfig;
|
||||
backend?: BackendConfig;
|
||||
migrations?: MigrationConfig;
|
||||
contributes?: ContributionPoints;
|
||||
sync?: SyncConfig;
|
||||
}
|
||||
export interface FrontendConfig {
|
||||
entry: string;
|
||||
style?: string;
|
||||
}
|
||||
export interface BackendConfig {
|
||||
type: 'sidecar';
|
||||
entry: Record<string, string>;
|
||||
healthCheck?: HealthCheckConfig;
|
||||
}
|
||||
export interface HealthCheckConfig {
|
||||
type?: 'rpc' | 'stdio' | 'tcp';
|
||||
timeout?: number;
|
||||
}
|
||||
export interface MigrationConfig {
|
||||
path: string;
|
||||
}
|
||||
export interface SyncConfig {
|
||||
namespaces?: string[];
|
||||
participate?: boolean;
|
||||
}
|
||||
export type CapabilityName = string;
|
||||
export interface CapabilityEntry {
|
||||
name: CapabilityName;
|
||||
description: string;
|
||||
status: 'stable' | 'draft' | 'deprecated';
|
||||
}
|
||||
export type Permission = 'vault.read' | 'vault.write' | 'vault.watch' | 'storage.namespace' | 'storage.migrations' | 'events.publish' | 'events.subscribe' | 'ui.register' | 'commands.register' | 'network.local' | 'network.remote' | 'process.spawn' | 'secrets.read' | 'secrets.write' | 'sync.participate';
|
||||
export interface PermissionEntry {
|
||||
name: Permission;
|
||||
description: string;
|
||||
dangerous: boolean;
|
||||
}
|
||||
export interface ContributionPoints {
|
||||
views?: ContributionView[];
|
||||
commands?: ContributionCommand[];
|
||||
settingsPanels?: ContributionSettingsPanel[];
|
||||
sidebarItems?: ContributionSidebarItem[];
|
||||
fileActions?: ContributionAction[];
|
||||
noteActions?: ContributionAction[];
|
||||
contextMenuEntries?: ContributionContextMenuEntry[];
|
||||
searchProviders?: ContributionSearchProvider[];
|
||||
activityProviders?: ContributionActivityProvider[];
|
||||
statusBarItems?: ContributionStatusBarItem[];
|
||||
}
|
||||
export interface ContributionView {
|
||||
id: string;
|
||||
title: string;
|
||||
icon?: string;
|
||||
component: string;
|
||||
}
|
||||
export interface ContributionCommand {
|
||||
id: string;
|
||||
title: string;
|
||||
keybinding?: string;
|
||||
icon?: string;
|
||||
handler?: string;
|
||||
}
|
||||
export interface ContributionSettingsPanel {
|
||||
id: string;
|
||||
title: string;
|
||||
component: string;
|
||||
icon?: string;
|
||||
}
|
||||
export interface ContributionSidebarItem {
|
||||
id: string;
|
||||
title: string;
|
||||
icon?: string;
|
||||
view: string;
|
||||
position?: number;
|
||||
}
|
||||
export interface ContributionAction {
|
||||
id: string;
|
||||
label: string;
|
||||
icon?: string;
|
||||
capability?: CapabilityName;
|
||||
handler?: string;
|
||||
}
|
||||
export interface ContributionContextMenuEntry {
|
||||
id: string;
|
||||
label: string;
|
||||
context: 'file' | 'note' | 'case' | 'folder';
|
||||
group?: string;
|
||||
capability?: CapabilityName;
|
||||
handler?: string;
|
||||
}
|
||||
export interface ContributionSearchProvider {
|
||||
id: string;
|
||||
label: string;
|
||||
handler: string;
|
||||
}
|
||||
export interface ContributionActivityProvider {
|
||||
id: string;
|
||||
events?: string[];
|
||||
handler: string;
|
||||
}
|
||||
export interface ContributionStatusBarItem {
|
||||
id: string;
|
||||
label: string;
|
||||
position?: 'left' | 'right';
|
||||
handler?: string;
|
||||
}
|
||||
export type PluginStatus = 'discovered' | 'disabled' | 'loading' | 'loaded' | 'degraded' | 'failed' | 'incompatible' | 'missing-required-capability';
|
||||
export interface PluginState {
|
||||
id: string;
|
||||
manifest: PluginManifest;
|
||||
status: PluginStatus;
|
||||
error?: string;
|
||||
enabled: boolean;
|
||||
loadedAt?: string;
|
||||
}
|
||||
export interface VerstakEvent {
|
||||
name: string;
|
||||
timestamp: string;
|
||||
payload: Record<string, unknown>;
|
||||
}
|
||||
export interface BrowserCapturePageEvent extends VerstakEvent {
|
||||
name: 'browser.capture.page';
|
||||
payload: {
|
||||
url: string;
|
||||
title: string;
|
||||
html?: string;
|
||||
text?: string;
|
||||
capturedAt: string;
|
||||
domain?: string;
|
||||
};
|
||||
}
|
||||
export interface BrowserCaptureSelectionEvent extends VerstakEvent {
|
||||
name: 'browser.capture.selection';
|
||||
payload: {
|
||||
url: string;
|
||||
title: string;
|
||||
text: string;
|
||||
capturedAt: string;
|
||||
domain?: string;
|
||||
};
|
||||
}
|
||||
export interface BrowserCaptureLinkEvent extends VerstakEvent {
|
||||
name: 'browser.capture.link';
|
||||
payload: {
|
||||
url: string;
|
||||
title?: string;
|
||||
capturedAt: string;
|
||||
domain?: string;
|
||||
};
|
||||
}
|
||||
export interface VaultOpenedEvent extends VerstakEvent {
|
||||
name: 'vault.opened';
|
||||
payload: {
|
||||
path: string;
|
||||
version?: string;
|
||||
openedAt: string;
|
||||
};
|
||||
}
|
||||
export interface CaseSelectedEvent extends VerstakEvent {
|
||||
name: 'case.selected';
|
||||
payload: {
|
||||
caseId: string;
|
||||
casePath: string;
|
||||
caseType?: string;
|
||||
selectedAt: string;
|
||||
};
|
||||
}
|
||||
export interface FileChangedEvent extends VerstakEvent {
|
||||
name: 'file.changed';
|
||||
payload: {
|
||||
path: string;
|
||||
size?: number;
|
||||
changedAt: string;
|
||||
};
|
||||
}
|
||||
export interface NoteSavedEvent extends VerstakEvent {
|
||||
name: 'note.saved';
|
||||
payload: {
|
||||
noteId: string;
|
||||
title?: string;
|
||||
path: string;
|
||||
caseId?: string;
|
||||
savedAt: string;
|
||||
};
|
||||
}
|
||||
export interface PluginEnabledEvent extends VerstakEvent {
|
||||
name: 'plugin.enabled';
|
||||
payload: {
|
||||
pluginId: string;
|
||||
version?: string;
|
||||
enabledAt: string;
|
||||
};
|
||||
}
|
||||
export interface PluginDisabledEvent extends VerstakEvent {
|
||||
name: 'plugin.disabled';
|
||||
payload: {
|
||||
pluginId: string;
|
||||
disabledAt: string;
|
||||
};
|
||||
}
|
||||
export type SyncOpType = 'add' | 'modify' | 'delete' | 'rename';
|
||||
export type SyncEntityType = 'file' | 'note' | 'plugin_state' | 'vault_meta';
|
||||
export interface SyncOperation {
|
||||
op: SyncOpType;
|
||||
id: string;
|
||||
timestamp: string;
|
||||
deviceId?: string;
|
||||
entityType?: SyncEntityType;
|
||||
entityPath?: string;
|
||||
hash?: string;
|
||||
size?: number;
|
||||
mimeType?: string;
|
||||
pluginNamespace?: string;
|
||||
oldPath?: string;
|
||||
metadata?: Record<string, string>;
|
||||
}
|
||||
export interface SyncBatch {
|
||||
batchId: string;
|
||||
deviceId: string;
|
||||
operations: SyncOperation[];
|
||||
timestamp: string;
|
||||
lastSyncTimestamp?: string;
|
||||
sequence?: number;
|
||||
}
|
||||
export interface SyncManifestEntry {
|
||||
path: string;
|
||||
hash: string;
|
||||
size?: number;
|
||||
updatedAt: string;
|
||||
deleted?: boolean;
|
||||
}
|
||||
export interface SyncManifest {
|
||||
deviceId: string;
|
||||
entries: SyncManifestEntry[];
|
||||
}
|
||||
export interface Conflict {
|
||||
entityPath: string;
|
||||
localHash: string;
|
||||
remoteHash: string;
|
||||
localTimestamp: string;
|
||||
remoteTimestamp: string;
|
||||
resolution?: 'local_wins' | 'remote_wins' | 'manual';
|
||||
resolvedAt?: string;
|
||||
}
|
||||
export interface PluginSettings {
|
||||
[key: string]: unknown;
|
||||
}
|
||||
//# sourceMappingURL=types.d.ts.map
|
||||
Vendored
+1
File diff suppressed because one or more lines are too long
Vendored
+3
@@ -0,0 +1,3 @@
|
||||
// Verstak Plugin SDK — Core TypeScript Types
|
||||
export {};
|
||||
//# sourceMappingURL=types.js.map
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,6CAA6C"}
|
||||
Reference in New Issue
Block a user