ultraclaude-agent 0.0.24 → 0.0.25
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.
- package/__tests__/project-watcher.test.ts +199 -0
- package/__tests__/usage-sync-watcher.test.ts +259 -0
- package/dist/usage-sync.d.ts.map +1 -1
- package/dist/usage-sync.js +20 -5
- package/dist/usage-sync.js.map +1 -1
- package/dist/watcher.d.ts.map +1 -1
- package/dist/watcher.js +30 -9
- package/dist/watcher.js.map +1 -1
- package/node_modules/@ultra-claude/shared/dist/api/schemas/sync.d.ts +5 -0
- package/node_modules/@ultra-claude/shared/dist/api/schemas/sync.d.ts.map +1 -1
- package/node_modules/@ultra-claude/shared/dist/api/schemas/sync.js +5 -0
- package/node_modules/@ultra-claude/shared/dist/api/schemas/sync.js.map +1 -1
- package/node_modules/@ultra-claude/shared/dist/api/schemas/usage.d.ts +1 -0
- package/node_modules/@ultra-claude/shared/dist/api/schemas/usage.d.ts.map +1 -1
- package/node_modules/@ultra-claude/shared/dist/index.d.ts +1 -1
- package/node_modules/@ultra-claude/shared/dist/index.d.ts.map +1 -1
- package/node_modules/@ultra-claude/shared/dist/index.js +1 -1
- package/node_modules/@ultra-claude/shared/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/usage-sync.ts +21 -5
- package/src/watcher.ts +28 -9
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
// Integration test — real chokidar against tmp project dir. Regression
|
|
2
|
+
// guard for the project watcher's parent-directory watch pattern on
|
|
3
|
+
// .git/HEAD and .claude/ultra/version.json.
|
|
4
|
+
//
|
|
5
|
+
// Per the Lead amendment (shared/lead.md § Amendments 2026-04-12):
|
|
6
|
+
// these tests are regression guards, not failing-first reproductions.
|
|
7
|
+
// chokidar 5.x on Linux auto-re-registers inodes in `_handleFile`, so a
|
|
8
|
+
// simple multi-rename scenario passes against both unfixed and fixed code.
|
|
9
|
+
// The tests exist to ensure the parent-dir + basename-filter pattern
|
|
10
|
+
// correctly fires on atomic tmp+mv across multiple renames — verifying
|
|
11
|
+
// the fix doesn't introduce a new breakage.
|
|
12
|
+
|
|
13
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
14
|
+
import { mkdtemp, writeFile, rename, mkdir, rm } from 'node:fs/promises';
|
|
15
|
+
import { tmpdir } from 'node:os';
|
|
16
|
+
import { join } from 'node:path';
|
|
17
|
+
|
|
18
|
+
// --- Mock ./sync.js — observable surface for the handlers ---
|
|
19
|
+
|
|
20
|
+
const mockInitialSync = vi.fn();
|
|
21
|
+
const mockPushVersionMetadata = vi.fn();
|
|
22
|
+
const mockSyncFile = vi.fn();
|
|
23
|
+
const mockDeleteFiles = vi.fn();
|
|
24
|
+
const mockCreateSnapshot = vi.fn();
|
|
25
|
+
const mockHideBranches = vi.fn();
|
|
26
|
+
|
|
27
|
+
vi.mock('../src/sync.js', () => ({
|
|
28
|
+
syncFile: (...args: unknown[]) => mockSyncFile(...args),
|
|
29
|
+
deleteFiles: (...args: unknown[]) => mockDeleteFiles(...args),
|
|
30
|
+
initialSync: (...args: unknown[]) => mockInitialSync(...args),
|
|
31
|
+
createSnapshot: (...args: unknown[]) => mockCreateSnapshot(...args),
|
|
32
|
+
pushVersionMetadata: (...args: unknown[]) => mockPushVersionMetadata(...args),
|
|
33
|
+
hideBranches: (...args: unknown[]) => mockHideBranches(...args),
|
|
34
|
+
}));
|
|
35
|
+
|
|
36
|
+
// --- Mock logger ---
|
|
37
|
+
|
|
38
|
+
vi.mock('../src/logger.js', () => ({
|
|
39
|
+
logger: {
|
|
40
|
+
child: () => ({
|
|
41
|
+
info: vi.fn(),
|
|
42
|
+
warn: vi.fn(),
|
|
43
|
+
error: vi.fn(),
|
|
44
|
+
debug: vi.fn(),
|
|
45
|
+
}),
|
|
46
|
+
info: vi.fn(),
|
|
47
|
+
warn: vi.fn(),
|
|
48
|
+
error: vi.fn(),
|
|
49
|
+
debug: vi.fn(),
|
|
50
|
+
},
|
|
51
|
+
}));
|
|
52
|
+
|
|
53
|
+
describe('project watcher — atomic tmp+mv (real chokidar)', () => {
|
|
54
|
+
let tempDir: string;
|
|
55
|
+
let watcher: { close: () => Promise<void> } | null = null;
|
|
56
|
+
|
|
57
|
+
const testCredentials = {
|
|
58
|
+
apiKey: 'test-key',
|
|
59
|
+
userId: 'test-user',
|
|
60
|
+
serverUrl: 'http://localhost:3000',
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
beforeEach(async () => {
|
|
64
|
+
mockInitialSync.mockReset().mockResolvedValue(undefined);
|
|
65
|
+
mockPushVersionMetadata.mockReset().mockResolvedValue(undefined);
|
|
66
|
+
mockSyncFile.mockReset().mockResolvedValue(undefined);
|
|
67
|
+
mockDeleteFiles.mockReset().mockResolvedValue(undefined);
|
|
68
|
+
mockCreateSnapshot.mockReset().mockResolvedValue(true);
|
|
69
|
+
mockHideBranches.mockReset().mockResolvedValue(true);
|
|
70
|
+
|
|
71
|
+
tempDir = await mkdtemp(join(tmpdir(), 'project-watcher-test-'));
|
|
72
|
+
|
|
73
|
+
// Seed a minimal git repo layout
|
|
74
|
+
await mkdir(join(tempDir, '.git', 'refs', 'heads'), { recursive: true });
|
|
75
|
+
await writeFile(join(tempDir, '.git', 'HEAD'), 'ref: refs/heads/main\n');
|
|
76
|
+
await writeFile(
|
|
77
|
+
join(tempDir, '.git', 'refs', 'heads', 'main'),
|
|
78
|
+
'0000000000000000000000000000000000000000\n',
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
// Seed Ultra Claude layout
|
|
82
|
+
await mkdir(join(tempDir, '.claude', 'ultra'), { recursive: true });
|
|
83
|
+
await writeFile(
|
|
84
|
+
join(tempDir, '.claude', 'ultra', 'version.json'),
|
|
85
|
+
JSON.stringify({ version: '1.0.0' }),
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
// Seed documentation/ dir so docWatcher has something to watch
|
|
89
|
+
await mkdir(join(tempDir, 'documentation'), { recursive: true });
|
|
90
|
+
|
|
91
|
+
// Fresh module load per test
|
|
92
|
+
vi.resetModules();
|
|
93
|
+
const { startProjectWatcher } = await import('../src/watcher.js');
|
|
94
|
+
watcher = startProjectWatcher({
|
|
95
|
+
projectId: 'test-project',
|
|
96
|
+
projectPath: tempDir,
|
|
97
|
+
credentials: testCredentials,
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
// Give chokidar time to reach ready state
|
|
101
|
+
await new Promise((r) => setTimeout(r, 300));
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
afterEach(async () => {
|
|
105
|
+
if (watcher) await watcher.close();
|
|
106
|
+
watcher = null;
|
|
107
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it('fires initialSync on repeated atomic tmp+mv of .git/HEAD (branch switch simulation)', async () => {
|
|
111
|
+
// Reproduction: repeated atomic tmp+mv of .git/HEAD (as `git checkout` does).
|
|
112
|
+
// On the unfixed single-file watch, the inode swap orphans chokidar's
|
|
113
|
+
// internal watch after the first rename; subsequent checkouts are silent.
|
|
114
|
+
const headPath = join(tempDir, '.git', 'HEAD');
|
|
115
|
+
await mkdir(join(tempDir, '.git', 'refs', 'heads'), { recursive: true });
|
|
116
|
+
await writeFile(
|
|
117
|
+
join(tempDir, '.git', 'refs', 'heads', 'feature'),
|
|
118
|
+
'1111111111111111111111111111111111111111\n',
|
|
119
|
+
);
|
|
120
|
+
await writeFile(
|
|
121
|
+
join(tempDir, '.git', 'refs', 'heads', 'develop'),
|
|
122
|
+
'2222222222222222222222222222222222222222\n',
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
const checkoutAtomic = async (branch: string, label: string) => {
|
|
126
|
+
const tmpPath = `${headPath}.${label}.tmp`;
|
|
127
|
+
await writeFile(tmpPath, `ref: refs/heads/${branch}\n`);
|
|
128
|
+
await rename(tmpPath, headPath);
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
await checkoutAtomic('feature', 'a');
|
|
132
|
+
await vi.waitFor(
|
|
133
|
+
() => {
|
|
134
|
+
expect(mockInitialSync).toHaveBeenCalledTimes(1);
|
|
135
|
+
},
|
|
136
|
+
{ timeout: 4000, interval: 100 },
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
await new Promise((r) => setTimeout(r, 500));
|
|
140
|
+
|
|
141
|
+
await checkoutAtomic('develop', 'b');
|
|
142
|
+
await vi.waitFor(
|
|
143
|
+
() => {
|
|
144
|
+
expect(mockInitialSync).toHaveBeenCalledTimes(2);
|
|
145
|
+
},
|
|
146
|
+
{ timeout: 4000, interval: 100 },
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
await new Promise((r) => setTimeout(r, 500));
|
|
150
|
+
|
|
151
|
+
await checkoutAtomic('main', 'c');
|
|
152
|
+
await vi.waitFor(
|
|
153
|
+
() => {
|
|
154
|
+
expect(mockInitialSync).toHaveBeenCalledTimes(3);
|
|
155
|
+
},
|
|
156
|
+
{ timeout: 4000, interval: 100 },
|
|
157
|
+
);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
it('fires pushVersionMetadata on repeated atomic tmp+mv of .claude/ultra/version.json', async () => {
|
|
161
|
+
// Reproduction: repeated atomic tmp+mv. The awaitWriteFinish setting
|
|
162
|
+
// means we need to space them past the stability threshold.
|
|
163
|
+
const versionPath = join(tempDir, '.claude', 'ultra', 'version.json');
|
|
164
|
+
|
|
165
|
+
const bumpAtomic = async (version: string, label: string) => {
|
|
166
|
+
const tmpPath = `${versionPath}.${label}.tmp`;
|
|
167
|
+
await writeFile(tmpPath, JSON.stringify({ version }));
|
|
168
|
+
await rename(tmpPath, versionPath);
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
await bumpAtomic('2.0.0', 'a');
|
|
172
|
+
await vi.waitFor(
|
|
173
|
+
() => {
|
|
174
|
+
expect(mockPushVersionMetadata).toHaveBeenCalledTimes(1);
|
|
175
|
+
},
|
|
176
|
+
{ timeout: 4000, interval: 100 },
|
|
177
|
+
);
|
|
178
|
+
|
|
179
|
+
await new Promise((r) => setTimeout(r, 500));
|
|
180
|
+
|
|
181
|
+
await bumpAtomic('2.1.0', 'b');
|
|
182
|
+
await vi.waitFor(
|
|
183
|
+
() => {
|
|
184
|
+
expect(mockPushVersionMetadata).toHaveBeenCalledTimes(2);
|
|
185
|
+
},
|
|
186
|
+
{ timeout: 4000, interval: 100 },
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
await new Promise((r) => setTimeout(r, 500));
|
|
190
|
+
|
|
191
|
+
await bumpAtomic('2.2.0', 'c');
|
|
192
|
+
await vi.waitFor(
|
|
193
|
+
() => {
|
|
194
|
+
expect(mockPushVersionMetadata).toHaveBeenCalledTimes(3);
|
|
195
|
+
},
|
|
196
|
+
{ timeout: 4000, interval: 100 },
|
|
197
|
+
);
|
|
198
|
+
});
|
|
199
|
+
});
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
// Integration test — real chokidar against tmp dir. Regression guard for
|
|
2
|
+
// the usage-sync watcher's parent-directory watch pattern.
|
|
3
|
+
//
|
|
4
|
+
// NOTE on failing-first: the plan originally framed these tests as
|
|
5
|
+
// failing-first reproductions of a live daemon bug (watcher goes silent
|
|
6
|
+
// after atomic tmp+mv writes). Investigation of chokidar 5.x source and
|
|
7
|
+
// empirical testing showed that a simple inode-swap-dies-after-one-mv
|
|
8
|
+
// scenario does NOT reproduce — chokidar 5.x on Linux auto re-registers
|
|
9
|
+
// inodes in `_handleFile` (handler.js:365-371). A steady-state stress
|
|
10
|
+
// reproduction was found that sometimes pins `_pendingWrites` state on
|
|
11
|
+
// the single-file path, but it's non-deterministic and not suitable for
|
|
12
|
+
// a unit test.
|
|
13
|
+
//
|
|
14
|
+
// Per the Lead amendment (shared/lead.md, 2026-04-12): these tests are
|
|
15
|
+
// relabeled as REGRESSION GUARDS for the parent-dir watch pattern. They
|
|
16
|
+
// ensure the fix handles atomic tmp+mv correctly. The live production
|
|
17
|
+
// root cause remains unknown; the fix moves off the suspect `_handleFile`
|
|
18
|
+
// code path entirely.
|
|
19
|
+
|
|
20
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
21
|
+
import { mkdtemp, writeFile, rename, mkdir, rm } from 'node:fs/promises';
|
|
22
|
+
import { tmpdir } from 'node:os';
|
|
23
|
+
import { join } from 'node:path';
|
|
24
|
+
|
|
25
|
+
// --- State for the homedir mock (captured via closure, set in beforeEach) ---
|
|
26
|
+
|
|
27
|
+
let tempDir: string;
|
|
28
|
+
|
|
29
|
+
vi.mock('node:os', async (importOriginal) => {
|
|
30
|
+
const original = await importOriginal<typeof import('node:os')>();
|
|
31
|
+
return {
|
|
32
|
+
...original,
|
|
33
|
+
homedir: () => tempDir,
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
// --- Mock config — loadCredentials, loadAllCredentials, getServerUrl ---
|
|
38
|
+
|
|
39
|
+
vi.mock('../src/config.js', () => ({
|
|
40
|
+
loadCredentials: vi.fn().mockResolvedValue({
|
|
41
|
+
apiKey: 'test-key',
|
|
42
|
+
userId: 'test-user',
|
|
43
|
+
serverUrl: 'http://localhost:3000',
|
|
44
|
+
}),
|
|
45
|
+
loadAllCredentials: vi.fn().mockResolvedValue(
|
|
46
|
+
new Map([
|
|
47
|
+
[
|
|
48
|
+
'test-user',
|
|
49
|
+
{
|
|
50
|
+
apiKey: 'test-key',
|
|
51
|
+
userId: 'test-user',
|
|
52
|
+
email: 'test@example.com',
|
|
53
|
+
serverUrl: 'http://localhost:3000',
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
]),
|
|
57
|
+
),
|
|
58
|
+
getServerUrl: vi.fn().mockReturnValue('http://localhost:3000'),
|
|
59
|
+
paths: {
|
|
60
|
+
claudeProjects: '/tmp/test-projects',
|
|
61
|
+
projectIdFile: '.claude/ultra/project-id',
|
|
62
|
+
oldConfigDir: '/tmp/test-old-config',
|
|
63
|
+
},
|
|
64
|
+
}));
|
|
65
|
+
|
|
66
|
+
// --- Mock logger ---
|
|
67
|
+
|
|
68
|
+
vi.mock('../src/logger.js', () => ({
|
|
69
|
+
logger: {
|
|
70
|
+
child: () => ({
|
|
71
|
+
info: vi.fn(),
|
|
72
|
+
warn: vi.fn(),
|
|
73
|
+
error: vi.fn(),
|
|
74
|
+
debug: vi.fn(),
|
|
75
|
+
}),
|
|
76
|
+
info: vi.fn(),
|
|
77
|
+
warn: vi.fn(),
|
|
78
|
+
error: vi.fn(),
|
|
79
|
+
debug: vi.fn(),
|
|
80
|
+
},
|
|
81
|
+
}));
|
|
82
|
+
|
|
83
|
+
// --- Mock fetch — observable surface for "the chokidar handler fired" ---
|
|
84
|
+
//
|
|
85
|
+
// startUsageWatcher → scheduleSyncUsage → syncUsageData → pushUsageData → apiRequest → fetch
|
|
86
|
+
// If chokidar never fires, fetch is never called. Any fetch call is proof the
|
|
87
|
+
// handler ran end-to-end.
|
|
88
|
+
|
|
89
|
+
const mockFetch = vi.fn();
|
|
90
|
+
vi.stubGlobal('fetch', mockFetch);
|
|
91
|
+
|
|
92
|
+
describe('usage watcher — atomic tmp+mv (real chokidar)', () => {
|
|
93
|
+
let watcher: { close: () => Promise<void> } | null = null;
|
|
94
|
+
|
|
95
|
+
beforeEach(async () => {
|
|
96
|
+
mockFetch.mockReset();
|
|
97
|
+
mockFetch.mockResolvedValue({
|
|
98
|
+
ok: true,
|
|
99
|
+
status: 200,
|
|
100
|
+
json: () => Promise.resolve({ data: { ok: true, upserted: 1 } }),
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
tempDir = await mkdtemp(join(tmpdir(), 'usage-watcher-test-'));
|
|
104
|
+
await mkdir(join(tempDir, '.claude', 'ultra', 'accounts'), { recursive: true });
|
|
105
|
+
|
|
106
|
+
// Seed an initial usage-status.json so the first post-start mutation is
|
|
107
|
+
// observable (the watcher uses ignoreInitial: true).
|
|
108
|
+
await writeFile(
|
|
109
|
+
join(tempDir, '.claude', 'ultra', 'usage-status.json'),
|
|
110
|
+
JSON.stringify({ accounts: {}, updated_at: new Date().toISOString() }),
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
// Fresh module load per test — ULTRA_DIR/USAGE_STATUS_PATH constants are
|
|
114
|
+
// computed at module-eval time from the mocked homedir.
|
|
115
|
+
vi.resetModules();
|
|
116
|
+
const mod = await import('../src/usage-sync.js');
|
|
117
|
+
watcher = mod.startUsageWatcher();
|
|
118
|
+
|
|
119
|
+
// Give chokidar time to reach its 'ready' state before the test mutates files.
|
|
120
|
+
await new Promise((r) => setTimeout(r, 300));
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
afterEach(async () => {
|
|
124
|
+
if (watcher) await watcher.close();
|
|
125
|
+
watcher = null;
|
|
126
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it('fires handler on atomic tmp+mv of usage-status.json', async () => {
|
|
130
|
+
// Regression guard: a write-to-tmp + rename to usage-status.json
|
|
131
|
+
// (the exact pattern statusline.sh uses) fires the watcher handler
|
|
132
|
+
// within the debounce window.
|
|
133
|
+
const statusPath = join(tempDir, '.claude', 'ultra', 'usage-status.json');
|
|
134
|
+
const tmpPath = statusPath + '.tmp';
|
|
135
|
+
const nowSec = Math.floor(Date.now() / 1000);
|
|
136
|
+
await writeFile(
|
|
137
|
+
tmpPath,
|
|
138
|
+
JSON.stringify({
|
|
139
|
+
accounts: {
|
|
140
|
+
a1: {
|
|
141
|
+
account_id: 'a1',
|
|
142
|
+
rate_limits: {
|
|
143
|
+
five_hour: { used_percentage: 42, resets_at: nowSec + 3600 },
|
|
144
|
+
seven_day: { used_percentage: 18, resets_at: nowSec + 86400 },
|
|
145
|
+
},
|
|
146
|
+
updated_at: new Date().toISOString(),
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
updated_at: new Date().toISOString(),
|
|
150
|
+
}),
|
|
151
|
+
);
|
|
152
|
+
await rename(tmpPath, statusPath);
|
|
153
|
+
|
|
154
|
+
await vi.waitFor(
|
|
155
|
+
() => {
|
|
156
|
+
expect(mockFetch).toHaveBeenCalled();
|
|
157
|
+
},
|
|
158
|
+
{ timeout: 4000, interval: 100 },
|
|
159
|
+
);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it('fires handler on multiple sequential atomic tmp+mv operations', { timeout: 15_000 }, async () => {
|
|
163
|
+
// Regression guard for the parent-dir watch pattern: multiple
|
|
164
|
+
// sequential atomic renames (as statusline.sh does over time) must
|
|
165
|
+
// continue firing the handler, not silently die after the first one.
|
|
166
|
+
const statusPath = join(tempDir, '.claude', 'ultra', 'usage-status.json');
|
|
167
|
+
|
|
168
|
+
const writeAtomic = async (label: string) => {
|
|
169
|
+
const tmpPath = `${statusPath}.${label}.tmp`;
|
|
170
|
+
const nowSec = Math.floor(Date.now() / 1000);
|
|
171
|
+
await writeFile(
|
|
172
|
+
tmpPath,
|
|
173
|
+
JSON.stringify({
|
|
174
|
+
accounts: {
|
|
175
|
+
a1: {
|
|
176
|
+
account_id: 'a1',
|
|
177
|
+
rate_limits: {
|
|
178
|
+
five_hour: { used_percentage: 42, resets_at: nowSec + 3600 },
|
|
179
|
+
seven_day: { used_percentage: 18, resets_at: nowSec + 86400 },
|
|
180
|
+
},
|
|
181
|
+
updated_at: new Date().toISOString(),
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
updated_at: new Date().toISOString(),
|
|
185
|
+
label,
|
|
186
|
+
}),
|
|
187
|
+
);
|
|
188
|
+
await rename(tmpPath, statusPath);
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
await writeAtomic('a');
|
|
192
|
+
await vi.waitFor(
|
|
193
|
+
() => {
|
|
194
|
+
expect(mockFetch).toHaveBeenCalledTimes(1);
|
|
195
|
+
},
|
|
196
|
+
{ timeout: 4000, interval: 100 },
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
await new Promise((r) => setTimeout(r, 1500));
|
|
200
|
+
|
|
201
|
+
await writeAtomic('b');
|
|
202
|
+
await vi.waitFor(
|
|
203
|
+
() => {
|
|
204
|
+
expect(mockFetch).toHaveBeenCalledTimes(2);
|
|
205
|
+
},
|
|
206
|
+
{ timeout: 4000, interval: 100 },
|
|
207
|
+
);
|
|
208
|
+
|
|
209
|
+
await new Promise((r) => setTimeout(r, 1500));
|
|
210
|
+
|
|
211
|
+
await writeAtomic('c');
|
|
212
|
+
await vi.waitFor(
|
|
213
|
+
() => {
|
|
214
|
+
expect(mockFetch).toHaveBeenCalledTimes(3);
|
|
215
|
+
},
|
|
216
|
+
{ timeout: 4000, interval: 100 },
|
|
217
|
+
);
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
it('fires handler on adding a new accounts/*.json file (no-regression)', async () => {
|
|
221
|
+
const accountsPath = join(tempDir, '.claude', 'ultra', 'accounts', 'new-user.json');
|
|
222
|
+
|
|
223
|
+
// Seed usage-status.json with a matching account so the payload is non-empty.
|
|
224
|
+
const nowSec = Math.floor(Date.now() / 1000);
|
|
225
|
+
await writeFile(
|
|
226
|
+
join(tempDir, '.claude', 'ultra', 'usage-status.json'),
|
|
227
|
+
JSON.stringify({
|
|
228
|
+
accounts: {
|
|
229
|
+
'new-user': {
|
|
230
|
+
account_id: 'new-user',
|
|
231
|
+
rate_limits: {
|
|
232
|
+
five_hour: { used_percentage: 10, resets_at: nowSec + 3600 },
|
|
233
|
+
seven_day: { used_percentage: 5, resets_at: nowSec + 86400 },
|
|
234
|
+
},
|
|
235
|
+
updated_at: new Date().toISOString(),
|
|
236
|
+
},
|
|
237
|
+
},
|
|
238
|
+
updated_at: new Date().toISOString(),
|
|
239
|
+
}),
|
|
240
|
+
);
|
|
241
|
+
|
|
242
|
+
await writeFile(
|
|
243
|
+
accountsPath,
|
|
244
|
+
JSON.stringify({
|
|
245
|
+
account_id: 'new-user',
|
|
246
|
+
email: 'new@example.com',
|
|
247
|
+
orgName: 'Org',
|
|
248
|
+
subscriptionType: 'pro',
|
|
249
|
+
}),
|
|
250
|
+
);
|
|
251
|
+
|
|
252
|
+
await vi.waitFor(
|
|
253
|
+
() => {
|
|
254
|
+
expect(mockFetch).toHaveBeenCalled();
|
|
255
|
+
},
|
|
256
|
+
{ timeout: 4000, interval: 100 },
|
|
257
|
+
);
|
|
258
|
+
});
|
|
259
|
+
});
|
package/dist/usage-sync.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage-sync.d.ts","sourceRoot":"","sources":["../src/usage-sync.ts"],"names":[],"mappings":"AAkOA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAanD;AAID,MAAM,WAAW,YAAY;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAgB,iBAAiB,IAAI,YAAY,
|
|
1
|
+
{"version":3,"file":"usage-sync.d.ts","sourceRoot":"","sources":["../src/usage-sync.ts"],"names":[],"mappings":"AAkOA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAanD;AAID,MAAM,WAAW,YAAY;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAgB,iBAAiB,IAAI,YAAY,CA4DhD;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAavC"}
|
package/dist/usage-sync.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import chokidar from 'chokidar';
|
|
3
3
|
import { readFile, readdir } from 'node:fs/promises';
|
|
4
4
|
import { homedir } from 'node:os';
|
|
5
|
-
import { join } from 'node:path';
|
|
5
|
+
import { join, sep } from 'node:path';
|
|
6
6
|
import { apiRequest } from './sync.js';
|
|
7
7
|
import { loadAllCredentials, loadCredentials, getServerUrl } from './config.js';
|
|
8
8
|
import { logger } from './logger.js';
|
|
@@ -188,19 +188,34 @@ export function startUsageWatcher() {
|
|
|
188
188
|
});
|
|
189
189
|
}, DEBOUNCE_MS);
|
|
190
190
|
}
|
|
191
|
-
|
|
191
|
+
// Watch ULTRA_DIR at depth 0 (not the single file) so atomic tmp+mv writes
|
|
192
|
+
// by statusline.sh don't strand us on a stale inode or get stuck in
|
|
193
|
+
// chokidar's `_handleFile` / `_pendingWrites` state. Filter in the handler
|
|
194
|
+
// so sibling files (sessions/, version.json, etc.) are ignored.
|
|
195
|
+
// ACCOUNTS_DIR is a separate watch so individual accounts/*.json adds fire.
|
|
196
|
+
watcher = chokidar.watch([ULTRA_DIR, ACCOUNTS_DIR], {
|
|
192
197
|
persistent: true,
|
|
193
198
|
ignoreInitial: true,
|
|
199
|
+
depth: 0,
|
|
194
200
|
awaitWriteFinish: {
|
|
195
201
|
stabilityThreshold: 200,
|
|
196
202
|
pollInterval: 100,
|
|
197
203
|
},
|
|
198
204
|
});
|
|
205
|
+
const onPath = (filePath) => {
|
|
206
|
+
if (filePath === USAGE_STATUS_PATH) {
|
|
207
|
+
scheduleSyncUsage();
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
if (filePath.startsWith(ACCOUNTS_DIR + sep)) {
|
|
211
|
+
scheduleSyncUsage();
|
|
212
|
+
}
|
|
213
|
+
};
|
|
199
214
|
watcher
|
|
200
|
-
.on('add',
|
|
201
|
-
.on('change',
|
|
215
|
+
.on('add', onPath)
|
|
216
|
+
.on('change', onPath)
|
|
202
217
|
.on('error', (err) => log.error({ err }, 'Usage watcher error'));
|
|
203
|
-
log.info({
|
|
218
|
+
log.info({ ultraDir: ULTRA_DIR, accountsDir: ACCOUNTS_DIR }, 'Usage watcher started');
|
|
204
219
|
return {
|
|
205
220
|
async close() {
|
|
206
221
|
if (debounceTimer) {
|
package/dist/usage-sync.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage-sync.js","sourceRoot":"","sources":["../src/usage-sync.ts"],"names":[],"mappings":"AAAA,iGAAiG;AAEjG,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"usage-sync.js","sourceRoot":"","sources":["../src/usage-sync.ts"],"names":[],"mappings":"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"}
|
package/dist/watcher.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,UAAU,qBAAqB;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,aAAa,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,WAAW,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAe5D;AAuBD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,GAAG,cAAc,
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,UAAU,qBAAqB;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,aAAa,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,WAAW,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAe5D;AAuBD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,GAAG,cAAc,CAkMlF"}
|
package/dist/watcher.js
CHANGED
|
@@ -116,13 +116,17 @@ export function startProjectWatcher(options) {
|
|
|
116
116
|
})
|
|
117
117
|
.on('error', (err) => log.error({ err }, 'Documentation watcher error'))
|
|
118
118
|
.on('ready', () => log.info('Documentation watcher ready'));
|
|
119
|
-
// Git HEAD watcher — triggers full resync on branch switch
|
|
120
|
-
|
|
121
|
-
|
|
119
|
+
// Git HEAD watcher — triggers full resync on branch switch.
|
|
120
|
+
// `git checkout` writes HEAD atomically via tmp+mv, so we watch the .git/
|
|
121
|
+
// directory at depth 0 and filter for HEAD to stay resilient to the state
|
|
122
|
+
// paths in chokidar's `_handleFile` code path.
|
|
123
|
+
const gitDir = join(projectPath, '.git');
|
|
124
|
+
const gitWatcher = chokidar.watch(gitDir, {
|
|
122
125
|
persistent: true,
|
|
123
126
|
ignoreInitial: true,
|
|
127
|
+
depth: 0,
|
|
124
128
|
});
|
|
125
|
-
|
|
129
|
+
const handleHeadChange = () => {
|
|
126
130
|
const newBranch = getCurrentBranch(projectPath);
|
|
127
131
|
log.info({ oldBranch: currentBranch, newBranch }, 'Git HEAD changed — triggering full resync');
|
|
128
132
|
currentBranch = newBranch;
|
|
@@ -132,23 +136,40 @@ export function startProjectWatcher(options) {
|
|
|
132
136
|
.catch((err) => {
|
|
133
137
|
log.error({ err }, 'Full resync after git HEAD change failed');
|
|
134
138
|
});
|
|
139
|
+
};
|
|
140
|
+
gitWatcher.on('change', (filePath) => {
|
|
141
|
+
if (basename(filePath) !== 'HEAD')
|
|
142
|
+
return;
|
|
143
|
+
handleHeadChange();
|
|
144
|
+
});
|
|
145
|
+
gitWatcher.on('add', (filePath) => {
|
|
146
|
+
if (basename(filePath) !== 'HEAD')
|
|
147
|
+
return;
|
|
148
|
+
handleHeadChange();
|
|
135
149
|
});
|
|
136
|
-
// Version file watcher — push version metadata on change
|
|
137
|
-
|
|
138
|
-
|
|
150
|
+
// Version file watcher — push version metadata on change.
|
|
151
|
+
// Same parent-dir + basename filter pattern as the HEAD watcher: ultra
|
|
152
|
+
// update scripts write version.json atomically via tmp+mv.
|
|
153
|
+
const ultraDir = join(projectPath, '.claude', 'ultra');
|
|
154
|
+
const versionWatcher = chokidar.watch(ultraDir, {
|
|
139
155
|
persistent: true,
|
|
140
156
|
ignoreInitial: true,
|
|
157
|
+
depth: 0,
|
|
141
158
|
awaitWriteFinish: {
|
|
142
159
|
stabilityThreshold: 200,
|
|
143
160
|
pollInterval: 50,
|
|
144
161
|
},
|
|
145
162
|
});
|
|
146
|
-
|
|
163
|
+
const onVersionEvent = (filePath) => {
|
|
164
|
+
if (basename(filePath) !== 'version.json')
|
|
165
|
+
return;
|
|
147
166
|
log.info('version.json changed — pushing version metadata');
|
|
148
167
|
pushVersionMetadata(projectId, projectPath, credentials).catch((err) => {
|
|
149
168
|
log.error({ err }, 'Version metadata push failed');
|
|
150
169
|
});
|
|
151
|
-
}
|
|
170
|
+
};
|
|
171
|
+
versionWatcher.on('add', onVersionEvent);
|
|
172
|
+
versionWatcher.on('change', onVersionEvent);
|
|
152
173
|
// Git refs watcher — detect commits for auto-snapshots
|
|
153
174
|
const gitRefsPath = join(projectPath, '.git', 'refs');
|
|
154
175
|
const gitRefsWatcher = chokidar.watch(gitRefsPath, {
|
package/dist/watcher.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -71,4 +71,9 @@ export declare const branchHideRequestSchema: z.ZodObject<{
|
|
|
71
71
|
branches: z.ZodArray<z.ZodString>;
|
|
72
72
|
}, z.core.$strip>;
|
|
73
73
|
export type BranchHideRequestInput = z.infer<typeof branchHideRequestSchema>;
|
|
74
|
+
export declare const branchVisibilitySchema: z.ZodObject<{
|
|
75
|
+
branch: z.ZodString;
|
|
76
|
+
visible: z.ZodBoolean;
|
|
77
|
+
}, z.core.$strip>;
|
|
78
|
+
export type BranchVisibilityInput = z.infer<typeof branchVisibilitySchema>;
|
|
74
79
|
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/api/schemas/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,eAAO,MAAM,UAAU,aAAwD,CAAC;AAIhF,eAAO,MAAM,iBAAiB;;;;;;;iBAO5B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;iBAO7B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AACnE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAI5D,eAAO,MAAM,kBAAkB;;;;;iBAK7B,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;;;iBAI1B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAI7D,eAAO,MAAM,oBAAoB;;;;;;;;;;iBAM/B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAIvE,eAAO,MAAM,iBAAiB;;;;iBAI5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAIjE,eAAO,MAAM,eAAe;;;;iBAI1B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAI7D,eAAO,MAAM,uBAAuB;;;iBAGlC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/api/schemas/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,eAAO,MAAM,UAAU,aAAwD,CAAC;AAIhF,eAAO,MAAM,iBAAiB;;;;;;;iBAO5B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;iBAO7B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AACnE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAI5D,eAAO,MAAM,kBAAkB;;;;;iBAK7B,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;;;iBAI1B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAI7D,eAAO,MAAM,oBAAoB;;;;;;;;;;iBAM/B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAIvE,eAAO,MAAM,iBAAiB;;;;iBAI5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAIjE,eAAO,MAAM,eAAe;;;;iBAI1B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAI7D,eAAO,MAAM,uBAAuB;;;iBAGlC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAI7E,eAAO,MAAM,sBAAsB;;;iBAGjC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
|
|
@@ -61,4 +61,9 @@ export const branchHideRequestSchema = z.object({
|
|
|
61
61
|
projectId: z.string().uuid(),
|
|
62
62
|
branches: z.array(z.string().min(1).max(200)).min(1).max(100),
|
|
63
63
|
});
|
|
64
|
+
// --- POST /api/projects/[id]/branches/visibility ---
|
|
65
|
+
export const branchVisibilitySchema = z.object({
|
|
66
|
+
branch: branchName,
|
|
67
|
+
visible: z.boolean(),
|
|
68
|
+
});
|
|
64
69
|
//# sourceMappingURL=sync.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/api/schemas/sync.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/api/schemas/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../../src/api/schemas/usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;iBAUjC,CAAC;AAIH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;iBAEjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAItE,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
|
1
|
+
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../../src/api/schemas/usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;iBAUjC,CAAC;AAIH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;iBAEjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAItE,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { createProjectSchema, updateProjectSchema, moveProjectSchema, branchListItemSchema, branchListResponseSchema, type CreateProjectInput, type UpdateProjectInput, type MoveProjectInput, type BranchListResponse, } from './api/schemas/projects.js';
|
|
2
|
-
export { branchName, syncSectionsSchema, sectionItemSchema, syncFilesSchema, syncFileItemSchema, createSnapshotSchema, deleteFilesSchema, reconcileSchema, branchHideRequestSchema, type SyncSectionsInput, type SectionItem, type SyncFilesInput, type CreateSnapshotInput, type DeleteFilesInput, type BranchHideRequestInput, type ReconcileInput, } from './api/schemas/sync.js';
|
|
2
|
+
export { branchName, syncSectionsSchema, sectionItemSchema, syncFilesSchema, syncFileItemSchema, createSnapshotSchema, deleteFilesSchema, reconcileSchema, branchHideRequestSchema, branchVisibilitySchema, type SyncSectionsInput, type SectionItem, type SyncFilesInput, type CreateSnapshotInput, type DeleteFilesInput, type BranchHideRequestInput, type BranchVisibilityInput, type ReconcileInput, } from './api/schemas/sync.js';
|
|
3
3
|
export { computeContentHash, verifyContentHash } from './hashing.js';
|
|
4
4
|
export { parseMarkdownSections, generateSlug } from './sections.js';
|
|
5
5
|
export type { SectionData, ManifestEntry, ProjectRegistryEntry, ProjectRegistry, AgentCredentials, } from './types.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,EACxB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,GACxB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,uBAAuB,EACvB,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,cAAc,GACpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAErE,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEpE,YAAY,EACV,WAAW,EACX,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACxB,8BAA8B,EAC9B,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,GAC9B,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,YAAY,GAClB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,6BAA6B,EAC7B,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,uBAAuB,GAC7B,MAAM,4BAA4B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,EACxB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,GACxB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,uBAAuB,EACvB,sBAAsB,EACtB,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,cAAc,GACpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAErE,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEpE,YAAY,EACV,WAAW,EACX,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACxB,8BAA8B,EAC9B,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,GAC9B,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,YAAY,GAClB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,6BAA6B,EAC7B,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,uBAAuB,GAC7B,MAAM,4BAA4B,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// @ultra-claude/shared — shared types, API contracts, block parsing
|
|
2
2
|
export { createProjectSchema, updateProjectSchema, moveProjectSchema, branchListItemSchema, branchListResponseSchema, } from './api/schemas/projects.js';
|
|
3
|
-
export { branchName, syncSectionsSchema, sectionItemSchema, syncFilesSchema, syncFileItemSchema, createSnapshotSchema, deleteFilesSchema, reconcileSchema, branchHideRequestSchema, } from './api/schemas/sync.js';
|
|
3
|
+
export { branchName, syncSectionsSchema, sectionItemSchema, syncFilesSchema, syncFileItemSchema, createSnapshotSchema, deleteFilesSchema, reconcileSchema, branchHideRequestSchema, branchVisibilitySchema, } from './api/schemas/sync.js';
|
|
4
4
|
export { computeContentHash, verifyContentHash } from './hashing.js';
|
|
5
5
|
export { parseMarkdownSections, generateSlug } from './sections.js';
|
|
6
6
|
export { ok, err } from './result.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAEpE,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,GAKzB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,uBAAuB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAEpE,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,GAKzB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,uBAAuB,EACvB,sBAAsB,GASvB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAErE,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAUpE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAe,MAAM,aAAa,CAAC;AAEnD,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACxB,8BAA8B,GAK/B,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,sBAAsB,EACtB,sBAAsB,GAIvB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,6BAA6B,GAM9B,MAAM,4BAA4B,CAAC"}
|
package/package.json
CHANGED
package/src/usage-sync.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import chokidar from 'chokidar';
|
|
4
4
|
import { readFile, readdir } from 'node:fs/promises';
|
|
5
5
|
import { homedir } from 'node:os';
|
|
6
|
-
import { join } from 'node:path';
|
|
6
|
+
import { join, sep } from 'node:path';
|
|
7
7
|
import type { SyncUsageAccount, SyncUsageRequest } from '@ultra-claude/shared';
|
|
8
8
|
import { apiRequest } from './sync.js';
|
|
9
9
|
import { loadAllCredentials, loadCredentials, getServerUrl } from './config.js';
|
|
@@ -258,21 +258,37 @@ export function startUsageWatcher(): UsageWatcher {
|
|
|
258
258
|
}, DEBOUNCE_MS);
|
|
259
259
|
}
|
|
260
260
|
|
|
261
|
-
|
|
261
|
+
// Watch ULTRA_DIR at depth 0 (not the single file) so atomic tmp+mv writes
|
|
262
|
+
// by statusline.sh don't strand us on a stale inode or get stuck in
|
|
263
|
+
// chokidar's `_handleFile` / `_pendingWrites` state. Filter in the handler
|
|
264
|
+
// so sibling files (sessions/, version.json, etc.) are ignored.
|
|
265
|
+
// ACCOUNTS_DIR is a separate watch so individual accounts/*.json adds fire.
|
|
266
|
+
watcher = chokidar.watch([ULTRA_DIR, ACCOUNTS_DIR], {
|
|
262
267
|
persistent: true,
|
|
263
268
|
ignoreInitial: true,
|
|
269
|
+
depth: 0,
|
|
264
270
|
awaitWriteFinish: {
|
|
265
271
|
stabilityThreshold: 200,
|
|
266
272
|
pollInterval: 100,
|
|
267
273
|
},
|
|
268
274
|
});
|
|
269
275
|
|
|
276
|
+
const onPath = (filePath: string) => {
|
|
277
|
+
if (filePath === USAGE_STATUS_PATH) {
|
|
278
|
+
scheduleSyncUsage();
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
if (filePath.startsWith(ACCOUNTS_DIR + sep)) {
|
|
282
|
+
scheduleSyncUsage();
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
|
|
270
286
|
watcher
|
|
271
|
-
.on('add',
|
|
272
|
-
.on('change',
|
|
287
|
+
.on('add', onPath)
|
|
288
|
+
.on('change', onPath)
|
|
273
289
|
.on('error', (err) => log.error({ err }, 'Usage watcher error'));
|
|
274
290
|
|
|
275
|
-
log.info({
|
|
291
|
+
log.info({ ultraDir: ULTRA_DIR, accountsDir: ACCOUNTS_DIR }, 'Usage watcher started');
|
|
276
292
|
|
|
277
293
|
return {
|
|
278
294
|
async close() {
|
package/src/watcher.ts
CHANGED
|
@@ -143,14 +143,18 @@ export function startProjectWatcher(options: ProjectWatcherOptions): ProjectWatc
|
|
|
143
143
|
.on('error', (err) => log.error({ err }, 'Documentation watcher error'))
|
|
144
144
|
.on('ready', () => log.info('Documentation watcher ready'));
|
|
145
145
|
|
|
146
|
-
// Git HEAD watcher — triggers full resync on branch switch
|
|
147
|
-
|
|
148
|
-
|
|
146
|
+
// Git HEAD watcher — triggers full resync on branch switch.
|
|
147
|
+
// `git checkout` writes HEAD atomically via tmp+mv, so we watch the .git/
|
|
148
|
+
// directory at depth 0 and filter for HEAD to stay resilient to the state
|
|
149
|
+
// paths in chokidar's `_handleFile` code path.
|
|
150
|
+
const gitDir = join(projectPath, '.git');
|
|
151
|
+
const gitWatcher = chokidar.watch(gitDir, {
|
|
149
152
|
persistent: true,
|
|
150
153
|
ignoreInitial: true,
|
|
154
|
+
depth: 0,
|
|
151
155
|
});
|
|
152
156
|
|
|
153
|
-
|
|
157
|
+
const handleHeadChange = () => {
|
|
154
158
|
const newBranch = getCurrentBranch(projectPath);
|
|
155
159
|
log.info({ oldBranch: currentBranch, newBranch }, 'Git HEAD changed — triggering full resync');
|
|
156
160
|
currentBranch = newBranch;
|
|
@@ -160,25 +164,40 @@ export function startProjectWatcher(options: ProjectWatcherOptions): ProjectWatc
|
|
|
160
164
|
.catch((err) => {
|
|
161
165
|
log.error({ err }, 'Full resync after git HEAD change failed');
|
|
162
166
|
});
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
gitWatcher.on('change', (filePath) => {
|
|
170
|
+
if (basename(filePath) !== 'HEAD') return;
|
|
171
|
+
handleHeadChange();
|
|
172
|
+
});
|
|
173
|
+
gitWatcher.on('add', (filePath) => {
|
|
174
|
+
if (basename(filePath) !== 'HEAD') return;
|
|
175
|
+
handleHeadChange();
|
|
163
176
|
});
|
|
164
177
|
|
|
165
|
-
// Version file watcher — push version metadata on change
|
|
166
|
-
|
|
167
|
-
|
|
178
|
+
// Version file watcher — push version metadata on change.
|
|
179
|
+
// Same parent-dir + basename filter pattern as the HEAD watcher: ultra
|
|
180
|
+
// update scripts write version.json atomically via tmp+mv.
|
|
181
|
+
const ultraDir = join(projectPath, '.claude', 'ultra');
|
|
182
|
+
const versionWatcher = chokidar.watch(ultraDir, {
|
|
168
183
|
persistent: true,
|
|
169
184
|
ignoreInitial: true,
|
|
185
|
+
depth: 0,
|
|
170
186
|
awaitWriteFinish: {
|
|
171
187
|
stabilityThreshold: 200,
|
|
172
188
|
pollInterval: 50,
|
|
173
189
|
},
|
|
174
190
|
});
|
|
175
191
|
|
|
176
|
-
|
|
192
|
+
const onVersionEvent = (filePath: string) => {
|
|
193
|
+
if (basename(filePath) !== 'version.json') return;
|
|
177
194
|
log.info('version.json changed — pushing version metadata');
|
|
178
195
|
pushVersionMetadata(projectId, projectPath, credentials).catch((err) => {
|
|
179
196
|
log.error({ err }, 'Version metadata push failed');
|
|
180
197
|
});
|
|
181
|
-
}
|
|
198
|
+
};
|
|
199
|
+
versionWatcher.on('add', onVersionEvent);
|
|
200
|
+
versionWatcher.on('change', onVersionEvent);
|
|
182
201
|
|
|
183
202
|
// Git refs watcher — detect commits for auto-snapshots
|
|
184
203
|
const gitRefsPath = join(projectPath, '.git', 'refs');
|