@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.
Files changed (113) hide show
  1. package/dist/api/client.d.ts +126 -0
  2. package/dist/api/client.d.ts.map +1 -0
  3. package/dist/api/client.js +152 -0
  4. package/dist/api/client.js.map +1 -0
  5. package/dist/bin/epicontext.d.ts +18 -0
  6. package/dist/bin/epicontext.d.ts.map +1 -0
  7. package/dist/bin/epicontext.js +18 -0
  8. package/dist/bin/epicontext.js.map +1 -0
  9. package/dist/cli/commands/init.d.ts +5 -0
  10. package/dist/cli/commands/init.d.ts.map +1 -0
  11. package/dist/cli/commands/init.js +61 -0
  12. package/dist/cli/commands/init.js.map +1 -0
  13. package/dist/cli/commands/link.d.ts +6 -0
  14. package/dist/cli/commands/link.d.ts.map +1 -0
  15. package/dist/cli/commands/link.js +158 -0
  16. package/dist/cli/commands/link.js.map +1 -0
  17. package/dist/cli/commands/pull.d.ts +6 -0
  18. package/dist/cli/commands/pull.d.ts.map +1 -0
  19. package/dist/cli/commands/pull.js +51 -0
  20. package/dist/cli/commands/pull.js.map +1 -0
  21. package/dist/cli/commands/push.d.ts +6 -0
  22. package/dist/cli/commands/push.d.ts.map +1 -0
  23. package/dist/cli/commands/push.js +64 -0
  24. package/dist/cli/commands/push.js.map +1 -0
  25. package/dist/cli/commands/serve.d.ts +5 -0
  26. package/dist/cli/commands/serve.d.ts.map +1 -0
  27. package/dist/cli/commands/serve.js +42 -0
  28. package/dist/cli/commands/serve.js.map +1 -0
  29. package/dist/cli/commands/status.d.ts +2 -0
  30. package/dist/cli/commands/status.d.ts.map +1 -0
  31. package/dist/cli/commands/status.js +85 -0
  32. package/dist/cli/commands/status.js.map +1 -0
  33. package/dist/cli/commands/sync.d.ts +7 -0
  34. package/dist/cli/commands/sync.d.ts.map +1 -0
  35. package/dist/cli/commands/sync.js +91 -0
  36. package/dist/cli/commands/sync.js.map +1 -0
  37. package/dist/cli/commands/watch.d.ts +6 -0
  38. package/dist/cli/commands/watch.d.ts.map +1 -0
  39. package/dist/cli/commands/watch.js +66 -0
  40. package/dist/cli/commands/watch.js.map +1 -0
  41. package/dist/cli/config.d.ts +39 -0
  42. package/dist/cli/config.d.ts.map +1 -0
  43. package/dist/cli/config.js +133 -0
  44. package/dist/cli/config.js.map +1 -0
  45. package/dist/cli/files.d.ts +29 -0
  46. package/dist/cli/files.d.ts.map +1 -0
  47. package/dist/cli/files.js +158 -0
  48. package/dist/cli/files.js.map +1 -0
  49. package/dist/cli/index.d.ts +5 -0
  50. package/dist/cli/index.d.ts.map +1 -0
  51. package/dist/cli/index.js +85 -0
  52. package/dist/cli/index.js.map +1 -0
  53. package/dist/index.d.ts +32 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +36 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/mcp/server.d.ts +12 -0
  58. package/dist/mcp/server.d.ts.map +1 -0
  59. package/dist/mcp/server.js +93 -0
  60. package/dist/mcp/server.js.map +1 -0
  61. package/dist/mcp/tools/create-block.d.ts +10 -0
  62. package/dist/mcp/tools/create-block.d.ts.map +1 -0
  63. package/dist/mcp/tools/create-block.js +88 -0
  64. package/dist/mcp/tools/create-block.js.map +1 -0
  65. package/dist/mcp/tools/get-block.d.ts +10 -0
  66. package/dist/mcp/tools/get-block.d.ts.map +1 -0
  67. package/dist/mcp/tools/get-block.js +70 -0
  68. package/dist/mcp/tools/get-block.js.map +1 -0
  69. package/dist/mcp/tools/get-sync-status.d.ts +10 -0
  70. package/dist/mcp/tools/get-sync-status.d.ts.map +1 -0
  71. package/dist/mcp/tools/get-sync-status.js +41 -0
  72. package/dist/mcp/tools/get-sync-status.js.map +1 -0
  73. package/dist/mcp/tools/list-blocks.d.ts +10 -0
  74. package/dist/mcp/tools/list-blocks.d.ts.map +1 -0
  75. package/dist/mcp/tools/list-blocks.js +65 -0
  76. package/dist/mcp/tools/list-blocks.js.map +1 -0
  77. package/dist/mcp/tools/read-context.d.ts +10 -0
  78. package/dist/mcp/tools/read-context.d.ts.map +1 -0
  79. package/dist/mcp/tools/read-context.js +138 -0
  80. package/dist/mcp/tools/read-context.js.map +1 -0
  81. package/dist/mcp/tools/sync-all.d.ts +10 -0
  82. package/dist/mcp/tools/sync-all.d.ts.map +1 -0
  83. package/dist/mcp/tools/sync-all.js +67 -0
  84. package/dist/mcp/tools/sync-all.js.map +1 -0
  85. package/dist/mcp/tools/sync-from-app.d.ts +10 -0
  86. package/dist/mcp/tools/sync-from-app.d.ts.map +1 -0
  87. package/dist/mcp/tools/sync-from-app.js +40 -0
  88. package/dist/mcp/tools/sync-from-app.js.map +1 -0
  89. package/dist/mcp/tools/sync-to-app.d.ts +10 -0
  90. package/dist/mcp/tools/sync-to-app.d.ts.map +1 -0
  91. package/dist/mcp/tools/sync-to-app.js +53 -0
  92. package/dist/mcp/tools/sync-to-app.js.map +1 -0
  93. package/dist/mcp/tools/update-block.d.ts +10 -0
  94. package/dist/mcp/tools/update-block.d.ts.map +1 -0
  95. package/dist/mcp/tools/update-block.js +90 -0
  96. package/dist/mcp/tools/update-block.js.map +1 -0
  97. package/dist/sync/pull.d.ts +16 -0
  98. package/dist/sync/pull.d.ts.map +1 -0
  99. package/dist/sync/pull.js +32 -0
  100. package/dist/sync/pull.js.map +1 -0
  101. package/dist/sync/push.d.ts +18 -0
  102. package/dist/sync/push.d.ts.map +1 -0
  103. package/dist/sync/push.js +39 -0
  104. package/dist/sync/push.js.map +1 -0
  105. package/dist/sync/watcher.d.ts +51 -0
  106. package/dist/sync/watcher.d.ts.map +1 -0
  107. package/dist/sync/watcher.js +114 -0
  108. package/dist/sync/watcher.js.map +1 -0
  109. package/dist/types/index.d.ts +110 -0
  110. package/dist/types/index.d.ts.map +1 -0
  111. package/dist/types/index.js +2 -0
  112. package/dist/types/index.js.map +1 -0
  113. 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":"AASA;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IACpB,OAAO,CAAS;IAChB,MAAM,CAAS;IACf,SAAS,CAAS;IAE1B,YAAY,MAA8D;QACxE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,wBAAwB;QAC1E,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACpC,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,QAAgB,EAChB,UAAuB,EAAE;QAEzB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,oBAAoB,IAAI,CAAC,SAAS,GAAG,QAAQ,EAAE,CAAC;QAE3E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,GAAG,OAAO;YACV,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;gBACtC,cAAc,EAAE,kBAAkB;gBAClC,GAAG,OAAO,CAAC,OAAO;aACnB;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAuB,CAAC;YACxG,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,IAAI,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,kCAAkC;QAClC,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACzD,IAAI,WAAW,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC7C,OAAO,QAAQ,CAAC,IAAI,EAAkB,CAAC;QACzC,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QAajB,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,KAAiB,EACjB,UAGI,EAAE;QAEN,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YAC3B,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK;gBACL,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;gBAC/B,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,IAAI,aAAa;aAChE,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,OAKhB;QACC,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,OAAO,EAAE,OAAO;YAAE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7D,IAAI,OAAO,EAAE,IAAI;YAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,OAAO,EAAE,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1D,IAAI,OAAO,EAAE,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAE1D,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,GAAW;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,IAOjB;QACC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;YAC7B,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,GAAW,EACX,IAIC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE;YACxD,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CACd,GAAW,EACX,IAIC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE;YACxD,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,GAAW;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE;YACxD,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc;QAMlB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;YAC1C,OAAO;gBACL,SAAS,EAAE,IAAI;gBACf,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;aAChC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,SAAS,EAAE,KAAK;gBAChB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,WAAW,EAAE,EAAE;gBACf,WAAW,EAAE,EAAE;aAChB,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAI5B;IACC,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;AACvC,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.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,5 @@
1
+ export interface InitOptions {
2
+ path?: string;
3
+ }
4
+ export declare function initCommand(options: InitOptions): Promise<void>;
5
+ //# sourceMappingURL=init.d.ts.map
@@ -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,6 @@
1
+ export interface LinkOptions {
2
+ url?: string;
3
+ key?: string;
4
+ }
5
+ export declare function linkCommand(options: LinkOptions): Promise<void>;
6
+ //# sourceMappingURL=link.d.ts.map
@@ -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,6 @@
1
+ export interface PullOptions {
2
+ section?: string;
3
+ force?: boolean;
4
+ }
5
+ export declare function pullCommand(options: PullOptions): Promise<void>;
6
+ //# sourceMappingURL=pull.d.ts.map
@@ -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