@epiccontext/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/dist/api/client.d.ts +126 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +152 -0
- package/dist/api/client.js.map +1 -0
- package/dist/bin/epicontext.d.ts +18 -0
- package/dist/bin/epicontext.d.ts.map +1 -0
- package/dist/bin/epicontext.js +18 -0
- package/dist/bin/epicontext.js.map +1 -0
- package/dist/cli/commands/init.d.ts +5 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +61 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/link.d.ts +6 -0
- package/dist/cli/commands/link.d.ts.map +1 -0
- package/dist/cli/commands/link.js +158 -0
- package/dist/cli/commands/link.js.map +1 -0
- package/dist/cli/commands/pull.d.ts +6 -0
- package/dist/cli/commands/pull.d.ts.map +1 -0
- package/dist/cli/commands/pull.js +51 -0
- package/dist/cli/commands/pull.js.map +1 -0
- package/dist/cli/commands/push.d.ts +6 -0
- package/dist/cli/commands/push.d.ts.map +1 -0
- package/dist/cli/commands/push.js +64 -0
- package/dist/cli/commands/push.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +5 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +42 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/status.d.ts +2 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +85 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +7 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +91 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/watch.d.ts +6 -0
- package/dist/cli/commands/watch.d.ts.map +1 -0
- package/dist/cli/commands/watch.js +66 -0
- package/dist/cli/commands/watch.js.map +1 -0
- package/dist/cli/config.d.ts +39 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +133 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/files.d.ts +29 -0
- package/dist/cli/files.d.ts.map +1 -0
- package/dist/cli/files.js +158 -0
- package/dist/cli/files.js.map +1 -0
- package/dist/cli/index.d.ts +5 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +85 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/server.d.ts +12 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +93 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/create-block.d.ts +10 -0
- package/dist/mcp/tools/create-block.d.ts.map +1 -0
- package/dist/mcp/tools/create-block.js +88 -0
- package/dist/mcp/tools/create-block.js.map +1 -0
- package/dist/mcp/tools/get-block.d.ts +10 -0
- package/dist/mcp/tools/get-block.d.ts.map +1 -0
- package/dist/mcp/tools/get-block.js +70 -0
- package/dist/mcp/tools/get-block.js.map +1 -0
- package/dist/mcp/tools/get-sync-status.d.ts +10 -0
- package/dist/mcp/tools/get-sync-status.d.ts.map +1 -0
- package/dist/mcp/tools/get-sync-status.js +41 -0
- package/dist/mcp/tools/get-sync-status.js.map +1 -0
- package/dist/mcp/tools/list-blocks.d.ts +10 -0
- package/dist/mcp/tools/list-blocks.d.ts.map +1 -0
- package/dist/mcp/tools/list-blocks.js +65 -0
- package/dist/mcp/tools/list-blocks.js.map +1 -0
- package/dist/mcp/tools/read-context.d.ts +10 -0
- package/dist/mcp/tools/read-context.d.ts.map +1 -0
- package/dist/mcp/tools/read-context.js +138 -0
- package/dist/mcp/tools/read-context.js.map +1 -0
- package/dist/mcp/tools/sync-all.d.ts +10 -0
- package/dist/mcp/tools/sync-all.d.ts.map +1 -0
- package/dist/mcp/tools/sync-all.js +67 -0
- package/dist/mcp/tools/sync-all.js.map +1 -0
- package/dist/mcp/tools/sync-from-app.d.ts +10 -0
- package/dist/mcp/tools/sync-from-app.d.ts.map +1 -0
- package/dist/mcp/tools/sync-from-app.js +40 -0
- package/dist/mcp/tools/sync-from-app.js.map +1 -0
- package/dist/mcp/tools/sync-to-app.d.ts +10 -0
- package/dist/mcp/tools/sync-to-app.d.ts.map +1 -0
- package/dist/mcp/tools/sync-to-app.js +53 -0
- package/dist/mcp/tools/sync-to-app.js.map +1 -0
- package/dist/mcp/tools/update-block.d.ts +10 -0
- package/dist/mcp/tools/update-block.d.ts.map +1 -0
- package/dist/mcp/tools/update-block.js +90 -0
- package/dist/mcp/tools/update-block.js.map +1 -0
- package/dist/sync/pull.d.ts +16 -0
- package/dist/sync/pull.d.ts.map +1 -0
- package/dist/sync/pull.js +32 -0
- package/dist/sync/pull.js.map +1 -0
- package/dist/sync/push.d.ts +18 -0
- package/dist/sync/push.d.ts.map +1 -0
- package/dist/sync/push.js +39 -0
- package/dist/sync/push.js.map +1 -0
- package/dist/sync/watcher.d.ts +51 -0
- package/dist/sync/watcher.d.ts.map +1 -0
- package/dist/sync/watcher.js +114 -0
- package/dist/sync/watcher.js.map +1 -0
- package/dist/types/index.d.ts +110 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import type { BlockWithSection, ExportResponse, FileInfo, SyncResult } from "../types/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* EpicContext API Client
|
|
4
|
+
* Handles all communication with the EpicContext cloud API
|
|
5
|
+
*/
|
|
6
|
+
export declare class EpicContextClient {
|
|
7
|
+
private baseUrl;
|
|
8
|
+
private apiKey;
|
|
9
|
+
private projectId;
|
|
10
|
+
constructor(config: {
|
|
11
|
+
baseUrl: string;
|
|
12
|
+
apiKey: string;
|
|
13
|
+
projectId: string;
|
|
14
|
+
});
|
|
15
|
+
private request;
|
|
16
|
+
/**
|
|
17
|
+
* Get sync status
|
|
18
|
+
*/
|
|
19
|
+
getSyncStatus(): Promise<{
|
|
20
|
+
projectId: string;
|
|
21
|
+
projectName: string;
|
|
22
|
+
projectSlug: string;
|
|
23
|
+
sync: {
|
|
24
|
+
enabled: boolean;
|
|
25
|
+
path: string;
|
|
26
|
+
conflictResolution: string;
|
|
27
|
+
lastSyncAt: string | null;
|
|
28
|
+
lastSyncDirection: string | null;
|
|
29
|
+
contextIsLeading: boolean;
|
|
30
|
+
};
|
|
31
|
+
}>;
|
|
32
|
+
/**
|
|
33
|
+
* Import files to cloud
|
|
34
|
+
*/
|
|
35
|
+
importFiles(files: FileInfo[], options?: {
|
|
36
|
+
dryRun?: boolean;
|
|
37
|
+
conflictResolution?: "timestamp" | "ui_wins" | "folder_wins";
|
|
38
|
+
}): Promise<{
|
|
39
|
+
success: boolean;
|
|
40
|
+
dryRun: boolean;
|
|
41
|
+
result: SyncResult;
|
|
42
|
+
}>;
|
|
43
|
+
/**
|
|
44
|
+
* Export project files
|
|
45
|
+
*/
|
|
46
|
+
exportFiles(): Promise<ExportResponse>;
|
|
47
|
+
/**
|
|
48
|
+
* Export project as ZIP
|
|
49
|
+
*/
|
|
50
|
+
exportZip(): Promise<Blob>;
|
|
51
|
+
/**
|
|
52
|
+
* List blocks
|
|
53
|
+
*/
|
|
54
|
+
listBlocks(filters?: {
|
|
55
|
+
section?: string;
|
|
56
|
+
type?: string;
|
|
57
|
+
status?: "empty" | "draft" | "complete";
|
|
58
|
+
search?: string;
|
|
59
|
+
}): Promise<{
|
|
60
|
+
blocks: BlockWithSection[];
|
|
61
|
+
total: number;
|
|
62
|
+
}>;
|
|
63
|
+
/**
|
|
64
|
+
* Get a single block
|
|
65
|
+
*/
|
|
66
|
+
getBlock(key: string): Promise<{
|
|
67
|
+
block: BlockWithSection;
|
|
68
|
+
}>;
|
|
69
|
+
/**
|
|
70
|
+
* Create a block
|
|
71
|
+
*/
|
|
72
|
+
createBlock(data: {
|
|
73
|
+
section: string;
|
|
74
|
+
type: string;
|
|
75
|
+
key: string;
|
|
76
|
+
name: string;
|
|
77
|
+
value?: Record<string, unknown>;
|
|
78
|
+
status?: "empty" | "draft" | "complete";
|
|
79
|
+
}): Promise<{
|
|
80
|
+
block: BlockWithSection;
|
|
81
|
+
}>;
|
|
82
|
+
/**
|
|
83
|
+
* Update a block (full replacement)
|
|
84
|
+
*/
|
|
85
|
+
updateBlock(key: string, data: {
|
|
86
|
+
value?: Record<string, unknown>;
|
|
87
|
+
name?: string;
|
|
88
|
+
status?: "empty" | "draft" | "complete";
|
|
89
|
+
}): Promise<{
|
|
90
|
+
block: BlockWithSection;
|
|
91
|
+
}>;
|
|
92
|
+
/**
|
|
93
|
+
* Patch a block (merge fields)
|
|
94
|
+
*/
|
|
95
|
+
patchBlock(key: string, data: {
|
|
96
|
+
fields?: Record<string, unknown>;
|
|
97
|
+
name?: string;
|
|
98
|
+
status?: "empty" | "draft" | "complete";
|
|
99
|
+
}): Promise<{
|
|
100
|
+
block: BlockWithSection;
|
|
101
|
+
}>;
|
|
102
|
+
/**
|
|
103
|
+
* Delete a block
|
|
104
|
+
*/
|
|
105
|
+
deleteBlock(key: string): Promise<{
|
|
106
|
+
message: string;
|
|
107
|
+
}>;
|
|
108
|
+
/**
|
|
109
|
+
* Test connection and get project info
|
|
110
|
+
*/
|
|
111
|
+
testConnection(): Promise<{
|
|
112
|
+
connected: boolean;
|
|
113
|
+
projectId: string;
|
|
114
|
+
projectName: string;
|
|
115
|
+
projectSlug: string;
|
|
116
|
+
}>;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Create a client from config
|
|
120
|
+
*/
|
|
121
|
+
export declare function createClient(config: {
|
|
122
|
+
baseUrl: string;
|
|
123
|
+
apiKey: string;
|
|
124
|
+
projectId: string;
|
|
125
|
+
}): EpicContextClient;
|
|
126
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EpicContext API Client
|
|
3
|
+
* Handles all communication with the EpicContext cloud API
|
|
4
|
+
*/
|
|
5
|
+
export class EpicContextClient {
|
|
6
|
+
baseUrl;
|
|
7
|
+
apiKey;
|
|
8
|
+
projectId;
|
|
9
|
+
constructor(config) {
|
|
10
|
+
this.baseUrl = config.baseUrl.replace(/\/$/, ""); // Remove trailing slash
|
|
11
|
+
this.apiKey = config.apiKey;
|
|
12
|
+
this.projectId = config.projectId;
|
|
13
|
+
}
|
|
14
|
+
async request(endpoint, options = {}) {
|
|
15
|
+
const url = `${this.baseUrl}/api/v1/projects/${this.projectId}${endpoint}`;
|
|
16
|
+
const response = await fetch(url, {
|
|
17
|
+
...options,
|
|
18
|
+
headers: {
|
|
19
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
20
|
+
"Content-Type": "application/json",
|
|
21
|
+
...options.headers,
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
if (!response.ok) {
|
|
25
|
+
const errorData = await response.json().catch(() => ({ error: "Unknown error" }));
|
|
26
|
+
throw new Error(errorData.error || `HTTP ${response.status}`);
|
|
27
|
+
}
|
|
28
|
+
// Handle different response types
|
|
29
|
+
const contentType = response.headers.get("content-type");
|
|
30
|
+
if (contentType?.includes("application/zip")) {
|
|
31
|
+
return response.blob();
|
|
32
|
+
}
|
|
33
|
+
return response.json();
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get sync status
|
|
37
|
+
*/
|
|
38
|
+
async getSyncStatus() {
|
|
39
|
+
return this.request("/sync");
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Import files to cloud
|
|
43
|
+
*/
|
|
44
|
+
async importFiles(files, options = {}) {
|
|
45
|
+
return this.request("/sync", {
|
|
46
|
+
method: "POST",
|
|
47
|
+
body: JSON.stringify({
|
|
48
|
+
files,
|
|
49
|
+
dryRun: options.dryRun ?? false,
|
|
50
|
+
conflictResolution: options.conflictResolution ?? "folder_wins",
|
|
51
|
+
}),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Export project files
|
|
56
|
+
*/
|
|
57
|
+
async exportFiles() {
|
|
58
|
+
return this.request("/export?format=json");
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Export project as ZIP
|
|
62
|
+
*/
|
|
63
|
+
async exportZip() {
|
|
64
|
+
return this.request("/export");
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* List blocks
|
|
68
|
+
*/
|
|
69
|
+
async listBlocks(filters) {
|
|
70
|
+
const params = new URLSearchParams();
|
|
71
|
+
if (filters?.section)
|
|
72
|
+
params.set("section", filters.section);
|
|
73
|
+
if (filters?.type)
|
|
74
|
+
params.set("type", filters.type);
|
|
75
|
+
if (filters?.status)
|
|
76
|
+
params.set("status", filters.status);
|
|
77
|
+
if (filters?.search)
|
|
78
|
+
params.set("search", filters.search);
|
|
79
|
+
const query = params.toString();
|
|
80
|
+
return this.request(`/blocks${query ? `?${query}` : ""}`);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Get a single block
|
|
84
|
+
*/
|
|
85
|
+
async getBlock(key) {
|
|
86
|
+
return this.request(`/blocks/${encodeURIComponent(key)}`);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Create a block
|
|
90
|
+
*/
|
|
91
|
+
async createBlock(data) {
|
|
92
|
+
return this.request("/blocks", {
|
|
93
|
+
method: "POST",
|
|
94
|
+
body: JSON.stringify(data),
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Update a block (full replacement)
|
|
99
|
+
*/
|
|
100
|
+
async updateBlock(key, data) {
|
|
101
|
+
return this.request(`/blocks/${encodeURIComponent(key)}`, {
|
|
102
|
+
method: "PUT",
|
|
103
|
+
body: JSON.stringify(data),
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Patch a block (merge fields)
|
|
108
|
+
*/
|
|
109
|
+
async patchBlock(key, data) {
|
|
110
|
+
return this.request(`/blocks/${encodeURIComponent(key)}`, {
|
|
111
|
+
method: "PATCH",
|
|
112
|
+
body: JSON.stringify(data),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Delete a block
|
|
117
|
+
*/
|
|
118
|
+
async deleteBlock(key) {
|
|
119
|
+
return this.request(`/blocks/${encodeURIComponent(key)}`, {
|
|
120
|
+
method: "DELETE",
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Test connection and get project info
|
|
125
|
+
*/
|
|
126
|
+
async testConnection() {
|
|
127
|
+
try {
|
|
128
|
+
const status = await this.getSyncStatus();
|
|
129
|
+
return {
|
|
130
|
+
connected: true,
|
|
131
|
+
projectId: status.projectId,
|
|
132
|
+
projectName: status.projectName,
|
|
133
|
+
projectSlug: status.projectSlug,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
return {
|
|
138
|
+
connected: false,
|
|
139
|
+
projectId: this.projectId,
|
|
140
|
+
projectName: "",
|
|
141
|
+
projectSlug: "",
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Create a client from config
|
|
148
|
+
*/
|
|
149
|
+
export function createClient(config) {
|
|
150
|
+
return new EpicContextClient(config);
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* EpicContext CLI
|
|
4
|
+
*
|
|
5
|
+
* Command-line tool for syncing CONTEXT folders with EpicContext cloud.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* epicontext init - Initialize a CONTEXT folder
|
|
9
|
+
* epicontext link - Link to an EpicContext project
|
|
10
|
+
* epicontext status - Show sync status
|
|
11
|
+
* epicontext pull - Pull changes from cloud
|
|
12
|
+
* epicontext push - Push changes to cloud
|
|
13
|
+
* epicontext sync - Bidirectional sync
|
|
14
|
+
* epicontext watch - Watch for changes and auto-sync
|
|
15
|
+
* epicontext serve - Start MCP server
|
|
16
|
+
*/
|
|
17
|
+
import "../cli/index.js";
|
|
18
|
+
//# sourceMappingURL=epicontext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"epicontext.d.ts","sourceRoot":"","sources":["../../src/bin/epicontext.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* EpicContext CLI
|
|
4
|
+
*
|
|
5
|
+
* Command-line tool for syncing CONTEXT folders with EpicContext cloud.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* epicontext init - Initialize a CONTEXT folder
|
|
9
|
+
* epicontext link - Link to an EpicContext project
|
|
10
|
+
* epicontext status - Show sync status
|
|
11
|
+
* epicontext pull - Pull changes from cloud
|
|
12
|
+
* epicontext push - Push changes to cloud
|
|
13
|
+
* epicontext sync - Bidirectional sync
|
|
14
|
+
* epicontext watch - Watch for changes and auto-sync
|
|
15
|
+
* epicontext serve - Start MCP server
|
|
16
|
+
*/
|
|
17
|
+
import "../cli/index.js";
|
|
18
|
+
//# sourceMappingURL=epicontext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"epicontext.js","sourceRoot":"","sources":["../../src/bin/epicontext.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA8DrE"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import * as path from "path";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import { ensureContextFolder } from "../files.js";
|
|
5
|
+
import { saveConfig, isInsideProject } from "../config.js";
|
|
6
|
+
export async function initCommand(options) {
|
|
7
|
+
const contextPath = options.path || "./CONTEXT";
|
|
8
|
+
const absolutePath = path.resolve(process.cwd(), contextPath);
|
|
9
|
+
console.log(chalk.blue("Initializing EpicContext..."));
|
|
10
|
+
// Check if already inside a project
|
|
11
|
+
if (isInsideProject()) {
|
|
12
|
+
console.log(chalk.yellow("Warning: Already inside an EpicContext project."));
|
|
13
|
+
console.log("Run 'epicontext link' to connect to a project.");
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const spinner = ora("Creating CONTEXT folder structure...").start();
|
|
17
|
+
try {
|
|
18
|
+
// Create folder structure
|
|
19
|
+
ensureContextFolder(absolutePath);
|
|
20
|
+
// Save initial config
|
|
21
|
+
saveConfig({
|
|
22
|
+
version: 1,
|
|
23
|
+
sync: {
|
|
24
|
+
path: contextPath,
|
|
25
|
+
conflictResolution: "timestamp",
|
|
26
|
+
autoSync: false,
|
|
27
|
+
ignoredPatterns: ["*.tmp", ".DS_Store", "node_modules"],
|
|
28
|
+
},
|
|
29
|
+
watch: {
|
|
30
|
+
debounce: 2000,
|
|
31
|
+
pushOnly: false,
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
spinner.succeed("CONTEXT folder initialized!");
|
|
35
|
+
console.log("");
|
|
36
|
+
console.log(chalk.green("Created structure:"));
|
|
37
|
+
console.log(` ${contextPath}/`);
|
|
38
|
+
console.log(` ├── constitution/`);
|
|
39
|
+
console.log(` ├── brand/`);
|
|
40
|
+
console.log(` ├── product/`);
|
|
41
|
+
console.log(` ├── users/`);
|
|
42
|
+
console.log(` ├── research/`);
|
|
43
|
+
console.log(` ├── technical/`);
|
|
44
|
+
console.log(` ├── design-system/`);
|
|
45
|
+
console.log(` ├── journeys/`);
|
|
46
|
+
console.log(` ├── decisions/`);
|
|
47
|
+
console.log(` ├── development/`);
|
|
48
|
+
console.log(` └── README.md`);
|
|
49
|
+
console.log("");
|
|
50
|
+
console.log(chalk.blue("Next steps:"));
|
|
51
|
+
console.log(` 1. Run ${chalk.cyan("epiccontext link")} to connect to your EpicContext project`);
|
|
52
|
+
console.log(` 2. Run ${chalk.cyan("epiccontext sync")} to sync your documentation`);
|
|
53
|
+
console.log("");
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
spinner.fail("Failed to initialize");
|
|
57
|
+
console.error(chalk.red("Error:"), error.message);
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/link.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAkDD,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA6HrE"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import ora from "ora";
|
|
3
|
+
import inquirer from "inquirer";
|
|
4
|
+
import { saveConfig, loadConfig, globalConfig } from "../config.js";
|
|
5
|
+
import { createClient } from "../../api/client.js";
|
|
6
|
+
/**
|
|
7
|
+
* Parse project URL to extract base URL and project ID/slug
|
|
8
|
+
* Supports:
|
|
9
|
+
* - https://app.epiccontext.io/org-slug/project-slug
|
|
10
|
+
* - org-slug/project-slug
|
|
11
|
+
* - project UUID
|
|
12
|
+
*/
|
|
13
|
+
function parseProjectUrl(input) {
|
|
14
|
+
const defaultBaseUrl = globalConfig.get("defaultBaseUrl");
|
|
15
|
+
// Check if it's a full URL
|
|
16
|
+
if (input.startsWith("http://") || input.startsWith("https://")) {
|
|
17
|
+
const url = new URL(input);
|
|
18
|
+
const pathParts = url.pathname.split("/").filter(Boolean);
|
|
19
|
+
if (pathParts.length >= 2) {
|
|
20
|
+
return {
|
|
21
|
+
baseUrl: `${url.protocol}//${url.host}`,
|
|
22
|
+
projectId: pathParts[1], // project slug (we'll resolve this later)
|
|
23
|
+
orgSlug: pathParts[0],
|
|
24
|
+
projectSlug: pathParts[1],
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// Check if it's org/project format
|
|
29
|
+
if (input.includes("/")) {
|
|
30
|
+
const [orgSlug, projectSlug] = input.split("/");
|
|
31
|
+
return {
|
|
32
|
+
baseUrl: defaultBaseUrl,
|
|
33
|
+
projectId: projectSlug,
|
|
34
|
+
orgSlug,
|
|
35
|
+
projectSlug,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
// Assume it's a project ID/UUID
|
|
39
|
+
return {
|
|
40
|
+
baseUrl: defaultBaseUrl,
|
|
41
|
+
projectId: input,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export async function linkCommand(options) {
|
|
45
|
+
console.log(chalk.blue("Link to EpicContext project"));
|
|
46
|
+
console.log("");
|
|
47
|
+
// Check for existing config
|
|
48
|
+
const existingConfig = loadConfig();
|
|
49
|
+
if (existingConfig?.project?.id) {
|
|
50
|
+
console.log(chalk.yellow("Warning: Already linked to a project."));
|
|
51
|
+
console.log(` Project: ${existingConfig.project.name || existingConfig.project.id}`);
|
|
52
|
+
console.log(` URL: ${existingConfig.project.url}`);
|
|
53
|
+
console.log("");
|
|
54
|
+
const { confirmRelink } = await inquirer.prompt([
|
|
55
|
+
{
|
|
56
|
+
type: "confirm",
|
|
57
|
+
name: "confirmRelink",
|
|
58
|
+
message: "Do you want to link to a different project?",
|
|
59
|
+
default: false,
|
|
60
|
+
},
|
|
61
|
+
]);
|
|
62
|
+
if (!confirmRelink) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
console.log("");
|
|
66
|
+
}
|
|
67
|
+
// Get project URL
|
|
68
|
+
let projectUrl = options.url;
|
|
69
|
+
if (!projectUrl) {
|
|
70
|
+
const { url } = await inquirer.prompt([
|
|
71
|
+
{
|
|
72
|
+
type: "input",
|
|
73
|
+
name: "url",
|
|
74
|
+
message: "Enter your EpicContext project URL or ID:",
|
|
75
|
+
validate: (input) => input.trim().length > 0 || "Project URL is required",
|
|
76
|
+
},
|
|
77
|
+
]);
|
|
78
|
+
projectUrl = url;
|
|
79
|
+
}
|
|
80
|
+
const parsed = parseProjectUrl(projectUrl);
|
|
81
|
+
// Get API key
|
|
82
|
+
let apiKey = options.key;
|
|
83
|
+
if (!apiKey) {
|
|
84
|
+
const { key } = await inquirer.prompt([
|
|
85
|
+
{
|
|
86
|
+
type: "password",
|
|
87
|
+
name: "key",
|
|
88
|
+
message: "Enter your API key (eck_...):",
|
|
89
|
+
validate: (input) => {
|
|
90
|
+
if (!input.trim())
|
|
91
|
+
return "API key is required";
|
|
92
|
+
if (!input.startsWith("eck_"))
|
|
93
|
+
return "API key should start with 'eck_'";
|
|
94
|
+
return true;
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
]);
|
|
98
|
+
apiKey = key;
|
|
99
|
+
}
|
|
100
|
+
// Test connection
|
|
101
|
+
const spinner = ora("Verifying connection...").start();
|
|
102
|
+
try {
|
|
103
|
+
const client = createClient({
|
|
104
|
+
baseUrl: parsed.baseUrl,
|
|
105
|
+
apiKey: apiKey,
|
|
106
|
+
projectId: parsed.projectId,
|
|
107
|
+
});
|
|
108
|
+
const connection = await client.testConnection();
|
|
109
|
+
if (!connection.connected) {
|
|
110
|
+
spinner.fail("Failed to connect");
|
|
111
|
+
console.error(chalk.red("Could not connect to EpicContext."));
|
|
112
|
+
console.error("Please check your project URL and API key.");
|
|
113
|
+
process.exit(1);
|
|
114
|
+
}
|
|
115
|
+
spinner.succeed("Connection verified!");
|
|
116
|
+
// Save config
|
|
117
|
+
saveConfig({
|
|
118
|
+
project: {
|
|
119
|
+
id: connection.projectId,
|
|
120
|
+
url: `${parsed.baseUrl}/${parsed.orgSlug}/${parsed.projectSlug}`,
|
|
121
|
+
name: connection.projectName,
|
|
122
|
+
slug: connection.projectSlug,
|
|
123
|
+
},
|
|
124
|
+
auth: {
|
|
125
|
+
apiKey: apiKey,
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
// Update recent projects
|
|
129
|
+
const recentProjects = globalConfig.get("recentProjects") || [];
|
|
130
|
+
const existing = recentProjects.findIndex((p) => p.id === connection.projectId);
|
|
131
|
+
if (existing >= 0) {
|
|
132
|
+
recentProjects.splice(existing, 1);
|
|
133
|
+
}
|
|
134
|
+
recentProjects.unshift({
|
|
135
|
+
id: connection.projectId,
|
|
136
|
+
name: connection.projectName,
|
|
137
|
+
url: `${parsed.baseUrl}/${parsed.orgSlug}/${parsed.projectSlug}`,
|
|
138
|
+
lastAccess: new Date().toISOString(),
|
|
139
|
+
});
|
|
140
|
+
globalConfig.set("recentProjects", recentProjects.slice(0, 10));
|
|
141
|
+
console.log("");
|
|
142
|
+
console.log(chalk.green("Project linked successfully!"));
|
|
143
|
+
console.log(` Project: ${chalk.cyan(connection.projectName)}`);
|
|
144
|
+
console.log(` ID: ${connection.projectId}`);
|
|
145
|
+
console.log("");
|
|
146
|
+
console.log(chalk.blue("Next steps:"));
|
|
147
|
+
console.log(` - Run ${chalk.cyan("epiccontext pull")} to download your documentation`);
|
|
148
|
+
console.log(` - Run ${chalk.cyan("epiccontext sync")} to sync bidirectionally`);
|
|
149
|
+
console.log(` - Run ${chalk.cyan("epiccontext watch")} to auto-sync on changes`);
|
|
150
|
+
console.log("");
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
spinner.fail("Connection failed");
|
|
154
|
+
console.error(chalk.red("Error:"), error.message);
|
|
155
|
+
process.exit(1);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../../src/cli/commands/link.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/pull.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDrE"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import ora from "ora";
|
|
3
|
+
import { loadConfig, getContextPath } from "../config.js";
|
|
4
|
+
import { createClient } from "../../api/client.js";
|
|
5
|
+
import { pullFromCloud } from "../../sync/pull.js";
|
|
6
|
+
export async function pullCommand(options) {
|
|
7
|
+
const config = loadConfig();
|
|
8
|
+
if (!config?.project?.id || !config?.auth?.apiKey) {
|
|
9
|
+
console.log(chalk.yellow("Not linked to an EpicContext project."));
|
|
10
|
+
console.log(`Run ${chalk.cyan("epiccontext link")} to connect.`);
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const contextPath = getContextPath();
|
|
14
|
+
if (!contextPath) {
|
|
15
|
+
console.log(chalk.red("Could not determine CONTEXT folder path."));
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
// Get project URL parts
|
|
19
|
+
const urlParts = config.project.url?.split("/").filter(Boolean) || [];
|
|
20
|
+
const baseUrl = urlParts.slice(0, 3).join("/").replace("https:/", "https://") || "https://app.epiccontext.io";
|
|
21
|
+
const client = createClient({
|
|
22
|
+
baseUrl,
|
|
23
|
+
apiKey: config.auth.apiKey,
|
|
24
|
+
projectId: config.project.id,
|
|
25
|
+
});
|
|
26
|
+
const spinner = ora("Pulling from EpicContext...").start();
|
|
27
|
+
try {
|
|
28
|
+
const result = await pullFromCloud(client, contextPath, {
|
|
29
|
+
section: options.section,
|
|
30
|
+
force: options.force,
|
|
31
|
+
});
|
|
32
|
+
spinner.succeed("Pull complete!");
|
|
33
|
+
console.log("");
|
|
34
|
+
if (result.filesWritten > 0) {
|
|
35
|
+
console.log(chalk.green(` ${result.filesWritten} file(s) written`));
|
|
36
|
+
}
|
|
37
|
+
if (result.filesSkipped > 0) {
|
|
38
|
+
console.log(chalk.yellow(` ${result.filesSkipped} file(s) skipped`));
|
|
39
|
+
}
|
|
40
|
+
if (result.filesWritten === 0 && result.filesSkipped === 0) {
|
|
41
|
+
console.log(chalk.gray(" No files to pull (project is empty)"));
|
|
42
|
+
}
|
|
43
|
+
console.log("");
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
spinner.fail("Pull failed");
|
|
47
|
+
console.error(chalk.red("Error:"), error.message);
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=pull.js.map
|