@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 @@
1
+ {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../../src/cli/commands/pull.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface PushOptions {
2
+ section?: string;
3
+ force?: boolean;
4
+ }
5
+ export declare function pushCommand(options: PushOptions): Promise<void>;
6
+ //# sourceMappingURL=push.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/push.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,CAgErE"}
@@ -0,0 +1,64 @@
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 { pushToCloud } from "../../sync/push.js";
6
+ export async function pushCommand(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("Pushing to EpicContext...").start();
27
+ try {
28
+ const result = await pushToCloud(client, contextPath, {
29
+ path: options.section,
30
+ conflictResolution: options.force ? "folder_wins" : "timestamp",
31
+ });
32
+ spinner.succeed("Push complete!");
33
+ console.log("");
34
+ console.log(chalk.gray(` Files processed: ${result.filesProcessed}`));
35
+ if (result.result.created > 0) {
36
+ console.log(chalk.green(` Created: ${result.result.created} block(s)`));
37
+ }
38
+ if (result.result.updated > 0) {
39
+ console.log(chalk.blue(` Updated: ${result.result.updated} block(s)`));
40
+ }
41
+ if (result.result.skipped > 0) {
42
+ console.log(chalk.yellow(` Skipped: ${result.result.skipped} block(s)`));
43
+ }
44
+ if (result.result.conflicts.length > 0) {
45
+ console.log(chalk.red(` Conflicts: ${result.result.conflicts.length}`));
46
+ for (const conflict of result.result.conflicts) {
47
+ console.log(chalk.red(` - ${conflict.path}`));
48
+ }
49
+ }
50
+ if (result.result.errors.length > 0) {
51
+ console.log(chalk.red(` Errors: ${result.result.errors.length}`));
52
+ for (const error of result.result.errors) {
53
+ console.log(chalk.red(` - ${error.path}: ${error.error}`));
54
+ }
55
+ }
56
+ console.log("");
57
+ }
58
+ catch (error) {
59
+ spinner.fail("Push failed");
60
+ console.error(chalk.red("Error:"), error.message);
61
+ process.exit(1);
62
+ }
63
+ }
64
+ //# sourceMappingURL=push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../../src/cli/commands/push.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export interface ServeOptions {
2
+ transport?: string;
3
+ }
4
+ export declare function serveCommand(options: ServeOptions): Promise<void>;
5
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/serve.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAyCvE"}
@@ -0,0 +1,42 @@
1
+ import chalk from "chalk";
2
+ import { loadConfig, getContextPath } from "../config.js";
3
+ import { createClient } from "../../api/client.js";
4
+ import { startMcpServer } from "../../mcp/server.js";
5
+ export async function serveCommand(options) {
6
+ const config = loadConfig();
7
+ if (!config?.project?.id || !config?.auth?.apiKey) {
8
+ console.error(chalk.yellow("Not linked to an EpicContext project."));
9
+ console.error(`Run ${chalk.cyan("epiccontext link")} to connect.`);
10
+ process.exit(1);
11
+ }
12
+ const contextPath = getContextPath();
13
+ if (!contextPath) {
14
+ console.error(chalk.red("Could not determine CONTEXT folder path."));
15
+ process.exit(1);
16
+ }
17
+ // Get project URL parts
18
+ const urlParts = config.project.url?.split("/").filter(Boolean) || [];
19
+ const baseUrl = urlParts.slice(0, 3).join("/").replace("https:/", "https://") || "https://app.epiccontext.io";
20
+ const client = createClient({
21
+ baseUrl,
22
+ apiKey: config.auth.apiKey,
23
+ projectId: config.project.id,
24
+ });
25
+ // Log to stderr so it doesn't interfere with MCP stdio
26
+ console.error(chalk.blue("Starting MCP server..."));
27
+ console.error(` Project: ${chalk.cyan(config.project.name)}`);
28
+ console.error(` Transport: ${options.transport || "stdio"}`);
29
+ console.error("");
30
+ try {
31
+ await startMcpServer({
32
+ client,
33
+ contextPath,
34
+ config,
35
+ });
36
+ }
37
+ catch (error) {
38
+ console.error(chalk.red("MCP server error:"), error.message);
39
+ process.exit(1);
40
+ }
41
+ }
42
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/cli/commands/serve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAMrD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAqB;IACtD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,uCAAuC,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,wBAAwB;IACxB,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACtE,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,4BAA4B,CAAC;IAE9G,MAAM,MAAM,GAAG,YAAY,CAAC;QAC1B,OAAO;QACP,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM;QAC1B,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE;KAC7B,CAAC,CAAC;IAEH,uDAAuD;IACvD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,KAAK,CAAC,cAAc,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/D,OAAO,CAAC,KAAK,CAAC,gBAAgB,OAAO,CAAC,SAAS,IAAI,OAAO,EAAE,CAAC,CAAC;IAC9D,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAElB,IAAI,CAAC;QACH,MAAM,cAAc,CAAC;YACnB,MAAM;YACN,WAAW;YACX,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function statusCommand(): Promise<void>;
2
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAOA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CA0EnD"}
@@ -0,0 +1,85 @@
1
+ import chalk from "chalk";
2
+ import ora from "ora";
3
+ import { loadConfig, getProjectRoot, getContextPath } from "../config.js";
4
+ import { createClient } from "../../api/client.js";
5
+ import { readContextFolder } from "../files.js";
6
+ export async function statusCommand() {
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 spinner = ora("Checking status...").start();
14
+ try {
15
+ const projectRoot = getProjectRoot();
16
+ const contextPath = getContextPath();
17
+ // Get project URL parts
18
+ const urlParts = config.project.url?.split("/").filter(Boolean) || [];
19
+ const baseUrl = urlParts.slice(0, 3).join("/").replace("https:/", "https://") || "https://app.epiccontext.io";
20
+ const client = createClient({
21
+ baseUrl,
22
+ apiKey: config.auth.apiKey,
23
+ projectId: config.project.id,
24
+ });
25
+ // Get sync status from cloud
26
+ const syncStatus = await client.getSyncStatus();
27
+ // Count local files
28
+ const localFiles = contextPath ? readContextFolder(contextPath) : [];
29
+ spinner.stop();
30
+ console.log("");
31
+ console.log(chalk.blue.bold("EpicContext Status"));
32
+ console.log("");
33
+ // Project info
34
+ console.log(chalk.gray("Project:"));
35
+ console.log(` Name: ${chalk.cyan(syncStatus.projectName)}`);
36
+ console.log(` ID: ${syncStatus.projectId}`);
37
+ console.log(` URL: ${config.project.url}`);
38
+ console.log("");
39
+ // Local folder info
40
+ console.log(chalk.gray("Local:"));
41
+ console.log(` Path: ${config.sync.path}`);
42
+ console.log(` Files: ${localFiles.length} markdown files`);
43
+ console.log("");
44
+ // Sync settings
45
+ console.log(chalk.gray("Sync Settings:"));
46
+ console.log(` Conflict Resolution: ${config.sync.conflictResolution}`);
47
+ console.log(` Auto-sync: ${config.sync.autoSync ? "enabled" : "disabled"}`);
48
+ console.log("");
49
+ // Last sync info
50
+ if (syncStatus.sync.lastSyncAt) {
51
+ const lastSync = new Date(syncStatus.sync.lastSyncAt);
52
+ const ago = getTimeAgo(lastSync);
53
+ console.log(chalk.gray("Last Sync:"));
54
+ console.log(` Time: ${lastSync.toLocaleString()} (${ago})`);
55
+ console.log(` Direction: ${syncStatus.sync.lastSyncDirection || "unknown"}`);
56
+ console.log("");
57
+ }
58
+ else {
59
+ console.log(chalk.yellow("No sync history yet."));
60
+ console.log(`Run ${chalk.cyan("epiccontext sync")} to synchronize.`);
61
+ console.log("");
62
+ }
63
+ }
64
+ catch (error) {
65
+ spinner.fail("Failed to get status");
66
+ console.error(chalk.red("Error:"), error.message);
67
+ process.exit(1);
68
+ }
69
+ }
70
+ /**
71
+ * Get human-readable time ago string
72
+ */
73
+ function getTimeAgo(date) {
74
+ const seconds = Math.floor((Date.now() - date.getTime()) / 1000);
75
+ if (seconds < 60)
76
+ return "just now";
77
+ if (seconds < 3600)
78
+ return `${Math.floor(seconds / 60)} minutes ago`;
79
+ if (seconds < 86400)
80
+ return `${Math.floor(seconds / 3600)} hours ago`;
81
+ if (seconds < 604800)
82
+ return `${Math.floor(seconds / 86400)} days ago`;
83
+ return date.toLocaleDateString();
84
+ }
85
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface SyncOptions {
2
+ dryRun?: boolean;
3
+ conflict?: string;
4
+ section?: string;
5
+ }
6
+ export declare function syncCommand(options: SyncOptions): Promise<void>;
7
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/sync.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAqGrE"}
@@ -0,0 +1,91 @@
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
+ import { pushToCloud } from "../../sync/push.js";
7
+ export async function syncCommand(options) {
8
+ const config = loadConfig();
9
+ if (!config?.project?.id || !config?.auth?.apiKey) {
10
+ console.log(chalk.yellow("Not linked to an EpicContext project."));
11
+ console.log(`Run ${chalk.cyan("epiccontext link")} to connect.`);
12
+ return;
13
+ }
14
+ const contextPath = getContextPath();
15
+ if (!contextPath) {
16
+ console.log(chalk.red("Could not determine CONTEXT folder path."));
17
+ return;
18
+ }
19
+ // Get project URL parts
20
+ const urlParts = config.project.url?.split("/").filter(Boolean) || [];
21
+ const baseUrl = urlParts.slice(0, 3).join("/").replace("https:/", "https://") || "https://app.epiccontext.io";
22
+ const client = createClient({
23
+ baseUrl,
24
+ apiKey: config.auth.apiKey,
25
+ projectId: config.project.id,
26
+ });
27
+ console.log(chalk.blue("Syncing with EpicContext..."));
28
+ if (options.dryRun) {
29
+ console.log(chalk.yellow("(Dry run - no changes will be applied)"));
30
+ }
31
+ console.log("");
32
+ // Step 1: Pull from cloud (get remote changes)
33
+ const pullSpinner = ora("Pulling from cloud...").start();
34
+ try {
35
+ const pullResult = await pullFromCloud(client, contextPath, {
36
+ section: options.section,
37
+ });
38
+ pullSpinner.succeed(`Pulled: ${pullResult.filesWritten} written, ${pullResult.filesSkipped} skipped`);
39
+ }
40
+ catch (error) {
41
+ pullSpinner.fail("Pull failed");
42
+ console.error(chalk.red("Error:"), error.message);
43
+ process.exit(1);
44
+ }
45
+ // Step 2: Push to cloud (send local changes)
46
+ const pushSpinner = ora("Pushing to cloud...").start();
47
+ try {
48
+ const conflictResolution = options.conflict === "local"
49
+ ? "folder_wins"
50
+ : options.conflict === "remote"
51
+ ? "ui_wins"
52
+ : "timestamp";
53
+ const pushResult = await pushToCloud(client, contextPath, {
54
+ dryRun: options.dryRun,
55
+ path: options.section,
56
+ conflictResolution: conflictResolution,
57
+ });
58
+ pushSpinner.succeed(`Pushed: ${pushResult.result.created} created, ${pushResult.result.updated} updated`);
59
+ // Show summary
60
+ console.log("");
61
+ console.log(chalk.blue.bold("Sync Summary"));
62
+ console.log("");
63
+ if (pushResult.result.conflicts.length > 0) {
64
+ console.log(chalk.yellow(`Conflicts: ${pushResult.result.conflicts.length}`));
65
+ for (const conflict of pushResult.result.conflicts) {
66
+ console.log(chalk.yellow(` - ${conflict.path}`));
67
+ }
68
+ console.log("");
69
+ }
70
+ if (pushResult.result.errors.length > 0) {
71
+ console.log(chalk.red(`Errors: ${pushResult.result.errors.length}`));
72
+ for (const error of pushResult.result.errors) {
73
+ console.log(chalk.red(` - ${error.path}: ${error.error}`));
74
+ }
75
+ console.log("");
76
+ }
77
+ if (options.dryRun) {
78
+ console.log(chalk.yellow("This was a dry run. Run without --dry-run to apply changes."));
79
+ }
80
+ else {
81
+ console.log(chalk.green("Sync complete!"));
82
+ }
83
+ console.log("");
84
+ }
85
+ catch (error) {
86
+ pushSpinner.fail("Push failed");
87
+ console.error(chalk.red("Error:"), error.message);
88
+ process.exit(1);
89
+ }
90
+ }
91
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/cli/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface WatchOptions {
2
+ debounce?: string;
3
+ pushOnly?: boolean;
4
+ }
5
+ export declare function watchCommand(options: WatchOptions): Promise<void>;
6
+ //# sourceMappingURL=watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAgFvE"}
@@ -0,0 +1,66 @@
1
+ import chalk from "chalk";
2
+ import { loadConfig, getContextPath } from "../config.js";
3
+ import { createClient } from "../../api/client.js";
4
+ import { createWatcher } from "../../sync/watcher.js";
5
+ export async function watchCommand(options) {
6
+ const config = loadConfig();
7
+ if (!config?.project?.id || !config?.auth?.apiKey) {
8
+ console.log(chalk.yellow("Not linked to an EpicContext project."));
9
+ console.log(`Run ${chalk.cyan("epiccontext link")} to connect.`);
10
+ return;
11
+ }
12
+ const contextPath = getContextPath();
13
+ if (!contextPath) {
14
+ console.log(chalk.red("Could not determine CONTEXT folder path."));
15
+ return;
16
+ }
17
+ // Get project URL parts
18
+ const urlParts = config.project.url?.split("/").filter(Boolean) || [];
19
+ const baseUrl = urlParts.slice(0, 3).join("/").replace("https:/", "https://") || "https://app.epiccontext.io";
20
+ const client = createClient({
21
+ baseUrl,
22
+ apiKey: config.auth.apiKey,
23
+ projectId: config.project.id,
24
+ });
25
+ const debounce = parseInt(options.debounce || "2000", 10);
26
+ console.log(chalk.blue("Starting file watcher..."));
27
+ console.log("");
28
+ console.log(` Project: ${chalk.cyan(config.project.name)}`);
29
+ console.log(` Path: ${contextPath}`);
30
+ console.log(` Debounce: ${debounce}ms`);
31
+ console.log("");
32
+ console.log(chalk.gray("Watching for changes... (Press Ctrl+C to stop)"));
33
+ console.log("");
34
+ const watcher = createWatcher(client, {
35
+ contextPath,
36
+ debounce,
37
+ ignoredPatterns: config.sync.ignoredPatterns,
38
+ pushOnly: options.pushOnly ?? false,
39
+ onChange: (event, path) => {
40
+ const timestamp = new Date().toLocaleTimeString();
41
+ console.log(chalk.gray(`[${timestamp}]`), chalk.blue(event), path);
42
+ },
43
+ onSync: (result) => {
44
+ const timestamp = new Date().toLocaleTimeString();
45
+ console.log(chalk.gray(`[${timestamp}]`), chalk.green("Synced"), `${result.files} file(s):`, `${result.created} created,`, `${result.updated} updated`);
46
+ },
47
+ onError: (error) => {
48
+ const timestamp = new Date().toLocaleTimeString();
49
+ console.log(chalk.gray(`[${timestamp}]`), chalk.red("Error:"), error.message);
50
+ },
51
+ });
52
+ // Handle graceful shutdown
53
+ process.on("SIGINT", () => {
54
+ console.log("");
55
+ console.log(chalk.yellow("Stopping watcher..."));
56
+ watcher.stop();
57
+ process.exit(0);
58
+ });
59
+ process.on("SIGTERM", () => {
60
+ watcher.stop();
61
+ process.exit(0);
62
+ });
63
+ // Keep process running
64
+ await new Promise(() => { });
65
+ }
66
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import Conf from "conf";
2
+ import type { EpicContextConfig } from "../types/index.js";
3
+ /**
4
+ * Find the config file in current or parent directories
5
+ */
6
+ export declare function findConfigPath(startDir?: string): string | null;
7
+ /**
8
+ * Load configuration from .epiccontext file
9
+ */
10
+ export declare function loadConfig(configPath?: string): EpicContextConfig | null;
11
+ /**
12
+ * Save configuration to .epiccontext file
13
+ */
14
+ export declare function saveConfig(config: Partial<EpicContextConfig>, configPath?: string): void;
15
+ /**
16
+ * Get the project root directory (where .epiccontext is located)
17
+ */
18
+ export declare function getProjectRoot(): string | null;
19
+ /**
20
+ * Get the context folder path
21
+ */
22
+ export declare function getContextPath(): string | null;
23
+ /**
24
+ * Check if current directory is inside an EpicContext project
25
+ */
26
+ export declare function isInsideProject(): boolean;
27
+ /**
28
+ * Global config store for user preferences (stored in home directory)
29
+ */
30
+ export declare const globalConfig: Conf<{
31
+ defaultBaseUrl: string;
32
+ recentProjects: Array<{
33
+ id: string;
34
+ name: string;
35
+ url: string;
36
+ lastAccess: string;
37
+ }>;
38
+ }>;
39
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AA8B3D;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAY9E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAexE;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,OAAO,CAAC,iBAAiB,CAAC,EAClC,UAAU,CAAC,EAAE,MAAM,GAClB,IAAI,CAcN;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,CAM9C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,CAS9C;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;GAEG;AACH,eAAO,MAAM,YAAY;oBACP,MAAM;oBACN,KAAK,CAAC;QACpB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;EAOF,CAAC"}
@@ -0,0 +1,133 @@
1
+ import Conf from "conf";
2
+ import * as fs from "fs";
3
+ import * as path from "path";
4
+ const CONFIG_FILENAME = ".epiccontext";
5
+ /**
6
+ * Default configuration
7
+ */
8
+ const defaultConfig = {
9
+ version: 1,
10
+ project: {
11
+ id: "",
12
+ url: "",
13
+ name: "",
14
+ slug: "",
15
+ },
16
+ auth: {
17
+ apiKey: "",
18
+ },
19
+ sync: {
20
+ path: "./CONTEXT",
21
+ conflictResolution: "timestamp",
22
+ autoSync: false,
23
+ ignoredPatterns: ["*.tmp", ".DS_Store", "node_modules"],
24
+ },
25
+ watch: {
26
+ debounce: 2000,
27
+ pushOnly: false,
28
+ },
29
+ };
30
+ /**
31
+ * Find the config file in current or parent directories
32
+ */
33
+ export function findConfigPath(startDir = process.cwd()) {
34
+ let currentDir = startDir;
35
+ while (currentDir !== path.dirname(currentDir)) {
36
+ const configPath = path.join(currentDir, CONFIG_FILENAME);
37
+ if (fs.existsSync(configPath)) {
38
+ return configPath;
39
+ }
40
+ currentDir = path.dirname(currentDir);
41
+ }
42
+ return null;
43
+ }
44
+ /**
45
+ * Load configuration from .epiccontext file
46
+ */
47
+ export function loadConfig(configPath) {
48
+ const filePath = configPath || findConfigPath();
49
+ if (!filePath || !fs.existsSync(filePath)) {
50
+ return null;
51
+ }
52
+ try {
53
+ const content = fs.readFileSync(filePath, "utf-8");
54
+ const config = JSON.parse(content);
55
+ return { ...defaultConfig, ...config };
56
+ }
57
+ catch (error) {
58
+ console.error(`Failed to parse config file: ${filePath}`);
59
+ return null;
60
+ }
61
+ }
62
+ /**
63
+ * Save configuration to .epiccontext file
64
+ */
65
+ export function saveConfig(config, configPath) {
66
+ const filePath = configPath || path.join(process.cwd(), CONFIG_FILENAME);
67
+ const existingConfig = loadConfig(filePath) || defaultConfig;
68
+ // Deep merge configurations
69
+ const mergedConfig = {
70
+ version: config.version ?? existingConfig.version,
71
+ project: { ...existingConfig.project, ...config.project },
72
+ auth: { ...existingConfig.auth, ...config.auth },
73
+ sync: { ...existingConfig.sync, ...config.sync },
74
+ watch: { ...existingConfig.watch, ...config.watch },
75
+ };
76
+ fs.writeFileSync(filePath, JSON.stringify(mergedConfig, null, 2), "utf-8");
77
+ }
78
+ /**
79
+ * Get the project root directory (where .epiccontext is located)
80
+ */
81
+ export function getProjectRoot() {
82
+ const configPath = findConfigPath();
83
+ if (!configPath) {
84
+ return null;
85
+ }
86
+ return path.dirname(configPath);
87
+ }
88
+ /**
89
+ * Get the context folder path
90
+ */
91
+ export function getContextPath() {
92
+ const config = loadConfig();
93
+ const projectRoot = getProjectRoot();
94
+ if (!config || !projectRoot) {
95
+ return null;
96
+ }
97
+ return path.resolve(projectRoot, config.sync.path);
98
+ }
99
+ /**
100
+ * Check if current directory is inside an EpicContext project
101
+ */
102
+ export function isInsideProject() {
103
+ return findConfigPath() !== null;
104
+ }
105
+ /**
106
+ * Global config store for user preferences (stored in home directory)
107
+ */
108
+ export const globalConfig = new Conf({
109
+ projectName: "epiccontext",
110
+ defaults: {
111
+ defaultBaseUrl: "https://app.epiccontext.io",
112
+ recentProjects: [],
113
+ },
114
+ });
115
+ /**
116
+ * Deep merge two objects
117
+ */
118
+ function deepMerge(target, source) {
119
+ const output = { ...target };
120
+ for (const key in source) {
121
+ if (source[key] !== undefined &&
122
+ typeof source[key] === "object" &&
123
+ !Array.isArray(source[key]) &&
124
+ source[key] !== null) {
125
+ output[key] = deepMerge((target[key] || {}), source[key]);
126
+ }
127
+ else if (source[key] !== undefined) {
128
+ output[key] = source[key];
129
+ }
130
+ }
131
+ return output;
132
+ }
133
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"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"}