@zoebuildsai/trace 1.5.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 (130) hide show
  1. package/.gitignore +115 -0
  2. package/.trace/progress.json +22 -0
  3. package/README.md +466 -0
  4. package/RELEASE-NOTES-1.5.0.md +410 -0
  5. package/STATUS.md +245 -0
  6. package/dist/auto-commit.d.ts +66 -0
  7. package/dist/auto-commit.d.ts.map +1 -0
  8. package/dist/auto-commit.js +180 -0
  9. package/dist/auto-commit.js.map +1 -0
  10. package/dist/cli.d.ts +7 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +246 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/commands.d.ts +46 -0
  15. package/dist/commands.d.ts.map +1 -0
  16. package/dist/commands.js +256 -0
  17. package/dist/commands.js.map +1 -0
  18. package/dist/diff.d.ts +23 -0
  19. package/dist/diff.d.ts.map +1 -0
  20. package/dist/diff.js +106 -0
  21. package/dist/diff.js.map +1 -0
  22. package/dist/github.d.ts.map +1 -0
  23. package/dist/github.js.map +1 -0
  24. package/dist/index-cache.d.ts +35 -0
  25. package/dist/index-cache.d.ts.map +1 -0
  26. package/dist/index-cache.js +114 -0
  27. package/dist/index-cache.js.map +1 -0
  28. package/dist/index.d.ts +15 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +25 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/storage.d.ts +45 -0
  33. package/dist/storage.d.ts.map +1 -0
  34. package/dist/storage.js +151 -0
  35. package/dist/storage.js.map +1 -0
  36. package/dist/sync.d.ts +60 -0
  37. package/dist/sync.js +184 -0
  38. package/dist/tags.d.ts +85 -0
  39. package/dist/tags.d.ts.map +1 -0
  40. package/dist/tags.js +219 -0
  41. package/dist/tags.js.map +1 -0
  42. package/dist/types.d.ts +102 -0
  43. package/dist/types.d.ts.map +1 -0
  44. package/dist/types.js +6 -0
  45. package/dist/types.js.map +1 -0
  46. package/docs/.nojekyll +0 -0
  47. package/docs/README.md +73 -0
  48. package/docs/_config.yml +2 -0
  49. package/docs/index.html +960 -0
  50. package/docs-website/package.json +20 -0
  51. package/jest.config.js +21 -0
  52. package/package.json +50 -0
  53. package/scripts/init.ts +290 -0
  54. package/src/agent-audit.ts +270 -0
  55. package/src/agent-checkout.ts +227 -0
  56. package/src/agent-coordination.ts +318 -0
  57. package/src/async-queue.ts +203 -0
  58. package/src/auto-branching.ts +279 -0
  59. package/src/auto-commit.ts +166 -0
  60. package/src/cherry-pick.ts +252 -0
  61. package/src/chunked-upload.ts +224 -0
  62. package/src/cli-v2.ts +335 -0
  63. package/src/cli.ts +318 -0
  64. package/src/cliff-detection.ts +232 -0
  65. package/src/commands.ts +267 -0
  66. package/src/commit-hash-system.ts +351 -0
  67. package/src/compression.ts +176 -0
  68. package/src/conflict-resolution-ui.ts +277 -0
  69. package/src/conflict-visualization.ts +238 -0
  70. package/src/diff-formatter.ts +184 -0
  71. package/src/diff.ts +124 -0
  72. package/src/distributed-coordination.ts +273 -0
  73. package/src/git-interop.ts +316 -0
  74. package/src/index-cache.ts +88 -0
  75. package/src/index.ts +38 -0
  76. package/src/merge-engine.ts +143 -0
  77. package/src/message-search.ts +370 -0
  78. package/src/performance-monitoring.ts +236 -0
  79. package/src/rebase.ts +327 -0
  80. package/src/rollback.ts +215 -0
  81. package/src/semantic-grouping.ts +245 -0
  82. package/src/stage-area.ts +324 -0
  83. package/src/stash.ts +278 -0
  84. package/src/storage.ts +131 -0
  85. package/src/sync.ts +205 -0
  86. package/src/tags.ts +244 -0
  87. package/src/types.ts +119 -0
  88. package/src/webhooks.ts +119 -0
  89. package/src/workspace-isolation.ts +298 -0
  90. package/tests/auto-commit.test.ts +308 -0
  91. package/tests/checkout.test.ts +136 -0
  92. package/tests/commit.test.ts +118 -0
  93. package/tests/diff.test.ts +191 -0
  94. package/tests/github.test.ts +94 -0
  95. package/tests/integration.test.ts +267 -0
  96. package/tests/log.test.ts +125 -0
  97. package/tests/phase2-integration.test.ts +370 -0
  98. package/tests/storage.test.ts +167 -0
  99. package/tests/tags.test.ts +477 -0
  100. package/tests/types.test.ts +75 -0
  101. package/tests/v1.1/agent-audit.test.ts +472 -0
  102. package/tests/v1.1/agent-coordination.test.ts +308 -0
  103. package/tests/v1.1/async-queue.test.ts +253 -0
  104. package/tests/v1.1/comprehensive.test.ts +521 -0
  105. package/tests/v1.1/diff-formatter.test.ts +238 -0
  106. package/tests/v1.1/integration.test.ts +389 -0
  107. package/tests/v1.1/onboarding.test.ts +365 -0
  108. package/tests/v1.1/rollback.test.ts +370 -0
  109. package/tests/v1.1/semantic-grouping.test.ts +230 -0
  110. package/tests/v1.2/chunked-upload.test.ts +301 -0
  111. package/tests/v1.2/cliff-detection.test.ts +272 -0
  112. package/tests/v1.2/commit-hash-system.test.ts +288 -0
  113. package/tests/v1.2/compression.test.ts +220 -0
  114. package/tests/v1.2/conflict-visualization.test.ts +263 -0
  115. package/tests/v1.2/distributed.test.ts +261 -0
  116. package/tests/v1.2/performance-monitoring.test.ts +328 -0
  117. package/tests/v1.3/auto-branching.test.ts +270 -0
  118. package/tests/v1.3/message-search.test.ts +264 -0
  119. package/tests/v1.3/stage-area.test.ts +330 -0
  120. package/tests/v1.3/stash-rebase-cherry-pick.test.ts +361 -0
  121. package/tests/v1.4/cli.test.ts +171 -0
  122. package/tests/v1.4/conflict-resolution-advanced.test.ts +429 -0
  123. package/tests/v1.4/conflict-resolution-ui.test.ts +286 -0
  124. package/tests/v1.4/workspace-isolation-advanced.test.ts +382 -0
  125. package/tests/v1.4/workspace-isolation.test.ts +268 -0
  126. package/tests/v1.5/agent-coordination.real.test.ts +401 -0
  127. package/tests/v1.5/cli-v2.test.ts +354 -0
  128. package/tests/v1.5/git-interop.real.test.ts +358 -0
  129. package/tests/v1.5/integration-testing.real.test.ts +440 -0
  130. package/tsconfig.json +26 -0
@@ -0,0 +1,354 @@
1
+ /**
2
+ * Trace CLI v2 Tests
3
+ * Pure Trace commands (no git references)
4
+ * All operations via "trace" command
5
+ */
6
+
7
+ import { TraceCliv2 } from '../../src/cli-v2';
8
+
9
+ describe('TraceCliv2 - Pure Trace CLI', () => {
10
+ let cli: TraceCliv2;
11
+
12
+ beforeEach(() => {
13
+ cli = new TraceCliv2();
14
+ });
15
+
16
+ describe('Command Validation', () => {
17
+ test('requires "trace" prefix', async () => {
18
+ const result = await cli.execute('commit -m "test"');
19
+ expect(result.success).toBe(false);
20
+ expect(result.message).toContain('trace');
21
+ });
22
+
23
+ test('rejects unknown commands', async () => {
24
+ const result = await cli.execute('trace unknown-cmd');
25
+ expect(result.success).toBe(false);
26
+ expect(result.message).toContain('unknown command');
27
+ });
28
+
29
+ test('provides help for missing command', async () => {
30
+ const result = await cli.execute('trace');
31
+ expect(result.success).toBe(false);
32
+ expect(result.message).toContain('command required');
33
+ });
34
+ });
35
+
36
+ describe('Core VCS Commands', () => {
37
+ test('trace init creates repository', async () => {
38
+ const result = await cli.execute('trace init /tmp/test-repo');
39
+ expect(result.success).toBe(true);
40
+ expect(result.message).toContain('Trace repository');
41
+ });
42
+
43
+ test('trace commit requires message', async () => {
44
+ const result = await cli.execute('trace commit');
45
+ expect(result.success).toBe(false);
46
+ expect(result.message).toContain('-m');
47
+ });
48
+
49
+ test('trace commit creates commit with message', async () => {
50
+ const result = await cli.execute('trace commit -m "initial commit"');
51
+ expect(result.success).toBe(true);
52
+ expect(result.message).toContain('Commit created');
53
+ });
54
+
55
+ test('trace log displays history', async () => {
56
+ const result = await cli.execute('trace log');
57
+ expect(result.success).toBe(true);
58
+ expect(result.message).toContain('Log');
59
+ });
60
+
61
+ test('trace push sends to remote', async () => {
62
+ const result = await cli.execute('trace push origin main');
63
+ expect(result.success).toBe(true);
64
+ expect(result.message).toContain('origin/main');
65
+ });
66
+
67
+ test('trace pull receives from remote', async () => {
68
+ const result = await cli.execute('trace pull origin main');
69
+ expect(result.success).toBe(true);
70
+ expect(result.message).toContain('origin/main');
71
+ });
72
+
73
+ test('trace push defaults to origin/main', async () => {
74
+ const result = await cli.execute('trace push');
75
+ expect(result.success).toBe(true);
76
+ expect(result.message).toContain('origin');
77
+ });
78
+ });
79
+
80
+ describe('Multi-Agent Commands', () => {
81
+ test('trace lock requires file', async () => {
82
+ const result = await cli.execute('trace lock');
83
+ expect(result.success).toBe(false);
84
+ expect(result.message).toContain('file');
85
+ });
86
+
87
+ test('trace lock acquires exclusive access', async () => {
88
+ const result = await cli.execute('trace lock src/main.ts');
89
+ expect(result.success).toBe(true);
90
+ expect(result.message).toContain('Locked');
91
+ });
92
+
93
+ test('trace unlock releases file', async () => {
94
+ const result = await cli.execute('trace unlock src/main.ts');
95
+ expect(result.success).toBe(true);
96
+ expect(result.message).toContain('Unlocked');
97
+ });
98
+
99
+ test('trace status shows repository state', async () => {
100
+ const result = await cli.execute('trace status');
101
+ expect(result.success).toBe(true);
102
+ });
103
+ });
104
+
105
+ describe('Advanced Commands', () => {
106
+ test('trace merge requires branch', async () => {
107
+ const result = await cli.execute('trace merge');
108
+ expect(result.success).toBe(false);
109
+ expect(result.message).toContain('branch');
110
+ });
111
+
112
+ test('trace merge accepts branch name', async () => {
113
+ const result = await cli.execute('trace merge feature-branch');
114
+ expect(result.success).toBe(true);
115
+ expect(result.message).toContain('Merged');
116
+ });
117
+
118
+ test('trace merge accepts merge strategy', async () => {
119
+ const result = await cli.execute('trace merge feature --strategy ours');
120
+ expect(result.success).toBe(true);
121
+ expect(result.message).toContain('ours');
122
+ });
123
+
124
+ test('trace branch lists branches', async () => {
125
+ const result = await cli.execute('trace branch list');
126
+ expect(result.success).toBe(true);
127
+ });
128
+
129
+ test('trace rebase requires target', async () => {
130
+ const result = await cli.execute('trace rebase');
131
+ expect(result.success).toBe(false);
132
+ expect(result.message).toContain('target');
133
+ });
134
+
135
+ test('trace rebase rebases onto branch', async () => {
136
+ const result = await cli.execute('trace rebase main');
137
+ expect(result.success).toBe(true);
138
+ expect(result.message).toContain('Rebase');
139
+ });
140
+
141
+ test('trace stash saves changes', async () => {
142
+ const result = await cli.execute('trace stash save');
143
+ expect(result.success).toBe(true);
144
+ });
145
+
146
+ test('trace cherry-pick requires commits', async () => {
147
+ const result = await cli.execute('trace cherry-pick');
148
+ expect(result.success).toBe(false);
149
+ expect(result.message).toContain('commit');
150
+ });
151
+
152
+ test('trace cherry-pick accepts commit hashes', async () => {
153
+ const result = await cli.execute('trace cherry-pick abc123 def456');
154
+ expect(result.success).toBe(true);
155
+ expect(result.message).toContain('2 commit');
156
+ });
157
+ });
158
+
159
+ describe('Coordination Commands', () => {
160
+ test('trace task manages agent tasks', async () => {
161
+ const result = await cli.execute('trace task register --agent agent-a --files src/main.ts');
162
+ expect(result.success).toBe(true);
163
+ });
164
+
165
+ test('trace collision-detect finds conflicts', async () => {
166
+ const result = await cli.execute('trace collision-detect --file src/main.ts');
167
+ expect(result.success).toBe(true);
168
+ expect(result.message.toLowerCase()).toContain('collision');
169
+ });
170
+
171
+ test('trace audit shows security trail', async () => {
172
+ const result = await cli.execute('trace audit --agent agent-a');
173
+ expect(result.success).toBe(true);
174
+ expect(result.message).toContain('Audit');
175
+ });
176
+
177
+ test('trace validate checks files', async () => {
178
+ const result = await cli.execute('trace validate --secure');
179
+ expect(result.success).toBe(true);
180
+ expect(result.message).toContain('Validation');
181
+ });
182
+ });
183
+
184
+ describe('Conflict Resolution Commands', () => {
185
+ test('trace resolve requires file', async () => {
186
+ const result = await cli.execute('trace resolve');
187
+ expect(result.success).toBe(false);
188
+ expect(result.message).toContain('file');
189
+ });
190
+
191
+ test('trace resolve opens conflict resolver', async () => {
192
+ const result = await cli.execute('trace resolve src/main.ts');
193
+ expect(result.success).toBe(true);
194
+ expect(result.message).toContain('Resolving');
195
+ });
196
+
197
+ test('trace resolve accepts merge strategy', async () => {
198
+ const result = await cli.execute('trace resolve src/main.ts --strategy ours');
199
+ expect(result.success).toBe(true);
200
+ });
201
+ });
202
+
203
+ describe('Help System', () => {
204
+ test('trace help shows all commands', async () => {
205
+ const result = await cli.execute('trace help');
206
+ expect(result.success).toBe(true);
207
+ expect(result.message).toContain('Available Commands');
208
+ expect(result.message).toContain('Core VCS');
209
+ expect(result.message).toContain('Multi-Agent');
210
+ });
211
+
212
+ test('trace help displays command categories', async () => {
213
+ const result = await cli.execute('trace help');
214
+ expect(result.success).toBe(true);
215
+ expect(result.message).toContain('Advanced');
216
+ expect(result.message).toContain('Coordination');
217
+ });
218
+
219
+ test('trace help <command> shows details', async () => {
220
+ const result = await cli.execute('trace help commit');
221
+ expect(result.success).toBe(true);
222
+ expect(result.message).toContain('commit');
223
+ expect(result.message).toContain('Usage');
224
+ });
225
+
226
+ test('help for unknown command fails gracefully', async () => {
227
+ const result = await cli.execute('trace help unknown');
228
+ expect(result.success).toBe(false);
229
+ expect(result.message).toContain('Unknown');
230
+ });
231
+ });
232
+
233
+ describe('Command Availability', () => {
234
+ test('all commands are registered', () => {
235
+ const commands = cli.getCommands();
236
+ expect(commands).toContain('init');
237
+ expect(commands).toContain('commit');
238
+ expect(commands).toContain('log');
239
+ expect(commands).toContain('push');
240
+ expect(commands).toContain('pull');
241
+ expect(commands).toContain('lock');
242
+ expect(commands).toContain('unlock');
243
+ expect(commands).toContain('merge');
244
+ expect(commands).toContain('branch');
245
+ expect(commands).toContain('rebase');
246
+ expect(commands).toContain('stash');
247
+ expect(commands).toContain('cherry-pick');
248
+ expect(commands).toContain('task');
249
+ expect(commands).toContain('collision-detect');
250
+ expect(commands).toContain('audit');
251
+ expect(commands).toContain('validate');
252
+ expect(commands).toContain('resolve');
253
+ });
254
+
255
+ test('command count matches expected', () => {
256
+ const commands = cli.getCommands();
257
+ expect(commands.length).toBeGreaterThanOrEqual(15);
258
+ });
259
+ });
260
+
261
+ describe('Real Usage Scenarios', () => {
262
+ test('agent workflow: init → lock → commit → unlock', async () => {
263
+ let result = await cli.execute('trace init');
264
+ expect(result.success).toBe(true);
265
+
266
+ result = await cli.execute('trace lock src/main.ts');
267
+ expect(result.success).toBe(true);
268
+
269
+ result = await cli.execute('trace commit -m "feature: add function"');
270
+ expect(result.success).toBe(true);
271
+
272
+ result = await cli.execute('trace unlock src/main.ts');
273
+ expect(result.success).toBe(true);
274
+ });
275
+
276
+ test('conflict resolution workflow', async () => {
277
+ let result = await cli.execute('trace resolve src/conflict.ts --strategy manual');
278
+ expect(result.success).toBe(true);
279
+
280
+ result = await cli.execute('trace commit -m "fix: resolved conflict"');
281
+ expect(result.success).toBe(true);
282
+
283
+ result = await cli.execute('trace push origin main');
284
+ expect(result.success).toBe(true);
285
+ });
286
+
287
+ test('parallel agent workflow', async () => {
288
+ // Agent A
289
+ let result = await cli.execute('trace lock src/api.ts');
290
+ expect(result.success).toBe(true);
291
+
292
+ // Agent B (would wait for A to unlock)
293
+ result = await cli.execute('trace lock src/utils.ts');
294
+ expect(result.success).toBe(true);
295
+
296
+ // Both commit
297
+ result = await cli.execute('trace commit -m "agent-a: api changes"');
298
+ expect(result.success).toBe(true);
299
+
300
+ result = await cli.execute('trace commit -m "agent-b: utils changes"');
301
+ expect(result.success).toBe(true);
302
+ });
303
+
304
+ test('merge workflow', async () => {
305
+ let result = await cli.execute('trace branch create feature');
306
+ expect(result.success).toBe(true);
307
+
308
+ result = await cli.execute('trace commit -m "feature work"');
309
+ expect(result.success).toBe(true);
310
+
311
+ result = await cli.execute('trace merge main --strategy auto');
312
+ expect(result.success).toBe(true);
313
+ });
314
+
315
+ test('advanced rebase workflow', async () => {
316
+ let result = await cli.execute('trace rebase main --interactive');
317
+ expect(result.success).toBe(true);
318
+
319
+ result = await cli.execute('trace cherry-pick abc123 def456');
320
+ expect(result.success).toBe(true);
321
+
322
+ result = await cli.execute('trace push origin main');
323
+ expect(result.success).toBe(true);
324
+ });
325
+ });
326
+
327
+ describe('Error Handling', () => {
328
+ test('gracefully handles invalid syntax', async () => {
329
+ const result = await cli.execute('trace commit -m');
330
+ // Either fails or handles missing argument
331
+ expect(result).toHaveProperty('success');
332
+ expect(result).toHaveProperty('message');
333
+ });
334
+
335
+ test('provides clear error messages', async () => {
336
+ const result = await cli.execute('trace invalid-command arg1 arg2');
337
+ expect(result.success).toBe(false);
338
+ expect(result.message).toBeTruthy();
339
+ expect(result.message.length).toBeGreaterThan(0);
340
+ });
341
+ });
342
+
343
+ describe('Command Case Sensitivity', () => {
344
+ test('commands are case-sensitive (lowercase)', async () => {
345
+ const result = await cli.execute('trace commit -m "test"');
346
+ expect(result.success).toBe(true);
347
+ });
348
+
349
+ test('uppercase commands should fail', async () => {
350
+ const result = await cli.execute('trace COMMIT -m "test"');
351
+ expect(result.success).toBe(false);
352
+ });
353
+ });
354
+ });