@primeuicom/mcp 0.1.0
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 +14 -0
- package/dist/lib/fs.d.ts +4 -0
- package/dist/lib/fs.js +27 -0
- package/dist/lib/fs.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.js +126 -0
- package/dist/server.js.map +1 -0
- package/dist/service.d.ts +2 -0
- package/dist/service.js +19 -0
- package/dist/service.js.map +1 -0
- package/dist/services/project-sync-service.d.ts +21 -0
- package/dist/services/project-sync-service.js +56 -0
- package/dist/services/project-sync-service.js.map +1 -0
- package/dist/sources/fixture-provider.d.ts +16 -0
- package/dist/sources/fixture-provider.js +74 -0
- package/dist/sources/fixture-provider.js.map +1 -0
- package/dist/sources/project-data-provider.d.ts +6 -0
- package/dist/sources/project-data-provider.js +2 -0
- package/dist/sources/project-data-provider.js.map +1 -0
- package/dist/sources/project-sync-source.d.ts +7 -0
- package/dist/sources/project-sync-source.js +2 -0
- package/dist/sources/project-sync-source.js.map +1 -0
- package/dist/types.d.ts +22 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +32 -0
package/README.md
ADDED
package/dist/lib/fs.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function ensureDir(dirPath: string): Promise<void>;
|
|
2
|
+
export declare function resetDir(dirPath: string): Promise<void>;
|
|
3
|
+
export declare function writeUtf8(filePath: string, content: string): Promise<void>;
|
|
4
|
+
export declare function extractZip(zipPath: string, targetDir: string): Promise<void>;
|
package/dist/lib/fs.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { mkdir, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { promisify } from "node:util";
|
|
5
|
+
const execFileAsync = promisify(execFile);
|
|
6
|
+
export async function ensureDir(dirPath) {
|
|
7
|
+
await mkdir(dirPath, { recursive: true });
|
|
8
|
+
}
|
|
9
|
+
export async function resetDir(dirPath) {
|
|
10
|
+
await rm(dirPath, { recursive: true, force: true });
|
|
11
|
+
await mkdir(dirPath, { recursive: true });
|
|
12
|
+
}
|
|
13
|
+
export async function writeUtf8(filePath, content) {
|
|
14
|
+
await ensureDir(path.dirname(filePath));
|
|
15
|
+
await writeFile(filePath, content, "utf-8");
|
|
16
|
+
}
|
|
17
|
+
export async function extractZip(zipPath, targetDir) {
|
|
18
|
+
await ensureDir(targetDir);
|
|
19
|
+
try {
|
|
20
|
+
await execFileAsync("unzip", ["-o", zipPath, "-d", targetDir]);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
const details = error instanceof Error ? error.message : String(error);
|
|
24
|
+
throw new Error(`Failed to extract zip at "${zipPath}". Ensure "unzip" is installed. ${details}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=fs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/lib/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAErC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;AAEzC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAe;IAC7C,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAe;IAC5C,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IACnD,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,OAAe;IAC/D,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAA;IACvC,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,SAAiB;IACjE,MAAM,SAAS,CAAC,SAAS,CAAC,CAAA;IAE1B,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAA;IAChE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACtE,MAAM,IAAI,KAAK,CAAC,6BAA6B,OAAO,mCAAmC,OAAO,EAAE,CAAC,CAAA;IACnG,CAAC;AACH,CAAC"}
|
package/dist/server.d.ts
ADDED
package/dist/server.js
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { z } from "zod/v3";
|
|
3
|
+
function okResult(title, data) {
|
|
4
|
+
return {
|
|
5
|
+
content: [{ type: "text", text: `${title} completed` }],
|
|
6
|
+
structuredContent: data,
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
function errorResult(error) {
|
|
10
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
11
|
+
return {
|
|
12
|
+
isError: true,
|
|
13
|
+
content: [{ type: "text", text: `primeui mcp error: ${message}` }],
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export function createPrimeUiMcpServer(source) {
|
|
17
|
+
const server = new McpServer({
|
|
18
|
+
name: "primeui-mcp-server",
|
|
19
|
+
version: "0.1.0",
|
|
20
|
+
});
|
|
21
|
+
server.registerTool("primeui_get_project_info", {
|
|
22
|
+
title: "PrimeUI Project Info",
|
|
23
|
+
description: "Get current project info for PrimeUI export context.",
|
|
24
|
+
inputSchema: {},
|
|
25
|
+
outputSchema: {
|
|
26
|
+
projectId: z.string(),
|
|
27
|
+
projectName: z.string(),
|
|
28
|
+
metadata: z.record(z.unknown()),
|
|
29
|
+
pages: z.array(z.object({
|
|
30
|
+
id: z.string(),
|
|
31
|
+
title: z.string(),
|
|
32
|
+
slug: z.string(),
|
|
33
|
+
pageType: z.string(),
|
|
34
|
+
})),
|
|
35
|
+
},
|
|
36
|
+
annotations: {
|
|
37
|
+
readOnlyHint: true,
|
|
38
|
+
destructiveHint: false,
|
|
39
|
+
idempotentHint: true,
|
|
40
|
+
openWorldHint: false,
|
|
41
|
+
},
|
|
42
|
+
}, async () => {
|
|
43
|
+
try {
|
|
44
|
+
const info = await source.getProjectInfo();
|
|
45
|
+
return okResult("primeui_get_project_info", info);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
return errorResult(error);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
server.registerTool("primeui_list_exports", {
|
|
52
|
+
title: "PrimeUI Export List",
|
|
53
|
+
description: "List available PrimeUI exports.",
|
|
54
|
+
inputSchema: {},
|
|
55
|
+
outputSchema: {
|
|
56
|
+
exports: z.array(z.object({
|
|
57
|
+
id: z.string(),
|
|
58
|
+
status: z.enum(["in_progress", "completed", "failed"]),
|
|
59
|
+
createdAt: z.string(),
|
|
60
|
+
})),
|
|
61
|
+
},
|
|
62
|
+
annotations: {
|
|
63
|
+
readOnlyHint: true,
|
|
64
|
+
destructiveHint: false,
|
|
65
|
+
idempotentHint: true,
|
|
66
|
+
openWorldHint: false,
|
|
67
|
+
},
|
|
68
|
+
}, async () => {
|
|
69
|
+
try {
|
|
70
|
+
const exportsList = await source.listExports();
|
|
71
|
+
return okResult("primeui_list_exports", { exports: exportsList });
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
return errorResult(error);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
server.registerTool("primeui_download_export", {
|
|
78
|
+
title: "PrimeUI Download Export",
|
|
79
|
+
description: "Download an export by id into .primeui/temp/exports/[exportId].",
|
|
80
|
+
inputSchema: {
|
|
81
|
+
id: z.string().describe("Export id from primeui_list_exports"),
|
|
82
|
+
},
|
|
83
|
+
outputSchema: {
|
|
84
|
+
exportId: z.string(),
|
|
85
|
+
projectPath: z.string(),
|
|
86
|
+
},
|
|
87
|
+
annotations: {
|
|
88
|
+
readOnlyHint: false,
|
|
89
|
+
destructiveHint: false,
|
|
90
|
+
idempotentHint: true,
|
|
91
|
+
openWorldHint: false,
|
|
92
|
+
},
|
|
93
|
+
}, async ({ id }) => {
|
|
94
|
+
try {
|
|
95
|
+
const result = await source.downloadExportById(id);
|
|
96
|
+
return okResult("primeui_download_export", result);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
return errorResult(error);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
server.registerTool("primeui_clear_temp", {
|
|
103
|
+
title: "PrimeUI Clear Temp",
|
|
104
|
+
description: "Clear .primeui/temp and recreate baseline temp structure.",
|
|
105
|
+
inputSchema: {},
|
|
106
|
+
outputSchema: {
|
|
107
|
+
success: z.boolean(),
|
|
108
|
+
},
|
|
109
|
+
annotations: {
|
|
110
|
+
readOnlyHint: false,
|
|
111
|
+
destructiveHint: true,
|
|
112
|
+
idempotentHint: true,
|
|
113
|
+
openWorldHint: false,
|
|
114
|
+
},
|
|
115
|
+
}, async () => {
|
|
116
|
+
try {
|
|
117
|
+
await source.clearTemp();
|
|
118
|
+
return okResult("primeui_clear_temp", { success: true });
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
return errorResult(error);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
return server;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/service.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { createPrimeUiMcpServer } from "./server.js";
|
|
4
|
+
import { ProjectSyncService } from "./services/project-sync-service.js";
|
|
5
|
+
import { FixtureProjectDataProvider } from "./sources/fixture-provider.js";
|
|
6
|
+
async function main() {
|
|
7
|
+
const projectRoot = process.env.PRIMEUI_PROJECT_ROOT || process.cwd();
|
|
8
|
+
const provider = new FixtureProjectDataProvider({ projectRoot });
|
|
9
|
+
const syncService = new ProjectSyncService({ projectRoot, provider });
|
|
10
|
+
const server = createPrimeUiMcpServer(syncService);
|
|
11
|
+
const transport = new StdioServerTransport();
|
|
12
|
+
await server.connect(transport);
|
|
13
|
+
console.error(`[primeui-mcp] running for root: ${projectRoot}`);
|
|
14
|
+
}
|
|
15
|
+
main().catch((error) => {
|
|
16
|
+
console.error("[primeui-mcp] failed to start", error);
|
|
17
|
+
process.exit(1);
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAEhF,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAA;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAA;AAE1E,KAAK,UAAU,IAAI;IACjB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;IACrE,MAAM,QAAQ,GAAG,IAAI,0BAA0B,CAAC,EAAE,WAAW,EAAE,CAAC,CAAA;IAChE,MAAM,WAAW,GAAG,IAAI,kBAAkB,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAA;IACrE,MAAM,MAAM,GAAG,sBAAsB,CAAC,WAAW,CAAC,CAAA;IAElD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAA;IAC5C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAE/B,OAAO,CAAC,KAAK,CAAC,mCAAmC,WAAW,EAAE,CAAC,CAAA;AACjE,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAA;IACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ProjectDataProvider } from "../sources/project-data-provider.js";
|
|
2
|
+
import type { ProjectSyncSource } from "../sources/project-sync-source.js";
|
|
3
|
+
import type { PrimeUiDownloadResult, PrimeUiExport, PrimeUiProjectInfo } from "../types.js";
|
|
4
|
+
type ProjectSyncServiceOptions = {
|
|
5
|
+
projectRoot: string;
|
|
6
|
+
provider: ProjectDataProvider;
|
|
7
|
+
};
|
|
8
|
+
export declare class ProjectSyncService implements ProjectSyncSource {
|
|
9
|
+
private readonly provider;
|
|
10
|
+
private readonly projectRoot;
|
|
11
|
+
private readonly primeUiRoot;
|
|
12
|
+
private readonly tempRoot;
|
|
13
|
+
private readonly exportsRoot;
|
|
14
|
+
constructor(options: ProjectSyncServiceOptions);
|
|
15
|
+
getProjectInfo(): Promise<PrimeUiProjectInfo>;
|
|
16
|
+
listExports(): Promise<PrimeUiExport[]>;
|
|
17
|
+
downloadExportById(id: string): Promise<PrimeUiDownloadResult>;
|
|
18
|
+
clearTemp(): Promise<void>;
|
|
19
|
+
private ensureTempLayout;
|
|
20
|
+
}
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { copyFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { ensureDir, extractZip, resetDir, writeUtf8 } from "../lib/fs.js";
|
|
4
|
+
export class ProjectSyncService {
|
|
5
|
+
provider;
|
|
6
|
+
projectRoot;
|
|
7
|
+
primeUiRoot;
|
|
8
|
+
tempRoot;
|
|
9
|
+
exportsRoot;
|
|
10
|
+
constructor(options) {
|
|
11
|
+
this.projectRoot = options.projectRoot;
|
|
12
|
+
this.provider = options.provider;
|
|
13
|
+
this.primeUiRoot = path.join(this.projectRoot, ".primeui");
|
|
14
|
+
this.tempRoot = path.join(this.primeUiRoot, "temp");
|
|
15
|
+
this.exportsRoot = path.join(this.tempRoot, "exports");
|
|
16
|
+
}
|
|
17
|
+
async getProjectInfo() {
|
|
18
|
+
await this.ensureTempLayout();
|
|
19
|
+
return this.provider.getProjectInfo();
|
|
20
|
+
}
|
|
21
|
+
async listExports() {
|
|
22
|
+
await this.ensureTempLayout();
|
|
23
|
+
return this.provider.listExports();
|
|
24
|
+
}
|
|
25
|
+
async downloadExportById(id) {
|
|
26
|
+
await this.ensureTempLayout();
|
|
27
|
+
const exportsList = await this.provider.listExports();
|
|
28
|
+
const selected = exportsList.find((item) => item.id === id);
|
|
29
|
+
if (!selected) {
|
|
30
|
+
throw new Error(`Export not found: ${id}`);
|
|
31
|
+
}
|
|
32
|
+
const sourceZipPath = await this.provider.resolveExportArchivePath(id);
|
|
33
|
+
const targetZipPath = path.join(this.exportsRoot, `${id}.zip`);
|
|
34
|
+
const targetProjectPath = path.join(this.exportsRoot, id);
|
|
35
|
+
await ensureDir(this.exportsRoot);
|
|
36
|
+
await copyFile(sourceZipPath, targetZipPath);
|
|
37
|
+
await resetDir(targetProjectPath);
|
|
38
|
+
await extractZip(targetZipPath, targetProjectPath);
|
|
39
|
+
return {
|
|
40
|
+
exportId: id,
|
|
41
|
+
projectPath: targetProjectPath,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
async clearTemp() {
|
|
45
|
+
await resetDir(this.tempRoot);
|
|
46
|
+
await writeUtf8(path.join(this.tempRoot, ".gitkeep"), "");
|
|
47
|
+
await ensureDir(this.exportsRoot);
|
|
48
|
+
}
|
|
49
|
+
async ensureTempLayout() {
|
|
50
|
+
await ensureDir(this.primeUiRoot);
|
|
51
|
+
await ensureDir(this.tempRoot);
|
|
52
|
+
await ensureDir(this.exportsRoot);
|
|
53
|
+
await writeUtf8(path.join(this.tempRoot, ".gitkeep"), "");
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=project-sync-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-sync-service.js","sourceRoot":"","sources":["../../src/services/project-sync-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { PrimeUiExport, PrimeUiProjectInfo } from "../types.js";
|
|
2
|
+
import type { ProjectDataProvider } from "./project-data-provider.js";
|
|
3
|
+
type FixtureProjectDataProviderOptions = {
|
|
4
|
+
projectRoot: string;
|
|
5
|
+
fixtureArchivePath?: string;
|
|
6
|
+
};
|
|
7
|
+
export declare class FixtureProjectDataProvider implements ProjectDataProvider {
|
|
8
|
+
private readonly projectRoot;
|
|
9
|
+
private readonly fixtureArchivePath;
|
|
10
|
+
constructor(options: FixtureProjectDataProviderOptions);
|
|
11
|
+
getProjectInfo(): Promise<PrimeUiProjectInfo>;
|
|
12
|
+
listExports(): Promise<PrimeUiExport[]>;
|
|
13
|
+
resolveExportArchivePath(exportId: string): Promise<string>;
|
|
14
|
+
private resolvePath;
|
|
15
|
+
}
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
// TEMPORARY: phase 1 fixture data lives in this module until API integration is ready.
|
|
4
|
+
const PHASE1_FIXTURE_ARCHIVE_PATH = "../../storage/exports_4xrvaTuxyHJJxj0iTdN34/2026-02-17-LIOMDP.zip";
|
|
5
|
+
const PHASE1_PROJECT_DESCRIPTION = "Temporary phase 1 project description.";
|
|
6
|
+
const FIXTURE_PROJECT_INFO = {
|
|
7
|
+
projectId: "primeui-phase1-project",
|
|
8
|
+
projectName: "PrimeUI Phase 1 Project",
|
|
9
|
+
metadata: {
|
|
10
|
+
phase: "phase-1",
|
|
11
|
+
},
|
|
12
|
+
pages: [
|
|
13
|
+
{
|
|
14
|
+
id: "page-home",
|
|
15
|
+
title: "Home",
|
|
16
|
+
slug: "/",
|
|
17
|
+
pageType: "landing",
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
id: "page-pricing",
|
|
21
|
+
title: "Pricing",
|
|
22
|
+
slug: "/pricing",
|
|
23
|
+
pageType: "pricing",
|
|
24
|
+
},
|
|
25
|
+
],
|
|
26
|
+
};
|
|
27
|
+
const FIXTURE_EXPORTS = [
|
|
28
|
+
{
|
|
29
|
+
id: "export-2026-02-17-liomdp",
|
|
30
|
+
status: "completed",
|
|
31
|
+
createdAt: "2026-02-17T06:57:00.000Z",
|
|
32
|
+
},
|
|
33
|
+
];
|
|
34
|
+
export class FixtureProjectDataProvider {
|
|
35
|
+
projectRoot;
|
|
36
|
+
fixtureArchivePath;
|
|
37
|
+
constructor(options) {
|
|
38
|
+
this.projectRoot = options.projectRoot;
|
|
39
|
+
this.fixtureArchivePath = options.fixtureArchivePath ?? PHASE1_FIXTURE_ARCHIVE_PATH;
|
|
40
|
+
}
|
|
41
|
+
async getProjectInfo() {
|
|
42
|
+
return {
|
|
43
|
+
...FIXTURE_PROJECT_INFO,
|
|
44
|
+
metadata: {
|
|
45
|
+
...FIXTURE_PROJECT_INFO.metadata,
|
|
46
|
+
"project-description": PHASE1_PROJECT_DESCRIPTION,
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
async listExports() {
|
|
51
|
+
return [...FIXTURE_EXPORTS];
|
|
52
|
+
}
|
|
53
|
+
async resolveExportArchivePath(exportId) {
|
|
54
|
+
const selected = FIXTURE_EXPORTS.find((item) => item.id === exportId);
|
|
55
|
+
if (!selected) {
|
|
56
|
+
throw new Error(`Export not found: ${exportId}`);
|
|
57
|
+
}
|
|
58
|
+
const archivePath = this.resolvePath(this.fixtureArchivePath);
|
|
59
|
+
try {
|
|
60
|
+
await readFile(archivePath);
|
|
61
|
+
return archivePath;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
throw new Error(`Fixture archive not found at "${archivePath}". Update PHASE1_FIXTURE_ARCHIVE_PATH in fixture-provider.ts.`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
resolvePath(rawPath) {
|
|
68
|
+
if (path.isAbsolute(rawPath)) {
|
|
69
|
+
return rawPath;
|
|
70
|
+
}
|
|
71
|
+
return path.resolve(this.projectRoot, rawPath);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=fixture-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixture-provider.js","sourceRoot":"","sources":["../../src/sources/fixture-provider.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAU3C,uFAAuF;AACvF,MAAM,2BAA2B,GAAG,mEAAmE,CAAA;AACvG,MAAM,0BAA0B,GAAG,wCAAwC,CAAA;AAE3E,MAAM,oBAAoB,GAAuB;IAC/C,SAAS,EAAE,wBAAwB;IACnC,WAAW,EAAE,yBAAyB;IACtC,QAAQ,EAAE;QACR,KAAK,EAAE,SAAS;KACjB;IACD,KAAK,EAAE;QACL;YACE,EAAE,EAAE,WAAW;YACf,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,GAAG;YACT,QAAQ,EAAE,SAAS;SACpB;QACD;YACE,EAAE,EAAE,cAAc;YAClB,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,SAAS;SACpB;KACF;CACF,CAAA;AAED,MAAM,eAAe,GAAoB;IACvC;QACE,EAAE,EAAE,0BAA0B;QAC9B,MAAM,EAAE,WAAW;QACnB,SAAS,EAAE,0BAA0B;KACtC;CACF,CAAA;AAED,MAAM,OAAO,0BAA0B;IACpB,WAAW,CAAQ;IACnB,kBAAkB,CAAQ;IAE3C,YAAY,OAA0C;QACpD,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAA;QACtC,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,IAAI,2BAA2B,CAAA;IACrF,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,OAAO;YACL,GAAG,oBAAoB;YACvB,QAAQ,EAAE;gBACR,GAAG,oBAAoB,CAAC,QAAQ;gBAChC,qBAAqB,EAAE,0BAA0B;aAClD;SACF,CAAA;IACH,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,CAAC,GAAG,eAAe,CAAC,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,wBAAwB,CAAC,QAAgB;QAC7C,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAA;QAErE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAA;QAClD,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;QAC7D,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,WAAW,CAAC,CAAA;YAC3B,OAAO,WAAW,CAAA;QACpB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,iCAAiC,WAAW,+DAA+D,CAC5G,CAAA;QACH,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,OAAe;QACjC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IAChD,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-data-provider.js","sourceRoot":"","sources":["../../src/sources/project-data-provider.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { PrimeUiDownloadResult, PrimeUiExport, PrimeUiProjectInfo } from "../types.js";
|
|
2
|
+
export interface ProjectSyncSource {
|
|
3
|
+
getProjectInfo(): Promise<PrimeUiProjectInfo>;
|
|
4
|
+
listExports(): Promise<PrimeUiExport[]>;
|
|
5
|
+
downloadExportById(id: string): Promise<PrimeUiDownloadResult>;
|
|
6
|
+
clearTemp(): Promise<void>;
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-sync-source.js","sourceRoot":"","sources":["../../src/sources/project-sync-source.ts"],"names":[],"mappings":""}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type PrimeUiExportStatus = "in_progress" | "completed" | "failed";
|
|
2
|
+
export interface PrimeUiProjectPage {
|
|
3
|
+
id: string;
|
|
4
|
+
title: string;
|
|
5
|
+
slug: string;
|
|
6
|
+
pageType: string;
|
|
7
|
+
}
|
|
8
|
+
export interface PrimeUiProjectInfo {
|
|
9
|
+
projectId: string;
|
|
10
|
+
projectName: string;
|
|
11
|
+
metadata: Record<string, unknown>;
|
|
12
|
+
pages: PrimeUiProjectPage[];
|
|
13
|
+
}
|
|
14
|
+
export interface PrimeUiExport {
|
|
15
|
+
id: string;
|
|
16
|
+
status: PrimeUiExportStatus;
|
|
17
|
+
createdAt: string;
|
|
18
|
+
}
|
|
19
|
+
export interface PrimeUiDownloadResult {
|
|
20
|
+
exportId: string;
|
|
21
|
+
projectPath: string;
|
|
22
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@primeuicom/mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "dist/service.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"primeui-mcp": "dist/service.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"clean": "rm -rf dist",
|
|
14
|
+
"build": "pnpm run clean && tsc -p tsconfig.json",
|
|
15
|
+
"typecheck": "tsc --noEmit",
|
|
16
|
+
"dev": "tsx src/service.ts",
|
|
17
|
+
"test": "vitest run",
|
|
18
|
+
"inspect": "pnpm exec mcp-inspector tsx src/service.ts",
|
|
19
|
+
"prepack": "pnpm run build"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@modelcontextprotocol/sdk": "^1.25.3",
|
|
23
|
+
"zod": "^3.25.76"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@modelcontextprotocol/inspector": "^0.20.0",
|
|
27
|
+
"@types/node": "^24.0.0",
|
|
28
|
+
"tsx": "^4.21.0",
|
|
29
|
+
"typescript": "5.8.2",
|
|
30
|
+
"vitest": "^3.2.3"
|
|
31
|
+
}
|
|
32
|
+
}
|