@epiccontext/mcp 0.1.56 → 0.1.57

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 (77) hide show
  1. package/dist/api/client.d.ts +26 -1
  2. package/dist/api/client.d.ts.map +1 -1
  3. package/dist/api/client.js +101 -0
  4. package/dist/api/client.js.map +1 -1
  5. package/dist/cli/commands/add-app.d.ts +9 -0
  6. package/dist/cli/commands/add-app.d.ts.map +1 -0
  7. package/dist/cli/commands/add-app.js +111 -0
  8. package/dist/cli/commands/add-app.js.map +1 -0
  9. package/dist/cli/commands/init.d.ts.map +1 -1
  10. package/dist/cli/commands/init.js +37 -16
  11. package/dist/cli/commands/init.js.map +1 -1
  12. package/dist/cli/commands/pull.d.ts +2 -0
  13. package/dist/cli/commands/pull.d.ts.map +1 -1
  14. package/dist/cli/commands/pull.js +120 -76
  15. package/dist/cli/commands/pull.js.map +1 -1
  16. package/dist/cli/commands/push.d.ts +2 -0
  17. package/dist/cli/commands/push.d.ts.map +1 -1
  18. package/dist/cli/commands/push.js +130 -82
  19. package/dist/cli/commands/push.js.map +1 -1
  20. package/dist/cli/commands/serve.d.ts.map +1 -1
  21. package/dist/cli/commands/serve.js +2 -1
  22. package/dist/cli/commands/serve.js.map +1 -1
  23. package/dist/cli/commands/status.d.ts.map +1 -1
  24. package/dist/cli/commands/status.js +21 -3
  25. package/dist/cli/commands/status.js.map +1 -1
  26. package/dist/cli/commands/validate.d.ts.map +1 -1
  27. package/dist/cli/commands/validate.js +6 -5
  28. package/dist/cli/commands/validate.js.map +1 -1
  29. package/dist/cli/config.d.ts +4 -0
  30. package/dist/cli/config.d.ts.map +1 -1
  31. package/dist/cli/config.js +20 -0
  32. package/dist/cli/config.js.map +1 -1
  33. package/dist/cli/files.d.ts +9 -1
  34. package/dist/cli/files.d.ts.map +1 -1
  35. package/dist/cli/files.js +147 -31
  36. package/dist/cli/files.js.map +1 -1
  37. package/dist/cli/index.d.ts.map +1 -1
  38. package/dist/cli/index.js +12 -0
  39. package/dist/cli/index.js.map +1 -1
  40. package/dist/mcp/server.d.ts +1 -0
  41. package/dist/mcp/server.d.ts.map +1 -1
  42. package/dist/mcp/server.js +12 -0
  43. package/dist/mcp/server.js.map +1 -1
  44. package/dist/mcp/tools/list-documents.d.ts +10 -0
  45. package/dist/mcp/tools/list-documents.d.ts.map +1 -0
  46. package/dist/mcp/tools/list-documents.js +86 -0
  47. package/dist/mcp/tools/list-documents.js.map +1 -0
  48. package/dist/mcp/tools/read-document.d.ts +10 -0
  49. package/dist/mcp/tools/read-document.d.ts.map +1 -0
  50. package/dist/mcp/tools/read-document.js +119 -0
  51. package/dist/mcp/tools/read-document.js.map +1 -0
  52. package/dist/mcp/tools/sync-documents.d.ts +10 -0
  53. package/dist/mcp/tools/sync-documents.d.ts.map +1 -0
  54. package/dist/mcp/tools/sync-documents.js +89 -0
  55. package/dist/mcp/tools/sync-documents.js.map +1 -0
  56. package/dist/skills/generator.d.ts.map +1 -1
  57. package/dist/skills/generator.js +98 -5
  58. package/dist/skills/generator.js.map +1 -1
  59. package/dist/sync/document-files.d.ts +31 -0
  60. package/dist/sync/document-files.d.ts.map +1 -0
  61. package/dist/sync/document-files.js +98 -0
  62. package/dist/sync/document-files.js.map +1 -0
  63. package/dist/sync/document-manifest.d.ts +22 -0
  64. package/dist/sync/document-manifest.d.ts.map +1 -0
  65. package/dist/sync/document-manifest.js +55 -0
  66. package/dist/sync/document-manifest.js.map +1 -0
  67. package/dist/sync/document-pull.d.ts +16 -0
  68. package/dist/sync/document-pull.d.ts.map +1 -0
  69. package/dist/sync/document-pull.js +149 -0
  70. package/dist/sync/document-pull.js.map +1 -0
  71. package/dist/sync/document-push.d.ts +14 -0
  72. package/dist/sync/document-push.d.ts.map +1 -0
  73. package/dist/sync/document-push.js +107 -0
  74. package/dist/sync/document-push.js.map +1 -0
  75. package/dist/types/index.d.ts +102 -0
  76. package/dist/types/index.d.ts.map +1 -1
  77. package/package.json +1 -1
@@ -74,6 +74,12 @@ const SECTION_CONFIGS = {
74
74
  folder: "metrics",
75
75
  blockTypes: ["metric", "analytics_event", "north_star", "kpi"],
76
76
  },
77
+ performance: {
78
+ name: "Performance Expert",
79
+ description: "Reviews performance metrics for clarity and actionability. Helps read charts, set insights, and analyze KPI trends",
80
+ folder: "performance",
81
+ blockTypes: ["metric", "analytics_event", "north_star", "kpi"],
82
+ },
77
83
  decisions: {
78
84
  name: "Decision Recorder",
79
85
  description: "Ensures decisions are properly documented with context and rationale",
@@ -177,6 +183,13 @@ Example:
177
183
  - This addresses: [link to existing content]
178
184
  \`\`\`
179
185
 
186
+ ## Context Staleness Check
187
+
188
+ When this section's blocks are referenced in code changes, verify they're still accurate.
189
+ If you implemented something that relates to blocks in CONTEXT/${config.folder}/:
190
+ - Update block status if work is complete
191
+ - Flag any content that no longer matches the implementation
192
+
180
193
  ## Anti-Patterns to Avoid
181
194
 
182
195
  - Creating content without reading existing CONTEXT
@@ -184,6 +197,7 @@ Example:
184
197
  - Not linking to related sections
185
198
  - Using placeholder text (TBD, TODO, Lorem ipsum)
186
199
  - Using wrong block types for the content
200
+ - Leaving block status as "draft" after implementation is complete
187
201
  `;
188
202
  }
189
203
  /**
@@ -205,12 +219,23 @@ allowed-tools: Read, Grep, Glob
205
219
  This project uses EpicContext for structured product documentation.
206
220
  The CONTEXT/ folder is the single source of truth.
207
221
 
222
+ ## Project Structure
223
+
224
+ \`\`\`
225
+ ./
226
+ ├── CONTEXT/ Documentation blocks (syncs with EpicContext cloud)
227
+ ├── DOCUMENTS/ Reference files: PDFs, images, research (syncs with cloud)
228
+ ├── apps/ Code repositories (git repos)
229
+ └── .epicontext Project configuration
230
+ \`\`\`
231
+
208
232
  ## Critical Rules
209
233
 
210
234
  1. **ALWAYS read CONTEXT first** - Before any development task, check relevant sections
211
235
  2. **Traceability required** - All code must trace to documented requirements
212
236
  3. **One block per file** - Never combine multiple items
213
237
  4. **Use correct block types** - See CONTEXT/AI-GUIDE.md
238
+ 5. **Update CONTEXT after implementation** - Keep documentation in sync with code
214
239
 
215
240
  ## Quick Navigation
216
241
 
@@ -222,20 +247,42 @@ The CONTEXT/ folder is the single source of truth.
222
247
  | How to build | CONTEXT/technical/ |
223
248
  | Past decisions | CONTEXT/decisions/ |
224
249
  | Visual design | CONTEXT/design-system/ and CONTEXT/brand/ |
250
+ | Reference docs | DOCUMENTS/ |
225
251
 
226
252
  ## Before Starting Work
227
253
 
228
254
  1. Read \`CONTEXT/AI-GUIDE.md\` for block schemas
229
255
  2. Check relevant sections for your task
230
- 3. Cite sources in your output
231
- 4. Update CONTEXT if you make decisions
256
+ 3. Browse \`DOCUMENTS/\` for reference materials
257
+ 4. Cite sources in your output
258
+
259
+ ## AFTER Implementation — Context Update Triggers
260
+
261
+ **You MUST update CONTEXT when your work changes the product.**
262
+
263
+ | What You Did | Required Context Update |
264
+ |-------------|------------------------|
265
+ | Implemented a feature | Set feature block \`status: complete\` |
266
+ | Made a technical decision | Create a \`decision\` block in \`decisions/\` |
267
+ | Added an API endpoint | Create an \`api_endpoint\` block in \`technical/api/\` |
268
+ | Completed a task | Set task block \`status: complete\` |
269
+ | Changed data models | Update \`data_model\` blocks in \`technical/models/\` |
270
+ | Added a new integration | Create an \`integration\` block in \`technical/integrations/\` |
271
+ | Discovered a constraint | Create a \`constraint\` block |
272
+
273
+ After updating CONTEXT, push changes:
274
+ \`\`\`bash
275
+ npx @epiccontext/mcp push
276
+ \`\`\`
232
277
 
233
278
  ## Sync Commands
234
279
 
235
280
  \`\`\`bash
236
- npx @epiccontext/mcp push # Push changes to cloud
237
- npx @epiccontext/mcp pull # Pull from cloud
238
- npx @epiccontext/mcp status # Check sync status
281
+ npx @epiccontext/mcp push # Push CONTEXT to cloud
282
+ npx @epiccontext/mcp pull # Pull CONTEXT from cloud
283
+ npx @epiccontext/mcp push --with-documents # Push CONTEXT + DOCUMENTS
284
+ npx @epiccontext/mcp pull --with-documents # Pull CONTEXT + DOCUMENTS
285
+ npx @epiccontext/mcp status # Check sync status
239
286
  \`\`\`
240
287
  `;
241
288
  }
@@ -485,6 +532,52 @@ export function generateSkills(projectRoot) {
485
532
  path: ".claude/skills/epicontext-core/SKILL.md",
486
533
  content: generateCoreSkillMd(),
487
534
  });
535
+ // Core skill workflow: post-implementation context update
536
+ result.workflows.push({
537
+ path: ".claude/skills/epicontext-core/workflows/post-implementation.md",
538
+ content: generateWorkflowMd("epicontext-core", {
539
+ id: "post-implementation",
540
+ name: "Post-Implementation",
541
+ description: "Check which CONTEXT blocks need updating after implementing code changes",
542
+ allowedTools: ["Read", "Grep", "Glob"],
543
+ prompt: `# Post-Implementation Context Check
544
+
545
+ After implementing code changes, check which CONTEXT blocks need updating.
546
+
547
+ ## Process
548
+
549
+ 1. **Identify what changed** — Look at the code changes just made
550
+ 2. **Check related CONTEXT blocks** — Search for blocks that reference this area:
551
+ - Grep for feature names in CONTEXT/product/features/
552
+ - Grep for task/story names in CONTEXT/development/
553
+ - Check CONTEXT/technical/ for relevant API or data model blocks
554
+ 3. **Suggest updates** — For each related block:
555
+ - If a feature was implemented → suggest setting status to "complete"
556
+ - If a task was completed → suggest setting status to "complete"
557
+ - If a decision was made → suggest creating a decision block
558
+ - If data models changed → suggest updating data_model blocks
559
+ - If a new API was added → suggest creating api_endpoint block
560
+
561
+ ## Output Format
562
+
563
+ \`\`\`
564
+ ## Context Blocks to Update
565
+
566
+ ### Status Changes
567
+ - [ ] CONTEXT/development/tasks/[task].md → status: complete
568
+ - [ ] CONTEXT/product/features/[feature].md → status: complete
569
+
570
+ ### New Blocks Needed
571
+ - [ ] Create decision block: [what was decided]
572
+ - [ ] Create api_endpoint block: [new endpoint]
573
+
574
+ ### No Action Needed
575
+ - [blocks that are still accurate]
576
+ \`\`\`
577
+
578
+ Remind the user to run \`npx @epiccontext/mcp push\` after updates.`,
579
+ }),
580
+ });
488
581
  // Alignment skill with workflows
489
582
  result.skills.push({
490
583
  path: ".claude/skills/epicontext-alignment/SKILL.md",
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/skills/generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/skills/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Scanned file info from the local DOCUMENTS folder
3
+ */
4
+ export interface ScannedFile {
5
+ /** Relative path within DOCUMENTS/, e.g., "research/user-interviews.pdf" */
6
+ relativePath: string;
7
+ /** Absolute path on disk */
8
+ absolutePath: string;
9
+ /** File size in bytes */
10
+ size: number;
11
+ /** Last modified time */
12
+ mtime: Date;
13
+ }
14
+ /**
15
+ * Recursively scan the DOCUMENTS folder for all non-hidden files
16
+ */
17
+ export declare function scanDocumentsFolder(documentsPath: string): ScannedFile[];
18
+ /**
19
+ * Ensure the DOCUMENTS folder and manifest exist
20
+ */
21
+ export declare function ensureDocumentsFolderExists(documentsPath: string): void;
22
+ /**
23
+ * Get a MIME type from file extension
24
+ */
25
+ export declare function getMimeType(fileName: string): string;
26
+ /**
27
+ * Compute the local file path for a document based on its folder path and file name.
28
+ * e.g., folderPath="research/interviews", fileName="report.pdf" → "research/interviews/report.pdf"
29
+ */
30
+ export declare function computeLocalPath(folderPath: string | null, fileName: string): string;
31
+ //# sourceMappingURL=document-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-files.d.ts","sourceRoot":"","sources":["../../src/sync/document-files.ts"],"names":[],"mappings":"AAaA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,4EAA4E;IAC5E,YAAY,EAAE,MAAM,CAAC;IACrB,4BAA4B;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,KAAK,EAAE,IAAI,CAAC;CACb;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,WAAW,EAAE,CAqCxE;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAavE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAuBpD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,QAAQ,EAAE,MAAM,GACf,MAAM,CAKR"}
@@ -0,0 +1,98 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ /**
4
+ * Files to skip when scanning the DOCUMENTS folder
5
+ */
6
+ const SKIP_FILES = new Set([
7
+ ".manifest.json",
8
+ ".ds_store",
9
+ "thumbs.db",
10
+ ".gitkeep",
11
+ ]);
12
+ /**
13
+ * Recursively scan the DOCUMENTS folder for all non-hidden files
14
+ */
15
+ export function scanDocumentsFolder(documentsPath) {
16
+ const results = [];
17
+ function walk(dir) {
18
+ if (!fs.existsSync(dir))
19
+ return;
20
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
21
+ for (const entry of entries) {
22
+ // Skip hidden files/directories
23
+ if (entry.name.startsWith("."))
24
+ continue;
25
+ // Skip known system files
26
+ if (SKIP_FILES.has(entry.name.toLowerCase()))
27
+ continue;
28
+ const fullPath = path.join(dir, entry.name);
29
+ if (entry.isDirectory()) {
30
+ walk(fullPath);
31
+ }
32
+ else if (entry.isFile()) {
33
+ const stats = fs.statSync(fullPath);
34
+ const relativePath = path.relative(documentsPath, fullPath);
35
+ // Skip README.md at root level
36
+ if (relativePath === "README.md")
37
+ continue;
38
+ results.push({
39
+ relativePath,
40
+ absolutePath: fullPath,
41
+ size: stats.size,
42
+ mtime: stats.mtime,
43
+ });
44
+ }
45
+ }
46
+ }
47
+ walk(documentsPath);
48
+ return results;
49
+ }
50
+ /**
51
+ * Ensure the DOCUMENTS folder and manifest exist
52
+ */
53
+ export function ensureDocumentsFolderExists(documentsPath) {
54
+ if (!fs.existsSync(documentsPath)) {
55
+ fs.mkdirSync(documentsPath, { recursive: true });
56
+ }
57
+ const manifestPath = path.join(documentsPath, ".manifest.json");
58
+ if (!fs.existsSync(manifestPath)) {
59
+ fs.writeFileSync(manifestPath, JSON.stringify({ version: 1, lastSyncAt: null, entries: [] }, null, 2), "utf-8");
60
+ }
61
+ }
62
+ /**
63
+ * Get a MIME type from file extension
64
+ */
65
+ export function getMimeType(fileName) {
66
+ const ext = path.extname(fileName).toLowerCase();
67
+ const mimeMap = {
68
+ ".pdf": "application/pdf",
69
+ ".jpg": "image/jpeg",
70
+ ".jpeg": "image/jpeg",
71
+ ".png": "image/png",
72
+ ".gif": "image/gif",
73
+ ".webp": "image/webp",
74
+ ".svg": "image/svg+xml",
75
+ ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
76
+ ".xls": "application/vnd.ms-excel",
77
+ ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
78
+ ".doc": "application/msword",
79
+ ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
80
+ ".ppt": "application/vnd.ms-powerpoint",
81
+ ".txt": "text/plain",
82
+ ".csv": "text/csv",
83
+ ".md": "text/markdown",
84
+ ".zip": "application/zip",
85
+ };
86
+ return mimeMap[ext] || "application/octet-stream";
87
+ }
88
+ /**
89
+ * Compute the local file path for a document based on its folder path and file name.
90
+ * e.g., folderPath="research/interviews", fileName="report.pdf" → "research/interviews/report.pdf"
91
+ */
92
+ export function computeLocalPath(folderPath, fileName) {
93
+ if (folderPath) {
94
+ return path.join(folderPath, fileName);
95
+ }
96
+ return fileName;
97
+ }
98
+ //# sourceMappingURL=document-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-files.js","sourceRoot":"","sources":["../../src/sync/document-files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { DocumentManifest, DocumentManifestEntry } from "../types/index.js";
2
+ /**
3
+ * Read the document manifest from the DOCUMENTS folder
4
+ */
5
+ export declare function readDocumentManifest(documentsPath: string): DocumentManifest;
6
+ /**
7
+ * Write the document manifest to the DOCUMENTS folder
8
+ */
9
+ export declare function writeDocumentManifest(documentsPath: string, manifest: DocumentManifest): void;
10
+ /**
11
+ * Update a single entry in the manifest (upsert by document ID)
12
+ */
13
+ export declare function updateManifestEntry(documentsPath: string, entry: DocumentManifestEntry): void;
14
+ /**
15
+ * Remove an entry from the manifest by document ID
16
+ */
17
+ export declare function removeManifestEntry(documentsPath: string, documentId: string): void;
18
+ /**
19
+ * Find a manifest entry by local path
20
+ */
21
+ export declare function findEntryByLocalPath(manifest: DocumentManifest, localPath: string): DocumentManifestEntry | undefined;
22
+ //# sourceMappingURL=document-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-manifest.d.ts","sourceRoot":"","sources":["../../src/sync/document-manifest.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAIjF;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,gBAAgB,CAa5E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,gBAAgB,GACzB,IAAI,CAGN;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,qBAAqB,GAC3B,IAAI,CAWN;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,GACjB,IAAI,CAIN;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,MAAM,GAChB,qBAAqB,GAAG,SAAS,CAEnC"}
@@ -0,0 +1,55 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ const MANIFEST_FILENAME = ".manifest.json";
4
+ /**
5
+ * Read the document manifest from the DOCUMENTS folder
6
+ */
7
+ export function readDocumentManifest(documentsPath) {
8
+ const manifestPath = path.join(documentsPath, MANIFEST_FILENAME);
9
+ if (!fs.existsSync(manifestPath)) {
10
+ return { version: 1, lastSyncAt: null, entries: [] };
11
+ }
12
+ try {
13
+ const content = fs.readFileSync(manifestPath, "utf-8");
14
+ return JSON.parse(content);
15
+ }
16
+ catch {
17
+ return { version: 1, lastSyncAt: null, entries: [] };
18
+ }
19
+ }
20
+ /**
21
+ * Write the document manifest to the DOCUMENTS folder
22
+ */
23
+ export function writeDocumentManifest(documentsPath, manifest) {
24
+ const manifestPath = path.join(documentsPath, MANIFEST_FILENAME);
25
+ fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), "utf-8");
26
+ }
27
+ /**
28
+ * Update a single entry in the manifest (upsert by document ID)
29
+ */
30
+ export function updateManifestEntry(documentsPath, entry) {
31
+ const manifest = readDocumentManifest(documentsPath);
32
+ const idx = manifest.entries.findIndex((e) => e.id === entry.id);
33
+ if (idx >= 0) {
34
+ manifest.entries[idx] = entry;
35
+ }
36
+ else {
37
+ manifest.entries.push(entry);
38
+ }
39
+ writeDocumentManifest(documentsPath, manifest);
40
+ }
41
+ /**
42
+ * Remove an entry from the manifest by document ID
43
+ */
44
+ export function removeManifestEntry(documentsPath, documentId) {
45
+ const manifest = readDocumentManifest(documentsPath);
46
+ manifest.entries = manifest.entries.filter((e) => e.id !== documentId);
47
+ writeDocumentManifest(documentsPath, manifest);
48
+ }
49
+ /**
50
+ * Find a manifest entry by local path
51
+ */
52
+ export function findEntryByLocalPath(manifest, localPath) {
53
+ return manifest.entries.find((e) => e.localPath === localPath);
54
+ }
55
+ //# sourceMappingURL=document-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-manifest.js","sourceRoot":"","sources":["../../src/sync/document-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAE3C;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,aAAqB;IACxD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;IAEjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACvD,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAqB,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACvD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,aAAqB,EACrB,QAA0B;IAE1B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;IACjE,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC7E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,aAAqB,EACrB,KAA4B;IAE5B,MAAM,QAAQ,GAAG,oBAAoB,CAAC,aAAa,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;IAEjE,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;QACb,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,qBAAqB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,aAAqB,EACrB,UAAkB;IAElB,MAAM,QAAQ,GAAG,oBAAoB,CAAC,aAAa,CAAC,CAAC;IACrD,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;IACvE,qBAAqB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAA0B,EAC1B,SAAiB;IAEjB,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;AACjE,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { EpicContextClient } from "../api/client.js";
2
+ import type { DocumentSyncResult } from "../types/index.js";
3
+ export interface DocumentPullOptions {
4
+ /** Overwrite local files even if they are newer */
5
+ force?: boolean;
6
+ /** Skip files larger than this (bytes) */
7
+ maxFileSize?: number;
8
+ /** Preview changes without downloading */
9
+ dryRun?: boolean;
10
+ }
11
+ /**
12
+ * Pull documents from the cloud to the local DOCUMENTS folder.
13
+ * Only downloads new or updated files (delta sync based on timestamps).
14
+ */
15
+ export declare function pullDocuments(client: EpicContextClient, documentsPath: string, options?: DocumentPullOptions): Promise<DocumentSyncResult>;
16
+ //# sourceMappingURL=document-pull.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-pull.d.ts","sourceRoot":"","sources":["../../src/sync/document-pull.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAEV,kBAAkB,EAEnB,MAAM,mBAAmB,CAAC;AAI3B,MAAM,WAAW,mBAAmB;IAClC,mDAAmD;IACnD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,iBAAiB,EACzB,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CA+I7B"}
@@ -0,0 +1,149 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ import { readDocumentManifest, writeDocumentManifest } from "./document-manifest.js";
4
+ import { ensureDocumentsFolderExists, computeLocalPath } from "./document-files.js";
5
+ /**
6
+ * Pull documents from the cloud to the local DOCUMENTS folder.
7
+ * Only downloads new or updated files (delta sync based on timestamps).
8
+ */
9
+ export async function pullDocuments(client, documentsPath, options = {}) {
10
+ ensureDocumentsFolderExists(documentsPath);
11
+ const result = {
12
+ downloaded: 0,
13
+ uploaded: 0,
14
+ skipped: 0,
15
+ deleted: 0,
16
+ errors: [],
17
+ };
18
+ // 1. Get cloud documents
19
+ const cloudData = await client.listDocuments();
20
+ const manifest = readDocumentManifest(documentsPath);
21
+ const manifestMap = new Map(manifest.entries.map((e) => [e.id, e]));
22
+ // 2. Process each cloud document
23
+ for (const cloudDoc of cloudData.documents) {
24
+ const localPath = computeLocalPath(cloudDoc.folderPath || null, cloudDoc.fileName);
25
+ const absolutePath = path.join(documentsPath, localPath);
26
+ // Check max file size
27
+ if (options.maxFileSize && cloudDoc.fileSize > options.maxFileSize) {
28
+ result.skipped++;
29
+ continue;
30
+ }
31
+ const existingEntry = manifestMap.get(cloudDoc.id);
32
+ let needsDownload = false;
33
+ if (!existingEntry) {
34
+ // New document — not in manifest
35
+ needsDownload = true;
36
+ }
37
+ else if (!fs.existsSync(absolutePath)) {
38
+ // In manifest but missing locally — re-download
39
+ needsDownload = true;
40
+ }
41
+ else if (cloudDoc.updatedAt > (existingEntry.cloudUpdatedAt || "")) {
42
+ // Cloud version is newer
43
+ if (options.force) {
44
+ needsDownload = true;
45
+ }
46
+ else {
47
+ // Check if local is also newer (conflict)
48
+ const localMtime = getFileMtime(absolutePath);
49
+ if (localMtime &&
50
+ existingEntry.localUpdatedAt &&
51
+ localMtime > existingEntry.localUpdatedAt) {
52
+ // Both modified — skip unless forced
53
+ result.skipped++;
54
+ continue;
55
+ }
56
+ needsDownload = true;
57
+ }
58
+ }
59
+ else {
60
+ // Already in sync
61
+ result.skipped++;
62
+ continue;
63
+ }
64
+ if (options.dryRun) {
65
+ result.downloaded++;
66
+ continue;
67
+ }
68
+ // Download the file
69
+ try {
70
+ const { data } = await client.downloadDocument(cloudDoc.id);
71
+ // Ensure directory exists
72
+ const dir = path.dirname(absolutePath);
73
+ if (!fs.existsSync(dir)) {
74
+ fs.mkdirSync(dir, { recursive: true });
75
+ }
76
+ // Write atomically: temp file → rename
77
+ const tempPath = absolutePath + ".tmp";
78
+ fs.writeFileSync(tempPath, Buffer.from(data));
79
+ fs.renameSync(tempPath, absolutePath);
80
+ // Update manifest entry
81
+ const entry = {
82
+ id: cloudDoc.id,
83
+ name: cloudDoc.name,
84
+ fileName: cloudDoc.fileName,
85
+ localPath,
86
+ cloudUrl: cloudDoc.fileUrl,
87
+ storagePath: cloudDoc.storagePath,
88
+ mimeType: cloudDoc.mimeType,
89
+ fileSize: cloudDoc.fileSize,
90
+ cloudUpdatedAt: cloudDoc.updatedAt,
91
+ localUpdatedAt: new Date().toISOString(),
92
+ syncStatus: "synced",
93
+ folderId: cloudDoc.folderId,
94
+ folderPath: cloudDoc.folderPath || null,
95
+ };
96
+ // Update in-memory manifest
97
+ const idx = manifest.entries.findIndex((e) => e.id === cloudDoc.id);
98
+ if (idx >= 0) {
99
+ manifest.entries[idx] = entry;
100
+ }
101
+ else {
102
+ manifest.entries.push(entry);
103
+ }
104
+ result.downloaded++;
105
+ }
106
+ catch (error) {
107
+ result.errors.push({
108
+ path: localPath,
109
+ error: error instanceof Error ? error.message : "Download failed",
110
+ });
111
+ }
112
+ }
113
+ // 3. Check for deleted cloud documents (in manifest but not in cloud)
114
+ const cloudIds = new Set(cloudData.documents.map((d) => d.id));
115
+ for (const entry of [...manifest.entries]) {
116
+ if (!cloudIds.has(entry.id)) {
117
+ entry.syncStatus = "deleted_cloud";
118
+ // Optionally remove local file
119
+ const absolutePath = path.join(documentsPath, entry.localPath);
120
+ if (fs.existsSync(absolutePath) && !options.dryRun) {
121
+ try {
122
+ fs.unlinkSync(absolutePath);
123
+ result.deleted++;
124
+ }
125
+ catch {
126
+ // Leave file but mark in manifest
127
+ }
128
+ }
129
+ // Remove from manifest
130
+ manifest.entries = manifest.entries.filter((e) => e.id !== entry.id);
131
+ }
132
+ }
133
+ // 4. Save manifest
134
+ if (!options.dryRun) {
135
+ manifest.lastSyncAt = new Date().toISOString();
136
+ writeDocumentManifest(documentsPath, manifest);
137
+ }
138
+ return result;
139
+ }
140
+ function getFileMtime(filePath) {
141
+ try {
142
+ const stats = fs.statSync(filePath);
143
+ return stats.mtime.toISOString();
144
+ }
145
+ catch {
146
+ return null;
147
+ }
148
+ }
149
+ //# sourceMappingURL=document-pull.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-pull.js","sourceRoot":"","sources":["../../src/sync/document-pull.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { EpicContextClient } from "../api/client.js";
2
+ import type { DocumentSyncResult } from "../types/index.js";
3
+ export interface DocumentPushOptions {
4
+ /** Preview changes without uploading */
5
+ dryRun?: boolean;
6
+ /** Push only a specific file or folder path */
7
+ path?: string;
8
+ }
9
+ /**
10
+ * Push local documents to the cloud.
11
+ * Only uploads new or modified files (delta sync based on timestamps).
12
+ */
13
+ export declare function pushDocuments(client: EpicContextClient, documentsPath: string, options?: DocumentPushOptions): Promise<DocumentSyncResult>;
14
+ //# sourceMappingURL=document-push.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-push.d.ts","sourceRoot":"","sources":["../../src/sync/document-push.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAEV,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAY3B,MAAM,WAAW,mBAAmB;IAClC,wCAAwC;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,iBAAiB,EACzB,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAoH7B"}