gsd-agent 1.0.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 (155) hide show
  1. package/README.md +221 -0
  2. package/bin/cli.js +313 -0
  3. package/dist/auth-flow.d.ts +50 -0
  4. package/dist/auth-flow.d.ts.map +1 -0
  5. package/dist/auth-flow.js +233 -0
  6. package/dist/auth-flow.js.map +1 -0
  7. package/dist/auth.d.ts +42 -0
  8. package/dist/auth.d.ts.map +1 -0
  9. package/dist/auth.js +117 -0
  10. package/dist/auth.js.map +1 -0
  11. package/dist/command-executor.d.ts +44 -0
  12. package/dist/command-executor.d.ts.map +1 -0
  13. package/dist/command-executor.js +193 -0
  14. package/dist/command-executor.js.map +1 -0
  15. package/dist/command-executor.test.d.ts +8 -0
  16. package/dist/command-executor.test.d.ts.map +1 -0
  17. package/dist/command-executor.test.js +87 -0
  18. package/dist/command-executor.test.js.map +1 -0
  19. package/dist/command-queue.d.ts +44 -0
  20. package/dist/command-queue.d.ts.map +1 -0
  21. package/dist/command-queue.js +184 -0
  22. package/dist/command-queue.js.map +1 -0
  23. package/dist/command-queue.test.d.ts +7 -0
  24. package/dist/command-queue.test.d.ts.map +1 -0
  25. package/dist/command-queue.test.js +220 -0
  26. package/dist/command-queue.test.js.map +1 -0
  27. package/dist/config.d.ts +25 -0
  28. package/dist/config.d.ts.map +1 -0
  29. package/dist/config.js +103 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/conflict-resolver.d.ts +43 -0
  32. package/dist/conflict-resolver.d.ts.map +1 -0
  33. package/dist/conflict-resolver.js +91 -0
  34. package/dist/conflict-resolver.js.map +1 -0
  35. package/dist/conflict-resolver.test.d.ts +7 -0
  36. package/dist/conflict-resolver.test.d.ts.map +1 -0
  37. package/dist/conflict-resolver.test.js +123 -0
  38. package/dist/conflict-resolver.test.js.map +1 -0
  39. package/dist/discovery.d.ts +59 -0
  40. package/dist/discovery.d.ts.map +1 -0
  41. package/dist/discovery.js +180 -0
  42. package/dist/discovery.js.map +1 -0
  43. package/dist/discovery.test.d.ts +8 -0
  44. package/dist/discovery.test.d.ts.map +1 -0
  45. package/dist/discovery.test.js +132 -0
  46. package/dist/discovery.test.js.map +1 -0
  47. package/dist/hash.d.ts +20 -0
  48. package/dist/hash.d.ts.map +1 -0
  49. package/dist/hash.js +35 -0
  50. package/dist/hash.js.map +1 -0
  51. package/dist/hash.test.d.ts +7 -0
  52. package/dist/hash.test.d.ts.map +1 -0
  53. package/dist/hash.test.js +58 -0
  54. package/dist/hash.test.js.map +1 -0
  55. package/dist/index.d.ts +11 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +202 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/integration.test.d.ts +8 -0
  60. package/dist/integration.test.d.ts.map +1 -0
  61. package/dist/integration.test.js +37 -0
  62. package/dist/integration.test.js.map +1 -0
  63. package/dist/logger.d.ts +68 -0
  64. package/dist/logger.d.ts.map +1 -0
  65. package/dist/logger.js +159 -0
  66. package/dist/logger.js.map +1 -0
  67. package/dist/output-streamer.d.ts +27 -0
  68. package/dist/output-streamer.d.ts.map +1 -0
  69. package/dist/output-streamer.js +71 -0
  70. package/dist/output-streamer.js.map +1 -0
  71. package/dist/output-streamer.test.d.ts +7 -0
  72. package/dist/output-streamer.test.d.ts.map +1 -0
  73. package/dist/output-streamer.test.js +90 -0
  74. package/dist/output-streamer.test.js.map +1 -0
  75. package/dist/realtime-subscriber.d.ts +63 -0
  76. package/dist/realtime-subscriber.d.ts.map +1 -0
  77. package/dist/realtime-subscriber.js +201 -0
  78. package/dist/realtime-subscriber.js.map +1 -0
  79. package/dist/realtime-subscriber.test.d.ts +7 -0
  80. package/dist/realtime-subscriber.test.d.ts.map +1 -0
  81. package/dist/realtime-subscriber.test.js +183 -0
  82. package/dist/realtime-subscriber.test.js.map +1 -0
  83. package/dist/reconnection-manager.d.ts +88 -0
  84. package/dist/reconnection-manager.d.ts.map +1 -0
  85. package/dist/reconnection-manager.js +229 -0
  86. package/dist/reconnection-manager.js.map +1 -0
  87. package/dist/reconnection-manager.test.d.ts +8 -0
  88. package/dist/reconnection-manager.test.d.ts.map +1 -0
  89. package/dist/reconnection-manager.test.js +151 -0
  90. package/dist/reconnection-manager.test.js.map +1 -0
  91. package/dist/remote-sync-handler.d.ts +61 -0
  92. package/dist/remote-sync-handler.d.ts.map +1 -0
  93. package/dist/remote-sync-handler.js +197 -0
  94. package/dist/remote-sync-handler.js.map +1 -0
  95. package/dist/remote-sync-handler.test.d.ts +7 -0
  96. package/dist/remote-sync-handler.test.d.ts.map +1 -0
  97. package/dist/remote-sync-handler.test.js +212 -0
  98. package/dist/remote-sync-handler.test.js.map +1 -0
  99. package/dist/retry.d.ts +35 -0
  100. package/dist/retry.d.ts.map +1 -0
  101. package/dist/retry.js +63 -0
  102. package/dist/retry.js.map +1 -0
  103. package/dist/retry.test.d.ts +5 -0
  104. package/dist/retry.test.d.ts.map +1 -0
  105. package/dist/retry.test.js +84 -0
  106. package/dist/retry.test.js.map +1 -0
  107. package/dist/storage-client.d.ts +69 -0
  108. package/dist/storage-client.d.ts.map +1 -0
  109. package/dist/storage-client.js +168 -0
  110. package/dist/storage-client.js.map +1 -0
  111. package/dist/storage-client.test.d.ts +7 -0
  112. package/dist/storage-client.test.d.ts.map +1 -0
  113. package/dist/storage-client.test.js +126 -0
  114. package/dist/storage-client.test.js.map +1 -0
  115. package/dist/supabase.d.ts +82 -0
  116. package/dist/supabase.d.ts.map +1 -0
  117. package/dist/supabase.js +341 -0
  118. package/dist/supabase.js.map +1 -0
  119. package/dist/supabase.test.d.ts +7 -0
  120. package/dist/supabase.test.d.ts.map +1 -0
  121. package/dist/supabase.test.js +273 -0
  122. package/dist/supabase.test.js.map +1 -0
  123. package/dist/sync-engine.d.ts +84 -0
  124. package/dist/sync-engine.d.ts.map +1 -0
  125. package/dist/sync-engine.js +251 -0
  126. package/dist/sync-engine.js.map +1 -0
  127. package/dist/sync-engine.test.d.ts +7 -0
  128. package/dist/sync-engine.test.d.ts.map +1 -0
  129. package/dist/sync-engine.test.js +241 -0
  130. package/dist/sync-engine.test.js.map +1 -0
  131. package/dist/sync-state.d.ts +82 -0
  132. package/dist/sync-state.d.ts.map +1 -0
  133. package/dist/sync-state.js +145 -0
  134. package/dist/sync-state.js.map +1 -0
  135. package/dist/sync-state.test.d.ts +7 -0
  136. package/dist/sync-state.test.d.ts.map +1 -0
  137. package/dist/sync-state.test.js +129 -0
  138. package/dist/sync-state.test.js.map +1 -0
  139. package/dist/types.d.ts +148 -0
  140. package/dist/types.d.ts.map +1 -0
  141. package/dist/types.js +8 -0
  142. package/dist/types.js.map +1 -0
  143. package/dist/types.test.d.ts +7 -0
  144. package/dist/types.test.d.ts.map +1 -0
  145. package/dist/types.test.js +73 -0
  146. package/dist/types.test.js.map +1 -0
  147. package/dist/watcher.d.ts +55 -0
  148. package/dist/watcher.d.ts.map +1 -0
  149. package/dist/watcher.js +214 -0
  150. package/dist/watcher.js.map +1 -0
  151. package/dist/watcher.test.d.ts +8 -0
  152. package/dist/watcher.test.d.ts.map +1 -0
  153. package/dist/watcher.test.js +164 -0
  154. package/dist/watcher.test.js.map +1 -0
  155. package/package.json +58 -0
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Tests for filesystem watcher
3
+ *
4
+ * Verifies that the watcher detects file changes, debounces events,
5
+ * handles atomic writes, and ignores excluded patterns.
6
+ */
7
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
8
+ import fs from 'fs';
9
+ import path from 'path';
10
+ import os from 'os';
11
+ import { FileWatcher } from './watcher.js';
12
+ import { Logger } from './logger.js';
13
+ describe('FileWatcher', () => {
14
+ let tempDir;
15
+ let config;
16
+ let logger;
17
+ let workspaces;
18
+ beforeEach(() => {
19
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-watcher-test-'));
20
+ config = {
21
+ supabase_url: '',
22
+ supabase_key: '',
23
+ watch_dirs: [tempDir],
24
+ ignored_patterns: ['node_modules/', '.git/', 'dist/', 'build/'],
25
+ debounce_ms: 100, // Shorter for tests
26
+ batch_size: 50,
27
+ log_level: 'ERROR',
28
+ log_file: path.join(tempDir, 'test.log'),
29
+ log_rotation_days: 7
30
+ };
31
+ logger = new Logger(config);
32
+ // Create test workspace
33
+ const workspaceRoot = path.join(tempDir, 'test-workspace');
34
+ const planningDir = path.join(workspaceRoot, '.planning');
35
+ fs.mkdirSync(planningDir, { recursive: true });
36
+ workspaces = [{
37
+ id: 'test-workspace-id',
38
+ root_path: workspaceRoot,
39
+ name: 'Test Workspace',
40
+ status: 'active',
41
+ last_sync: new Date().toISOString(),
42
+ discovered_at: new Date().toISOString()
43
+ }];
44
+ });
45
+ afterEach(() => {
46
+ if (fs.existsSync(tempDir)) {
47
+ fs.rmSync(tempDir, { recursive: true, force: true });
48
+ }
49
+ });
50
+ it('should emit change event when file is modified', async () => {
51
+ const watcher = new FileWatcher(workspaces, config, logger);
52
+ const events = [];
53
+ watcher.on('change', (event) => {
54
+ events.push(event);
55
+ });
56
+ watcher.start();
57
+ // Create a file in the watched directory
58
+ const testFile = path.join(workspaces[0].root_path, '.planning', 'TEST.md');
59
+ fs.writeFileSync(testFile, 'initial content');
60
+ // Wait for debounce + processing
61
+ await new Promise(resolve => setTimeout(resolve, 500));
62
+ watcher.stop();
63
+ expect(events.length).toBeGreaterThan(0);
64
+ const event = events.find(e => e.file_path.includes('TEST.md'));
65
+ expect(event).toBeDefined();
66
+ expect(event?.event_type).toBe('add');
67
+ expect(event?.workspace_id).toBe('test-workspace-id');
68
+ expect(event?.content_hash).toBeTruthy();
69
+ expect(event?.content).toBe('initial content');
70
+ });
71
+ it('should debounce rapid changes to same file', async () => {
72
+ const watcher = new FileWatcher(workspaces, config, logger);
73
+ const events = [];
74
+ watcher.on('change', (event) => {
75
+ events.push(event);
76
+ });
77
+ watcher.start();
78
+ const testFile = path.join(workspaces[0].root_path, '.planning', 'RAPID.md');
79
+ // Write multiple times rapidly
80
+ fs.writeFileSync(testFile, 'version 1');
81
+ await new Promise(resolve => setTimeout(resolve, 20));
82
+ fs.writeFileSync(testFile, 'version 2');
83
+ await new Promise(resolve => setTimeout(resolve, 20));
84
+ fs.writeFileSync(testFile, 'version 3');
85
+ await new Promise(resolve => setTimeout(resolve, 20));
86
+ fs.writeFileSync(testFile, 'version 4');
87
+ await new Promise(resolve => setTimeout(resolve, 20));
88
+ fs.writeFileSync(testFile, 'version 5');
89
+ // Wait for debounce + processing
90
+ await new Promise(resolve => setTimeout(resolve, 500));
91
+ watcher.stop();
92
+ // Should have debounced to fewer events (ideally 1, but may be 2-3 due to timing)
93
+ const rapidEvents = events.filter(e => e.file_path.includes('RAPID.md'));
94
+ expect(rapidEvents.length).toBeLessThan(5);
95
+ expect(rapidEvents.length).toBeGreaterThan(0);
96
+ // Last event should have final content
97
+ const lastEvent = rapidEvents[rapidEvents.length - 1];
98
+ expect(lastEvent.content).toBe('version 5');
99
+ });
100
+ it('should ignore files in node_modules', async () => {
101
+ const watcher = new FileWatcher(workspaces, config, logger);
102
+ const events = [];
103
+ watcher.on('change', (event) => {
104
+ events.push(event);
105
+ });
106
+ watcher.start();
107
+ // Create file in node_modules (should be ignored)
108
+ const nodeModulesDir = path.join(workspaces[0].root_path, '.planning', 'node_modules');
109
+ fs.mkdirSync(nodeModulesDir, { recursive: true });
110
+ const ignoredFile = path.join(nodeModulesDir, 'ignored.md');
111
+ fs.writeFileSync(ignoredFile, 'should not be watched');
112
+ // Create file in normal location (should be watched)
113
+ const normalFile = path.join(workspaces[0].root_path, '.planning', 'NORMAL.md');
114
+ fs.writeFileSync(normalFile, 'should be watched');
115
+ // Wait for debounce + processing
116
+ await new Promise(resolve => setTimeout(resolve, 500));
117
+ watcher.stop();
118
+ // Should only have event for normal file
119
+ const ignoredEvents = events.filter(e => e.file_path.includes('node_modules'));
120
+ const normalEvents = events.filter(e => e.file_path.includes('NORMAL.md'));
121
+ expect(ignoredEvents.length).toBe(0);
122
+ expect(normalEvents.length).toBeGreaterThan(0);
123
+ });
124
+ it('should compute content hash for each change', async () => {
125
+ const watcher = new FileWatcher(workspaces, config, logger);
126
+ const events = [];
127
+ watcher.on('change', (event) => {
128
+ events.push(event);
129
+ });
130
+ watcher.start();
131
+ const testFile = path.join(workspaces[0].root_path, '.planning', 'HASH.md');
132
+ fs.writeFileSync(testFile, 'test content');
133
+ // Wait for debounce + processing
134
+ await new Promise(resolve => setTimeout(resolve, 500));
135
+ watcher.stop();
136
+ const event = events.find(e => e.file_path.includes('HASH.md'));
137
+ expect(event).toBeDefined();
138
+ expect(event?.content_hash).toBeTruthy();
139
+ expect(event?.content_hash).toHaveLength(64); // SHA-256 hex length
140
+ });
141
+ it('should handle file deletion events', async () => {
142
+ const watcher = new FileWatcher(workspaces, config, logger);
143
+ const events = [];
144
+ watcher.on('change', (event) => {
145
+ events.push(event);
146
+ });
147
+ // Create file before starting watcher
148
+ const testFile = path.join(workspaces[0].root_path, '.planning', 'DELETE.md');
149
+ fs.writeFileSync(testFile, 'will be deleted');
150
+ watcher.start();
151
+ // Wait a bit for initial scan
152
+ await new Promise(resolve => setTimeout(resolve, 200));
153
+ // Delete the file
154
+ fs.unlinkSync(testFile);
155
+ // Wait for event processing
156
+ await new Promise(resolve => setTimeout(resolve, 500));
157
+ watcher.stop();
158
+ const deleteEvent = events.find(e => e.file_path.includes('DELETE.md') && e.event_type === 'unlink');
159
+ expect(deleteEvent).toBeDefined();
160
+ expect(deleteEvent?.content_hash).toBe('');
161
+ expect(deleteEvent?.content).toBeUndefined();
162
+ });
163
+ });
164
+ //# sourceMappingURL=watcher.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.test.js","sourceRoot":"","sources":["../src/watcher.test.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "gsd-agent",
3
+ "version": "1.0.0",
4
+ "description": "Local filesystem sync daemon for GSD projects - Connect your local .planning/ directories to the GSD cloud",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "gsd-agent": "./bin/cli.js"
9
+ },
10
+ "files": [
11
+ "dist/",
12
+ "bin/"
13
+ ],
14
+ "engines": {
15
+ "node": ">=20.19.0"
16
+ },
17
+ "scripts": {
18
+ "dev": "tsx watch src/index.ts",
19
+ "build": "tsc",
20
+ "test": "vitest",
21
+ "test:watch": "vitest --watch",
22
+ "start": "node dist/index.js",
23
+ "lint": "tsc --noEmit",
24
+ "prepare": "npm run build",
25
+ "prepublishOnly": "npm run build"
26
+ },
27
+ "keywords": [
28
+ "gsd",
29
+ "get-shit-done",
30
+ "sync",
31
+ "daemon",
32
+ "filesystem",
33
+ "development",
34
+ "productivity",
35
+ "project-management",
36
+ "real-time"
37
+ ],
38
+ "author": "GSD Team",
39
+ "license": "MIT",
40
+ "repository": {
41
+ "type": "git",
42
+ "url": "https://github.com/gsdwebui/gsd-agent.git"
43
+ },
44
+ "homepage": "https://gsd.fahad.ink",
45
+ "bugs": {
46
+ "url": "https://github.com/gsdwebui/gsd-agent/issues"
47
+ },
48
+ "dependencies": {
49
+ "chokidar": "5.0.0",
50
+ "@supabase/supabase-js": "2.100.1"
51
+ },
52
+ "devDependencies": {
53
+ "typescript": "6.0.2",
54
+ "@types/node": "25.5.0",
55
+ "vitest": "4.1.2",
56
+ "tsx": "4.19.2"
57
+ }
58
+ }