@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,90 @@
1
+ export const updateBlockTool = {
2
+ name: "update_block",
3
+ description: "Update an existing block's content or status.",
4
+ inputSchema: {
5
+ type: "object",
6
+ properties: {
7
+ key: {
8
+ type: "string",
9
+ description: "The unique key of the block to update",
10
+ },
11
+ value: {
12
+ type: "object",
13
+ description: "The new content value for the block",
14
+ },
15
+ status: {
16
+ type: "string",
17
+ enum: ["empty", "draft", "complete"],
18
+ description: "The new status for the block",
19
+ },
20
+ name: {
21
+ type: "string",
22
+ description: "The display name for the block",
23
+ },
24
+ },
25
+ required: ["key"],
26
+ },
27
+ };
28
+ export async function handleUpdateBlock(config, args) {
29
+ const key = args.key;
30
+ const value = args.value;
31
+ const status = args.status;
32
+ const name = args.name;
33
+ if (!key) {
34
+ return {
35
+ content: [
36
+ {
37
+ type: "text",
38
+ text: "Error: Block key is required.",
39
+ },
40
+ ],
41
+ };
42
+ }
43
+ if (!value && !status && !name) {
44
+ return {
45
+ content: [
46
+ {
47
+ type: "text",
48
+ text: "Error: At least one of value, status, or name must be provided.",
49
+ },
50
+ ],
51
+ };
52
+ }
53
+ try {
54
+ const updates = {};
55
+ if (value !== undefined)
56
+ updates.value = value;
57
+ if (status !== undefined)
58
+ updates.status = status;
59
+ if (name !== undefined)
60
+ updates.name = name;
61
+ await config.client.updateBlock(key, updates);
62
+ let output = `Block updated successfully: ${key}\n\n`;
63
+ output += "Updated fields:\n";
64
+ if (value !== undefined)
65
+ output += "- value\n";
66
+ if (status !== undefined)
67
+ output += `- status: ${status}\n`;
68
+ if (name !== undefined)
69
+ output += `- name: ${name}\n`;
70
+ return {
71
+ content: [
72
+ {
73
+ type: "text",
74
+ text: output,
75
+ },
76
+ ],
77
+ };
78
+ }
79
+ catch (error) {
80
+ return {
81
+ content: [
82
+ {
83
+ type: "text",
84
+ text: `Error updating block: ${error.message}`,
85
+ },
86
+ ],
87
+ };
88
+ }
89
+ }
90
+ //# sourceMappingURL=update-block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-block.js","sourceRoot":"","sources":["../../../src/mcp/tools/update-block.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,eAAe,GAAS;IACnC,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,+CAA+C;IAC5D,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,GAAG,EAAE;gBACH,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,uCAAuC;aACrD;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,qCAAqC;aACnD;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC;gBACpC,WAAW,EAAE,8BAA8B;aAC5C;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,gCAAgC;aAC9C;SACF;QACD,QAAQ,EAAE,CAAC,KAAK,CAAC;KAClB;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAuB,EACvB,IAA6B;IAE7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAa,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAA4C,CAAC;IAChE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAoD,CAAC;IACzE,MAAM,IAAI,GAAG,IAAI,CAAC,IAA0B,CAAC;IAE7C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,+BAA+B;iBACtC;aACF;SACF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,iEAAiE;iBACxE;aACF;SACF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAIT,EAAE,CAAC;QAEP,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;QAC/C,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;QAClD,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QAE5C,MAAM,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAE9C,IAAI,MAAM,GAAG,+BAA+B,GAAG,MAAM,CAAC;QACtD,MAAM,IAAI,mBAAmB,CAAC;QAC9B,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,IAAI,WAAW,CAAC;QAC/C,IAAI,MAAM,KAAK,SAAS;YAAE,MAAM,IAAI,aAAa,MAAM,IAAI,CAAC;QAC5D,IAAI,IAAI,KAAK,SAAS;YAAE,MAAM,IAAI,WAAW,IAAI,IAAI,CAAC;QAEtD,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,MAAM;iBACb;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,yBAA0B,KAAe,CAAC,OAAO,EAAE;iBAC1D;aACF;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { EpicContextClient } from "../api/client.js";
2
+ export interface PullOptions {
3
+ force?: boolean;
4
+ section?: string;
5
+ }
6
+ export interface PullResult {
7
+ success: boolean;
8
+ filesWritten: number;
9
+ filesSkipped: number;
10
+ totalFiles: number;
11
+ }
12
+ /**
13
+ * Pull from cloud to local CONTEXT folder
14
+ */
15
+ export declare function pullFromCloud(client: EpicContextClient, contextPath: string, options?: PullOptions): Promise<PullResult>;
16
+ //# sourceMappingURL=pull.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/sync/pull.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,iBAAiB,EACzB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC,CAiCrB"}
@@ -0,0 +1,32 @@
1
+ import { writeContextFolder, ensureContextFolder } from "../cli/files.js";
2
+ /**
3
+ * Pull from cloud to local CONTEXT folder
4
+ */
5
+ export async function pullFromCloud(client, contextPath, options = {}) {
6
+ // Ensure context folder exists
7
+ ensureContextFolder(contextPath);
8
+ // Export files from cloud
9
+ const response = await client.exportFiles();
10
+ if (!response.files || response.files.length === 0) {
11
+ return {
12
+ success: true,
13
+ filesWritten: 0,
14
+ filesSkipped: 0,
15
+ totalFiles: 0,
16
+ };
17
+ }
18
+ // Filter by section if specified
19
+ let filesToWrite = response.files;
20
+ if (options.section) {
21
+ filesToWrite = response.files.filter((f) => f.path.startsWith(options.section));
22
+ }
23
+ // Write files to local folder
24
+ const { written, skipped } = writeContextFolder(contextPath, filesToWrite);
25
+ return {
26
+ success: true,
27
+ filesWritten: written,
28
+ filesSkipped: skipped,
29
+ totalFiles: filesToWrite.length,
30
+ };
31
+ }
32
+ //# sourceMappingURL=pull.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/sync/pull.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAc1E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAyB,EACzB,WAAmB,EACnB,UAAuB,EAAE;IAEzB,+BAA+B;IAC/B,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAEjC,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;IAE5C,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnD,OAAO;YACL,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,CAAC;YACf,YAAY,EAAE,CAAC;YACf,UAAU,EAAE,CAAC;SACd,CAAC;IACJ,CAAC;IAED,iCAAiC;IACjC,IAAI,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC;IAClC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACzC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAQ,CAAC,CACpC,CAAC;IACJ,CAAC;IAED,8BAA8B;IAC9B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,kBAAkB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAE3E,OAAO;QACL,OAAO,EAAE,IAAI;QACb,YAAY,EAAE,OAAO;QACrB,YAAY,EAAE,OAAO;QACrB,UAAU,EAAE,YAAY,CAAC,MAAM;KAChC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { EpicContextClient } from "../api/client.js";
2
+ import type { SyncResult } from "../types/index.js";
3
+ export interface PushOptions {
4
+ dryRun?: boolean;
5
+ conflictResolution?: "timestamp" | "folder_wins";
6
+ path?: string;
7
+ }
8
+ export interface PushResult {
9
+ success: boolean;
10
+ dryRun: boolean;
11
+ filesProcessed: number;
12
+ result: SyncResult;
13
+ }
14
+ /**
15
+ * Push local CONTEXT folder to cloud
16
+ */
17
+ export declare function pushToCloud(client: EpicContextClient, contextPath: string, options?: PushOptions): Promise<PushResult>;
18
+ //# sourceMappingURL=push.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/sync/push.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kBAAkB,CAAC,EAAE,WAAW,GAAG,aAAa,CAAC;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,UAAU,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,iBAAiB,EACzB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC,CAuCrB"}
@@ -0,0 +1,39 @@
1
+ import { readContextFolder } from "../cli/files.js";
2
+ /**
3
+ * Push local CONTEXT folder to cloud
4
+ */
5
+ export async function pushToCloud(client, contextPath, options = {}) {
6
+ // Read all local files
7
+ const files = readContextFolder(contextPath);
8
+ if (files.length === 0) {
9
+ return {
10
+ success: true,
11
+ dryRun: options.dryRun ?? false,
12
+ filesProcessed: 0,
13
+ result: {
14
+ created: 0,
15
+ updated: 0,
16
+ skipped: 0,
17
+ conflicts: [],
18
+ errors: [],
19
+ },
20
+ };
21
+ }
22
+ // Filter by path if specified
23
+ let filesToSync = files;
24
+ if (options.path) {
25
+ filesToSync = files.filter((f) => f.path.startsWith(options.path));
26
+ }
27
+ // Import to cloud
28
+ const response = await client.importFiles(filesToSync, {
29
+ dryRun: options.dryRun,
30
+ conflictResolution: options.conflictResolution ?? "folder_wins",
31
+ });
32
+ return {
33
+ success: response.success,
34
+ dryRun: response.dryRun,
35
+ filesProcessed: filesToSync.length,
36
+ result: response.result,
37
+ };
38
+ }
39
+ //# sourceMappingURL=push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/sync/push.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAgBpD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAyB,EACzB,WAAmB,EACnB,UAAuB,EAAE;IAEzB,uBAAuB;IACvB,MAAM,KAAK,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAE7C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;YAC/B,cAAc,EAAE,CAAC;YACjB,MAAM,EAAE;gBACN,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,CAAC;gBACV,SAAS,EAAE,EAAE;gBACb,MAAM,EAAE,EAAE;aACX;SACF,CAAC;IACJ,CAAC;IAED,8BAA8B;IAC9B,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/B,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAK,CAAC,CACjC,CAAC;IACJ,CAAC;IAED,kBAAkB;IAClB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE;QACrD,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,IAAI,aAAa;KAChE,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,cAAc,EAAE,WAAW,CAAC,MAAM;QAClC,MAAM,EAAE,QAAQ,CAAC,MAAM;KACxB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,51 @@
1
+ import type { EpicContextClient } from "../api/client.js";
2
+ export interface WatcherConfig {
3
+ contextPath: string;
4
+ debounce: number;
5
+ ignoredPatterns: string[];
6
+ pushOnly: boolean;
7
+ onSync?: (result: {
8
+ files: number;
9
+ created: number;
10
+ updated: number;
11
+ }) => void;
12
+ onError?: (error: Error) => void;
13
+ onChange?: (event: string, path: string) => void;
14
+ }
15
+ /**
16
+ * File watcher for auto-syncing CONTEXT folder changes
17
+ */
18
+ export declare class FileWatcher {
19
+ private client;
20
+ private config;
21
+ private watcher;
22
+ private pendingChanges;
23
+ private syncTimeout;
24
+ private isSyncing;
25
+ constructor(client: EpicContextClient, config: WatcherConfig);
26
+ /**
27
+ * Start watching for file changes
28
+ */
29
+ start(): void;
30
+ /**
31
+ * Stop watching
32
+ */
33
+ stop(): void;
34
+ /**
35
+ * Handle a file change event
36
+ */
37
+ private handleChange;
38
+ /**
39
+ * Schedule a sync after debounce period
40
+ */
41
+ private scheduleSync;
42
+ /**
43
+ * Process all pending changes
44
+ */
45
+ private processPendingChanges;
46
+ }
47
+ /**
48
+ * Create and start a file watcher
49
+ */
50
+ export declare function createWatcher(client: EpicContextClient, config: WatcherConfig): FileWatcher;
51
+ //# sourceMappingURL=watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/sync/watcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAG1D,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC/E,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAClD;AAED;;GAEG;AACH,qBAAa,WAAW;IAOpB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IAPhB,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,SAAS,CAAS;gBAGhB,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,aAAa;IAG/B;;OAEG;IACH,KAAK,IAAI,IAAI;IAqBb;;OAEG;IACH,IAAI,IAAI,IAAI;IASZ;;OAEG;IACH,OAAO,CAAC,YAAY;IAiBpB;;OAEG;IACH,OAAO,CAAC,YAAY;IAUpB;;OAEG;YACW,qBAAqB;CAyBpC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,aAAa,GACpB,WAAW,CAIb"}
@@ -0,0 +1,114 @@
1
+ import chokidar from "chokidar";
2
+ import { pushToCloud } from "./push.js";
3
+ /**
4
+ * File watcher for auto-syncing CONTEXT folder changes
5
+ */
6
+ export class FileWatcher {
7
+ client;
8
+ config;
9
+ watcher = null;
10
+ pendingChanges = new Set();
11
+ syncTimeout = null;
12
+ isSyncing = false;
13
+ constructor(client, config) {
14
+ this.client = client;
15
+ this.config = config;
16
+ }
17
+ /**
18
+ * Start watching for file changes
19
+ */
20
+ start() {
21
+ this.watcher = chokidar.watch(this.config.contextPath, {
22
+ ignored: [
23
+ /(^|[\/\\])\../, // dotfiles
24
+ /node_modules/,
25
+ ...this.config.ignoredPatterns.map((p) => new RegExp(p)),
26
+ ],
27
+ persistent: true,
28
+ ignoreInitial: true,
29
+ awaitWriteFinish: {
30
+ stabilityThreshold: 1000,
31
+ pollInterval: 100,
32
+ },
33
+ });
34
+ this.watcher
35
+ .on("add", (filePath) => this.handleChange("add", filePath))
36
+ .on("change", (filePath) => this.handleChange("change", filePath))
37
+ .on("unlink", (filePath) => this.handleChange("unlink", filePath));
38
+ }
39
+ /**
40
+ * Stop watching
41
+ */
42
+ stop() {
43
+ if (this.syncTimeout) {
44
+ clearTimeout(this.syncTimeout);
45
+ this.syncTimeout = null;
46
+ }
47
+ this.watcher?.close();
48
+ this.watcher = null;
49
+ }
50
+ /**
51
+ * Handle a file change event
52
+ */
53
+ handleChange(event, path) {
54
+ // Only watch markdown files
55
+ if (!path.endsWith(".md")) {
56
+ return;
57
+ }
58
+ // Skip README and AI-GUIDE
59
+ const filename = path.split("/").pop()?.toLowerCase();
60
+ if (filename === "readme.md" || filename === "ai-guide.md") {
61
+ return;
62
+ }
63
+ this.config.onChange?.(event, path);
64
+ this.pendingChanges.add(path);
65
+ this.scheduleSync();
66
+ }
67
+ /**
68
+ * Schedule a sync after debounce period
69
+ */
70
+ scheduleSync() {
71
+ if (this.syncTimeout) {
72
+ clearTimeout(this.syncTimeout);
73
+ }
74
+ this.syncTimeout = setTimeout(() => {
75
+ this.processPendingChanges();
76
+ }, this.config.debounce);
77
+ }
78
+ /**
79
+ * Process all pending changes
80
+ */
81
+ async processPendingChanges() {
82
+ if (this.isSyncing || this.pendingChanges.size === 0) {
83
+ return;
84
+ }
85
+ this.isSyncing = true;
86
+ const changes = Array.from(this.pendingChanges);
87
+ this.pendingChanges.clear();
88
+ try {
89
+ const result = await pushToCloud(this.client, this.config.contextPath, {
90
+ conflictResolution: "folder_wins",
91
+ });
92
+ this.config.onSync?.({
93
+ files: changes.length,
94
+ created: result.result.created,
95
+ updated: result.result.updated,
96
+ });
97
+ }
98
+ catch (error) {
99
+ this.config.onError?.(error);
100
+ }
101
+ finally {
102
+ this.isSyncing = false;
103
+ }
104
+ }
105
+ }
106
+ /**
107
+ * Create and start a file watcher
108
+ */
109
+ export function createWatcher(client, config) {
110
+ const watcher = new FileWatcher(client, config);
111
+ watcher.start();
112
+ return watcher;
113
+ }
114
+ //# sourceMappingURL=watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/sync/watcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Configuration stored in .epiccontext file
3
+ */
4
+ export interface EpicContextConfig {
5
+ version: number;
6
+ project: {
7
+ id: string;
8
+ url: string;
9
+ name: string;
10
+ slug: string;
11
+ };
12
+ auth: {
13
+ apiKey: string;
14
+ };
15
+ sync: {
16
+ path: string;
17
+ conflictResolution: ConflictResolution;
18
+ autoSync: boolean;
19
+ ignoredPatterns: string[];
20
+ };
21
+ watch: {
22
+ debounce: number;
23
+ pushOnly: boolean;
24
+ };
25
+ }
26
+ export type ConflictResolution = "timestamp" | "local_wins" | "remote_wins" | "ask";
27
+ /**
28
+ * File info for sync operations
29
+ */
30
+ export interface FileInfo {
31
+ path: string;
32
+ content: string;
33
+ }
34
+ /**
35
+ * Block from the EpicContext API
36
+ */
37
+ export interface Block {
38
+ id: string;
39
+ section_id: string;
40
+ type: string;
41
+ key: string;
42
+ name?: string;
43
+ value: Record<string, unknown>;
44
+ status: "empty" | "draft" | "complete";
45
+ sort_order: number;
46
+ created_at: string;
47
+ updated_at: string;
48
+ }
49
+ /**
50
+ * Section info
51
+ */
52
+ export interface SectionInfo {
53
+ type: string;
54
+ name: string;
55
+ }
56
+ /**
57
+ * Block with section info
58
+ */
59
+ export interface BlockWithSection extends Block {
60
+ section: SectionInfo;
61
+ section_type?: string;
62
+ }
63
+ /**
64
+ * Sync result from import operation
65
+ */
66
+ export interface SyncResult {
67
+ created: number;
68
+ updated: number;
69
+ skipped: number;
70
+ conflicts: ConflictRecord[];
71
+ errors: ImportError[];
72
+ }
73
+ export interface ConflictRecord {
74
+ path: string;
75
+ key: string;
76
+ localModified: string;
77
+ remoteModified: string;
78
+ resolution?: string;
79
+ }
80
+ export interface ImportError {
81
+ path: string;
82
+ error: string;
83
+ }
84
+ /**
85
+ * Sync status
86
+ */
87
+ export interface SyncStatus {
88
+ connected: boolean;
89
+ projectId: string;
90
+ projectName: string;
91
+ projectSlug: string;
92
+ lastSyncAt: string | null;
93
+ lastSyncDirection: "import" | "export" | null;
94
+ localChanges: number;
95
+ remoteChanges: number;
96
+ conflicts: number;
97
+ }
98
+ /**
99
+ * Export response
100
+ */
101
+ export interface ExportResponse {
102
+ project: {
103
+ id: string;
104
+ name: string;
105
+ slug: string;
106
+ };
107
+ files: FileInfo[];
108
+ totalFiles: number;
109
+ }
110
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@epiccontext/mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP server and CLI for syncing EpicContext documentation with local codebases",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "epicontext": "./dist/bin/epicontext.js"
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "dev": "tsc --watch",
17
+ "test": "vitest",
18
+ "lint": "eslint src",
19
+ "prepublishOnly": "npm run build"
20
+ },
21
+ "keywords": [
22
+ "mcp",
23
+ "model-context-protocol",
24
+ "epiccontext",
25
+ "documentation",
26
+ "sync",
27
+ "ai",
28
+ "claude",
29
+ "cursor"
30
+ ],
31
+ "author": "EpicContext",
32
+ "license": "MIT",
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "https://github.com/lijbers-com/EpicContext.git",
36
+ "directory": "packages/epiccontext-mcp"
37
+ },
38
+ "dependencies": {
39
+ "@modelcontextprotocol/sdk": "^1.0.0",
40
+ "chalk": "^5.3.0",
41
+ "chokidar": "^4.0.3",
42
+ "commander": "^12.1.0",
43
+ "conf": "^13.0.1",
44
+ "gray-matter": "^4.0.3",
45
+ "inquirer": "^12.2.0",
46
+ "ora": "^8.1.1"
47
+ },
48
+ "devDependencies": {
49
+ "@types/node": "^22.10.2",
50
+ "typescript": "^5.7.2",
51
+ "vitest": "^2.1.8"
52
+ },
53
+ "engines": {
54
+ "node": ">=18"
55
+ }
56
+ }