@applica-software-guru/sdd-core 1.7.0 → 1.8.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.
- package/dist/remote/api-client.d.ts +7 -1
- package/dist/remote/api-client.d.ts.map +1 -1
- package/dist/remote/api-client.js +15 -0
- package/dist/remote/api-client.js.map +1 -1
- package/dist/remote/sync-engine.d.ts.map +1 -1
- package/dist/remote/sync-engine.js +153 -30
- package/dist/remote/sync-engine.js.map +1 -1
- package/dist/remote/types.d.ts +9 -0
- package/dist/remote/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/remote/api-client.ts +25 -0
- package/src/remote/sync-engine.ts +168 -32
- package/src/remote/types.ts +10 -0
- package/tests/sync-engine.test.ts +156 -5
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { SDDConfig } from '../types.js';
|
|
2
|
-
import type { RemoteDocResponse, RemoteDocBulkResponse, RemoteCRResponse, RemoteCRBulkResponse, RemoteBugResponse, RemoteBugBulkResponse, RemoteResetResult } from './types.js';
|
|
2
|
+
import type { RemoteDocResponse, RemoteDocBulkResponse, RemoteCRResponse, RemoteCRBulkResponse, RemoteBugResponse, RemoteBugBulkResponse, RemoteDeleteResponse, RemoteResetResult } from './types.js';
|
|
3
3
|
/** Default timeout for remote operations (seconds) */
|
|
4
4
|
export declare const DEFAULT_REMOTE_TIMEOUT = 300;
|
|
5
5
|
export interface ApiClientConfig {
|
|
@@ -48,6 +48,12 @@ export declare function pushBugs(config: ApiClientConfig, bugs: Array<{
|
|
|
48
48
|
severity?: string;
|
|
49
49
|
id?: string;
|
|
50
50
|
}>): Promise<RemoteBugBulkResponse>;
|
|
51
|
+
/** POST /cli/delete-docs */
|
|
52
|
+
export declare function deleteDocs(config: ApiClientConfig, paths: string[]): Promise<RemoteDeleteResponse>;
|
|
53
|
+
/** POST /cli/delete-crs */
|
|
54
|
+
export declare function deleteCRs(config: ApiClientConfig, paths: string[]): Promise<RemoteDeleteResponse>;
|
|
55
|
+
/** POST /cli/delete-bugs */
|
|
56
|
+
export declare function deleteBugs(config: ApiClientConfig, paths: string[]): Promise<RemoteDeleteResponse>;
|
|
51
57
|
/** POST /cli/crs/:crId/applied */
|
|
52
58
|
export declare function markCRAppliedRemote(config: ApiClientConfig, crId: string): Promise<RemoteCRResponse>;
|
|
53
59
|
/** POST /cli/bugs/:bugId/resolved */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/remote/api-client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/remote/api-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,9 @@ exports.fetchPendingCRs = fetchPendingCRs;
|
|
|
9
9
|
exports.pushCRs = pushCRs;
|
|
10
10
|
exports.fetchOpenBugs = fetchOpenBugs;
|
|
11
11
|
exports.pushBugs = pushBugs;
|
|
12
|
+
exports.deleteDocs = deleteDocs;
|
|
13
|
+
exports.deleteCRs = deleteCRs;
|
|
14
|
+
exports.deleteBugs = deleteBugs;
|
|
12
15
|
exports.markCRAppliedRemote = markCRAppliedRemote;
|
|
13
16
|
exports.markBugResolvedRemote = markBugResolvedRemote;
|
|
14
17
|
exports.markDocEnriched = markDocEnriched;
|
|
@@ -166,6 +169,18 @@ async function fetchOpenBugs(config) {
|
|
|
166
169
|
async function pushBugs(config, bugs) {
|
|
167
170
|
return request(config, 'POST', '/cli/push-bugs', { bugs });
|
|
168
171
|
}
|
|
172
|
+
/** POST /cli/delete-docs */
|
|
173
|
+
async function deleteDocs(config, paths) {
|
|
174
|
+
return request(config, 'POST', '/cli/delete-docs', { paths });
|
|
175
|
+
}
|
|
176
|
+
/** POST /cli/delete-crs */
|
|
177
|
+
async function deleteCRs(config, paths) {
|
|
178
|
+
return request(config, 'POST', '/cli/delete-crs', { paths });
|
|
179
|
+
}
|
|
180
|
+
/** POST /cli/delete-bugs */
|
|
181
|
+
async function deleteBugs(config, paths) {
|
|
182
|
+
return request(config, 'POST', '/cli/delete-bugs', { paths });
|
|
183
|
+
}
|
|
169
184
|
/** POST /cli/crs/:crId/applied */
|
|
170
185
|
async function markCRAppliedRemote(config, crId) {
|
|
171
186
|
return request(config, 'POST', `/cli/crs/${crId}/applied`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/remote/api-client.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/remote/api-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-engine.d.ts","sourceRoot":"","sources":["../../src/remote/sync-engine.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EAEV,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EAElB,MAAM,YAAY,CAAC;AA4EpB,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;
|
|
1
|
+
{"version":3,"file":"sync-engine.d.ts","sourceRoot":"","sources":["../../src/remote/sync-engine.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EAEV,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EAElB,MAAM,YAAY,CAAC;AA4EpB,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAaD,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CA4M3F;AAID,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA2FxF;AAkBD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAsFnG;AAID,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAsFpG;AAID,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAexH;AAID,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAoCjG"}
|
|
@@ -88,6 +88,9 @@ function extractBody(rawMarkdown) {
|
|
|
88
88
|
const parsed = (0, gray_matter_1.default)(rawMarkdown);
|
|
89
89
|
return parsed.content.trim();
|
|
90
90
|
}
|
|
91
|
+
function isReseedPush(state, options) {
|
|
92
|
+
return state.needsReseed === true && !(options?.paths && options.paths.length > 0);
|
|
93
|
+
}
|
|
91
94
|
async function pushToRemote(root, options) {
|
|
92
95
|
const config = await (0, config_manager_js_1.readConfig)(root);
|
|
93
96
|
const api = (0, api_client_js_1.buildApiConfig)(config, options?.timeout);
|
|
@@ -96,6 +99,7 @@ async function pushToRemote(root, options) {
|
|
|
96
99
|
state.changeRequests = {};
|
|
97
100
|
if (!state.bugs)
|
|
98
101
|
state.bugs = {};
|
|
102
|
+
const reseedPush = isReseedPush(state, options);
|
|
99
103
|
let totalCreated = 0;
|
|
100
104
|
let totalUpdated = 0;
|
|
101
105
|
const allPushed = [];
|
|
@@ -104,9 +108,14 @@ async function pushToRemote(root, options) {
|
|
|
104
108
|
const toPush = files.filter((f) => {
|
|
105
109
|
if (options?.paths && options.paths.length > 0)
|
|
106
110
|
return options.paths.includes(f.relativePath);
|
|
111
|
+
if (reseedPush)
|
|
112
|
+
return true;
|
|
107
113
|
if (options?.all)
|
|
108
114
|
return true;
|
|
109
|
-
|
|
115
|
+
const tracked = state.documents[normalizePath(f.relativePath)];
|
|
116
|
+
if (!tracked)
|
|
117
|
+
return true;
|
|
118
|
+
return tracked.localHash !== f.hash;
|
|
110
119
|
});
|
|
111
120
|
if (toPush.length > 0) {
|
|
112
121
|
const documents = toPush.map((f) => ({
|
|
@@ -116,7 +125,7 @@ async function pushToRemote(root, options) {
|
|
|
116
125
|
}));
|
|
117
126
|
const result = await (0, api_client_js_1.pushDocs)(api, documents);
|
|
118
127
|
for (const doc of result.documents) {
|
|
119
|
-
const localPath = doc.path;
|
|
128
|
+
const localPath = normalizePath(doc.path);
|
|
120
129
|
const absPath = (0, node_path_1.resolve)(root, localPath);
|
|
121
130
|
const rawContent = (0, node_fs_1.existsSync)(absPath) ? await (0, promises_1.readFile)(absPath, 'utf-8') : '';
|
|
122
131
|
state.documents[localPath] = {
|
|
@@ -126,29 +135,31 @@ async function pushToRemote(root, options) {
|
|
|
126
135
|
lastSynced: new Date().toISOString(),
|
|
127
136
|
};
|
|
128
137
|
}
|
|
129
|
-
// Mark local files as synced (drafts are excluded — they need AI enrichment first)
|
|
130
|
-
for (const f of toPush) {
|
|
131
|
-
if (f.frontmatter.status === 'draft')
|
|
132
|
-
continue;
|
|
133
|
-
const absPath = (0, node_path_1.resolve)(root, f.relativePath);
|
|
134
|
-
const content = await (0, promises_1.readFile)(absPath, 'utf-8');
|
|
135
|
-
const updated = content.replace(/^status:\s*(new|changed)/m, 'status: synced');
|
|
136
|
-
if (updated !== content) {
|
|
137
|
-
await (0, promises_1.writeFile)(absPath, updated, 'utf-8');
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
138
|
totalCreated += result.created;
|
|
141
139
|
totalUpdated += result.updated;
|
|
142
140
|
allPushed.push(...toPush.map((f) => f.relativePath));
|
|
143
141
|
}
|
|
144
142
|
// ── Change Requests ────────────────────────────────────────────────────
|
|
145
143
|
const crFiles = await (0, cr_parser_js_1.parseAllCRFiles)(root);
|
|
144
|
+
const crHashes = new Map();
|
|
145
|
+
for (const cr of crFiles) {
|
|
146
|
+
const absPath = (0, node_path_1.resolve)(root, cr.relativePath);
|
|
147
|
+
const raw = (0, node_fs_1.existsSync)(absPath) ? await (0, promises_1.readFile)(absPath, 'utf-8') : '';
|
|
148
|
+
crHashes.set(normalizePath(cr.relativePath), sha256(raw));
|
|
149
|
+
}
|
|
146
150
|
const crsToPush = crFiles.filter((cr) => {
|
|
147
151
|
if (options?.paths && options.paths.length > 0)
|
|
148
152
|
return options.paths.includes(cr.relativePath);
|
|
153
|
+
if (reseedPush)
|
|
154
|
+
return true;
|
|
149
155
|
if (options?.all)
|
|
150
156
|
return true;
|
|
151
|
-
|
|
157
|
+
const key = normalizePath(cr.relativePath);
|
|
158
|
+
const tracked = state.changeRequests[key];
|
|
159
|
+
const localHash = crHashes.get(key);
|
|
160
|
+
if (!tracked || !localHash)
|
|
161
|
+
return true;
|
|
162
|
+
return tracked.localHash !== localHash;
|
|
152
163
|
});
|
|
153
164
|
if (crsToPush.length > 0) {
|
|
154
165
|
const crPayload = crsToPush.map((cr) => {
|
|
@@ -180,12 +191,25 @@ async function pushToRemote(root, options) {
|
|
|
180
191
|
}
|
|
181
192
|
// ── Bugs ───────────────────────────────────────────────────────────────
|
|
182
193
|
const bugFiles = await (0, bug_parser_js_1.parseAllBugFiles)(root);
|
|
194
|
+
const bugHashes = new Map();
|
|
195
|
+
for (const bug of bugFiles) {
|
|
196
|
+
const absPath = (0, node_path_1.resolve)(root, bug.relativePath);
|
|
197
|
+
const raw = (0, node_fs_1.existsSync)(absPath) ? await (0, promises_1.readFile)(absPath, 'utf-8') : '';
|
|
198
|
+
bugHashes.set(normalizePath(bug.relativePath), sha256(raw));
|
|
199
|
+
}
|
|
183
200
|
const bugsToPush = bugFiles.filter((bug) => {
|
|
184
201
|
if (options?.paths && options.paths.length > 0)
|
|
185
202
|
return options.paths.includes(bug.relativePath);
|
|
203
|
+
if (reseedPush)
|
|
204
|
+
return true;
|
|
186
205
|
if (options?.all)
|
|
187
206
|
return true;
|
|
188
|
-
|
|
207
|
+
const key = normalizePath(bug.relativePath);
|
|
208
|
+
const tracked = state.bugs[key];
|
|
209
|
+
const localHash = bugHashes.get(key);
|
|
210
|
+
if (!tracked || !localHash)
|
|
211
|
+
return true;
|
|
212
|
+
return tracked.localHash !== localHash;
|
|
189
213
|
});
|
|
190
214
|
if (bugsToPush.length > 0) {
|
|
191
215
|
const bugPayload = bugsToPush.map((bug) => {
|
|
@@ -215,13 +239,43 @@ async function pushToRemote(root, options) {
|
|
|
215
239
|
totalUpdated += bugResult.updated;
|
|
216
240
|
allPushed.push(...bugsToPush.map((bug) => bug.relativePath));
|
|
217
241
|
}
|
|
242
|
+
// ── Detect local deletions (tracked in state but missing from disk) ──
|
|
243
|
+
const allDeleted = [];
|
|
244
|
+
const deletedDocPaths = Object.keys(state.documents).filter((p) => !(0, node_fs_1.existsSync)((0, node_path_1.resolve)(root, p)));
|
|
245
|
+
if (deletedDocPaths.length > 0) {
|
|
246
|
+
await (0, api_client_js_1.deleteDocs)(api, deletedDocPaths);
|
|
247
|
+
for (const p of deletedDocPaths) {
|
|
248
|
+
delete state.documents[p];
|
|
249
|
+
}
|
|
250
|
+
allDeleted.push(...deletedDocPaths);
|
|
251
|
+
}
|
|
252
|
+
const deletedCRPaths = Object.keys(state.changeRequests).filter((p) => !(0, node_fs_1.existsSync)((0, node_path_1.resolve)(root, p)));
|
|
253
|
+
if (deletedCRPaths.length > 0) {
|
|
254
|
+
await (0, api_client_js_1.deleteCRs)(api, deletedCRPaths);
|
|
255
|
+
for (const p of deletedCRPaths) {
|
|
256
|
+
delete state.changeRequests[p];
|
|
257
|
+
}
|
|
258
|
+
allDeleted.push(...deletedCRPaths);
|
|
259
|
+
}
|
|
260
|
+
const deletedBugPaths = Object.keys(state.bugs).filter((p) => !(0, node_fs_1.existsSync)((0, node_path_1.resolve)(root, p)));
|
|
261
|
+
if (deletedBugPaths.length > 0) {
|
|
262
|
+
await (0, api_client_js_1.deleteBugs)(api, deletedBugPaths);
|
|
263
|
+
for (const p of deletedBugPaths) {
|
|
264
|
+
delete state.bugs[p];
|
|
265
|
+
}
|
|
266
|
+
allDeleted.push(...deletedBugPaths);
|
|
267
|
+
}
|
|
218
268
|
// ── Finalize ───────────────────────────────────────────────────────────
|
|
219
269
|
state.lastPush = new Date().toISOString();
|
|
270
|
+
if (reseedPush) {
|
|
271
|
+
state.needsReseed = false;
|
|
272
|
+
}
|
|
220
273
|
await (0, state_js_1.writeRemoteState)(root, state);
|
|
221
274
|
return {
|
|
222
275
|
created: totalCreated,
|
|
223
276
|
updated: totalUpdated,
|
|
224
277
|
pushed: allPushed,
|
|
278
|
+
deleted: allDeleted,
|
|
225
279
|
};
|
|
226
280
|
}
|
|
227
281
|
// ─── Pull Documents ──────────────────────────────────────────────────────
|
|
@@ -232,7 +286,35 @@ async function pullFromRemote(root, timeout) {
|
|
|
232
286
|
const state = await (0, state_js_1.readRemoteState)(root);
|
|
233
287
|
const created = [];
|
|
234
288
|
const updated = [];
|
|
289
|
+
const deleted = [];
|
|
235
290
|
const conflicts = [];
|
|
291
|
+
// Detect remote deletions: tracked locally but not in remote response
|
|
292
|
+
const remotePathSet = new Set(remoteDocs.map((d) => d.path));
|
|
293
|
+
for (const [localPath, tracked] of Object.entries(state.documents)) {
|
|
294
|
+
if (!remotePathSet.has(localPath)) {
|
|
295
|
+
// File was deleted on remote — check if locally modified
|
|
296
|
+
const absPath = (0, node_path_1.resolve)(root, localPath);
|
|
297
|
+
if ((0, node_fs_1.existsSync)(absPath)) {
|
|
298
|
+
const localRaw = await (0, promises_1.readFile)(absPath, 'utf-8');
|
|
299
|
+
const localHash = sha256(localRaw);
|
|
300
|
+
if (localHash !== tracked.localHash) {
|
|
301
|
+
// Locally modified but deleted on remote → conflict
|
|
302
|
+
conflicts.push({
|
|
303
|
+
path: localPath,
|
|
304
|
+
localVersion: tracked.remoteVersion.toString(),
|
|
305
|
+
remoteVersion: 0,
|
|
306
|
+
reason: 'File modified locally but deleted on remote',
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
// Not modified locally → safe to delete
|
|
311
|
+
await (0, promises_1.unlink)(absPath);
|
|
312
|
+
deleted.push(localPath);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
delete state.documents[localPath];
|
|
316
|
+
}
|
|
317
|
+
}
|
|
236
318
|
for (const doc of remoteDocs) {
|
|
237
319
|
const localPath = doc.path;
|
|
238
320
|
const absPath = (0, node_path_1.resolve)(root, localPath);
|
|
@@ -272,9 +354,7 @@ async function pullFromRemote(root, timeout) {
|
|
|
272
354
|
}
|
|
273
355
|
else {
|
|
274
356
|
// Only remote body changed — surgically replace body, preserve frontmatter
|
|
275
|
-
const
|
|
276
|
-
let updatedContent = replaceBody(localRaw, doc.content);
|
|
277
|
-
updatedContent = updatedContent.replace(/^status:\s*.+/m, `status: ${newStatus}`);
|
|
357
|
+
const updatedContent = replaceBody(localRaw, doc.content);
|
|
278
358
|
await (0, promises_1.writeFile)(absPath, updatedContent, 'utf-8');
|
|
279
359
|
updated.push(localPath);
|
|
280
360
|
updateDocState(state, doc, localPath, updatedContent);
|
|
@@ -283,7 +363,7 @@ async function pullFromRemote(root, timeout) {
|
|
|
283
363
|
}
|
|
284
364
|
state.lastPull = new Date().toISOString();
|
|
285
365
|
await (0, state_js_1.writeRemoteState)(root, state);
|
|
286
|
-
return { created, updated, conflicts };
|
|
366
|
+
return { created, updated, deleted, conflicts };
|
|
287
367
|
}
|
|
288
368
|
function updateDocState(state, doc, localPath, markdownContent) {
|
|
289
369
|
state.documents[localPath] = {
|
|
@@ -308,6 +388,23 @@ async function pullCRsFromRemote(root, timeout) {
|
|
|
308
388
|
}
|
|
309
389
|
let created = 0;
|
|
310
390
|
let updated = 0;
|
|
391
|
+
let deletedCount = 0;
|
|
392
|
+
// Detect remote deletions: tracked locally but not in remote response
|
|
393
|
+
const remoteCRIdSet = new Set(remoteCRs.map((cr) => cr.id));
|
|
394
|
+
for (const [localPath, tracked] of Object.entries(state.changeRequests)) {
|
|
395
|
+
if (!remoteCRIdSet.has(tracked.remoteId)) {
|
|
396
|
+
const absPath = (0, node_path_1.resolve)(root, localPath);
|
|
397
|
+
if ((0, node_fs_1.existsSync)(absPath)) {
|
|
398
|
+
const localRaw = await (0, promises_1.readFile)(absPath, 'utf-8');
|
|
399
|
+
const localHash = sha256(localRaw);
|
|
400
|
+
if (localHash === tracked.localHash) {
|
|
401
|
+
await (0, promises_1.unlink)(absPath);
|
|
402
|
+
deletedCount++;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
delete state.changeRequests[localPath];
|
|
406
|
+
}
|
|
407
|
+
}
|
|
311
408
|
for (const cr of remoteCRs) {
|
|
312
409
|
const localPath = cr.path ?? idToPath.get(cr.id) ?? `change-requests/CR-${cr.id.substring(0, 8)}.md`;
|
|
313
410
|
const absPath = (0, node_path_1.resolve)(root, localPath);
|
|
@@ -330,9 +427,7 @@ async function pullCRsFromRemote(root, timeout) {
|
|
|
330
427
|
continue;
|
|
331
428
|
}
|
|
332
429
|
// Body changed — update body, preserve frontmatter
|
|
333
|
-
const
|
|
334
|
-
let updatedContent = replaceBody(localRaw, cr.body);
|
|
335
|
-
updatedContent = updatedContent.replace(/^status:\s*.+/m, `status: ${newStatus}`);
|
|
430
|
+
const updatedContent = replaceBody(localRaw, cr.body);
|
|
336
431
|
await (0, promises_1.writeFile)(absPath, updatedContent, 'utf-8');
|
|
337
432
|
updated++;
|
|
338
433
|
state.changeRequests[normalizePath(localPath)] = {
|
|
@@ -355,7 +450,7 @@ async function pullCRsFromRemote(root, timeout) {
|
|
|
355
450
|
}
|
|
356
451
|
}
|
|
357
452
|
await (0, state_js_1.writeRemoteState)(root, state);
|
|
358
|
-
return { created, updated };
|
|
453
|
+
return { created, updated, deleted: deletedCount };
|
|
359
454
|
}
|
|
360
455
|
// ─── Pull Bugs ───────────────────────────────────────────────────────────
|
|
361
456
|
async function pullBugsFromRemote(root, timeout) {
|
|
@@ -372,6 +467,23 @@ async function pullBugsFromRemote(root, timeout) {
|
|
|
372
467
|
}
|
|
373
468
|
let created = 0;
|
|
374
469
|
let updated = 0;
|
|
470
|
+
let deletedCount = 0;
|
|
471
|
+
// Detect remote deletions: tracked locally but not in remote response
|
|
472
|
+
const remoteBugIdSet = new Set(remoteBugs.map((b) => b.id));
|
|
473
|
+
for (const [localPath, tracked] of Object.entries(state.bugs)) {
|
|
474
|
+
if (!remoteBugIdSet.has(tracked.remoteId)) {
|
|
475
|
+
const absPath = (0, node_path_1.resolve)(root, localPath);
|
|
476
|
+
if ((0, node_fs_1.existsSync)(absPath)) {
|
|
477
|
+
const localRaw = await (0, promises_1.readFile)(absPath, 'utf-8');
|
|
478
|
+
const localHash = sha256(localRaw);
|
|
479
|
+
if (localHash === tracked.localHash) {
|
|
480
|
+
await (0, promises_1.unlink)(absPath);
|
|
481
|
+
deletedCount++;
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
delete state.bugs[localPath];
|
|
485
|
+
}
|
|
486
|
+
}
|
|
375
487
|
for (const bug of remoteBugs) {
|
|
376
488
|
const localPath = bug.path ?? idToPath.get(bug.id) ?? `bugs/BUG-${bug.id.substring(0, 8)}.md`;
|
|
377
489
|
const absPath = (0, node_path_1.resolve)(root, localPath);
|
|
@@ -394,9 +506,7 @@ async function pullBugsFromRemote(root, timeout) {
|
|
|
394
506
|
continue;
|
|
395
507
|
}
|
|
396
508
|
// Body changed — update body, preserve frontmatter
|
|
397
|
-
const
|
|
398
|
-
let updatedContent = replaceBody(localRaw, bug.body);
|
|
399
|
-
updatedContent = updatedContent.replace(/^status:\s*.+/m, `status: ${newStatus}`);
|
|
509
|
+
const updatedContent = replaceBody(localRaw, bug.body);
|
|
400
510
|
await (0, promises_1.writeFile)(absPath, updatedContent, 'utf-8');
|
|
401
511
|
updated++;
|
|
402
512
|
state.bugs[normalizePath(localPath)] = {
|
|
@@ -419,15 +529,20 @@ async function pullBugsFromRemote(root, timeout) {
|
|
|
419
529
|
}
|
|
420
530
|
}
|
|
421
531
|
await (0, state_js_1.writeRemoteState)(root, state);
|
|
422
|
-
return { created, updated };
|
|
532
|
+
return { created, updated, deleted: deletedCount };
|
|
423
533
|
}
|
|
424
534
|
// ─── Reset Remote ────────────────────────────────────────────────────────
|
|
425
535
|
async function resetRemoteProject(root, confirmSlug, timeout) {
|
|
426
536
|
const config = await (0, config_manager_js_1.readConfig)(root);
|
|
427
537
|
const api = (0, api_client_js_1.buildApiConfig)(config, timeout);
|
|
428
538
|
const result = await (0, api_client_js_1.resetProject)(api, confirmSlug);
|
|
429
|
-
// Clear local remote state
|
|
430
|
-
await (0, state_js_1.writeRemoteState)(root, {
|
|
539
|
+
// Clear local remote state and mark the project for a full reseed on the next push.
|
|
540
|
+
await (0, state_js_1.writeRemoteState)(root, {
|
|
541
|
+
needsReseed: true,
|
|
542
|
+
documents: {},
|
|
543
|
+
changeRequests: {},
|
|
544
|
+
bugs: {},
|
|
545
|
+
});
|
|
431
546
|
return result;
|
|
432
547
|
}
|
|
433
548
|
// ─── Remote Status ───────────────────────────────────────────────────────
|
|
@@ -437,7 +552,15 @@ async function getRemoteStatus(root, timeout) {
|
|
|
437
552
|
return { configured: false, url: null, connected: false, localPending: 0, remoteDocs: 0 };
|
|
438
553
|
}
|
|
439
554
|
const files = await (0, story_parser_js_1.parseAllStoryFiles)(root);
|
|
440
|
-
const
|
|
555
|
+
const state = await (0, state_js_1.readRemoteState)(root);
|
|
556
|
+
const localPending = state.needsReseed
|
|
557
|
+
? files.length
|
|
558
|
+
: files.filter((f) => {
|
|
559
|
+
const tracked = state.documents[normalizePath(f.relativePath)];
|
|
560
|
+
if (!tracked)
|
|
561
|
+
return true;
|
|
562
|
+
return tracked.localHash !== f.hash;
|
|
563
|
+
}).length;
|
|
441
564
|
try {
|
|
442
565
|
const api = (0, api_client_js_1.buildApiConfig)(config, timeout);
|
|
443
566
|
const docs = await (0, api_client_js_1.pullDocs)(api);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-engine.js","sourceRoot":"","sources":["../../src/remote/sync-engine.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sync-engine.js","sourceRoot":"","sources":["../../src/remote/sync-engine.ts"],"names":[],"mappings":"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"}
|
package/dist/remote/types.d.ts
CHANGED
|
@@ -76,15 +76,22 @@ export interface RemoteEntityState {
|
|
|
76
76
|
export interface RemoteState {
|
|
77
77
|
lastPull?: string;
|
|
78
78
|
lastPush?: string;
|
|
79
|
+
needsReseed?: boolean;
|
|
79
80
|
documents: Record<string, RemoteDocState>;
|
|
80
81
|
changeRequests?: Record<string, RemoteEntityState>;
|
|
81
82
|
bugs?: Record<string, RemoteEntityState>;
|
|
82
83
|
}
|
|
84
|
+
/** Response from delete endpoints */
|
|
85
|
+
export interface RemoteDeleteResponse {
|
|
86
|
+
deleted: number;
|
|
87
|
+
paths: string[];
|
|
88
|
+
}
|
|
83
89
|
/** Result of a push operation */
|
|
84
90
|
export interface PushResult {
|
|
85
91
|
created: number;
|
|
86
92
|
updated: number;
|
|
87
93
|
pushed: string[];
|
|
94
|
+
deleted: string[];
|
|
88
95
|
}
|
|
89
96
|
/** A conflict detected during pull */
|
|
90
97
|
export interface PullConflict {
|
|
@@ -97,12 +104,14 @@ export interface PullConflict {
|
|
|
97
104
|
export interface PullResult {
|
|
98
105
|
created: string[];
|
|
99
106
|
updated: string[];
|
|
107
|
+
deleted: string[];
|
|
100
108
|
conflicts: PullConflict[];
|
|
101
109
|
}
|
|
102
110
|
/** Result of a pull CRs/Bugs operation */
|
|
103
111
|
export interface PullEntitiesResult {
|
|
104
112
|
created: number;
|
|
105
113
|
updated: number;
|
|
114
|
+
deleted: number;
|
|
106
115
|
}
|
|
107
116
|
/** Result of remote status check */
|
|
108
117
|
export interface RemoteStatusResult {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/remote/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/remote/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/remote/api-client.ts
CHANGED
|
@@ -7,6 +7,7 @@ import type {
|
|
|
7
7
|
RemoteCRBulkResponse,
|
|
8
8
|
RemoteBugResponse,
|
|
9
9
|
RemoteBugBulkResponse,
|
|
10
|
+
RemoteDeleteResponse,
|
|
10
11
|
RemoteResetResult,
|
|
11
12
|
} from './types.js';
|
|
12
13
|
|
|
@@ -204,6 +205,30 @@ export async function pushBugs(
|
|
|
204
205
|
return request<RemoteBugBulkResponse>(config, 'POST', '/cli/push-bugs', { bugs });
|
|
205
206
|
}
|
|
206
207
|
|
|
208
|
+
/** POST /cli/delete-docs */
|
|
209
|
+
export async function deleteDocs(
|
|
210
|
+
config: ApiClientConfig,
|
|
211
|
+
paths: string[],
|
|
212
|
+
): Promise<RemoteDeleteResponse> {
|
|
213
|
+
return request<RemoteDeleteResponse>(config, 'POST', '/cli/delete-docs', { paths });
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/** POST /cli/delete-crs */
|
|
217
|
+
export async function deleteCRs(
|
|
218
|
+
config: ApiClientConfig,
|
|
219
|
+
paths: string[],
|
|
220
|
+
): Promise<RemoteDeleteResponse> {
|
|
221
|
+
return request<RemoteDeleteResponse>(config, 'POST', '/cli/delete-crs', { paths });
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/** POST /cli/delete-bugs */
|
|
225
|
+
export async function deleteBugs(
|
|
226
|
+
config: ApiClientConfig,
|
|
227
|
+
paths: string[],
|
|
228
|
+
): Promise<RemoteDeleteResponse> {
|
|
229
|
+
return request<RemoteDeleteResponse>(config, 'POST', '/cli/delete-bugs', { paths });
|
|
230
|
+
}
|
|
231
|
+
|
|
207
232
|
/** POST /cli/crs/:crId/applied */
|
|
208
233
|
export async function markCRAppliedRemote(
|
|
209
234
|
config: ApiClientConfig,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
1
|
+
import { readFile, writeFile, mkdir, unlink } from 'node:fs/promises';
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
3
|
import { resolve, dirname, posix } from 'node:path';
|
|
4
4
|
import { createHash } from 'node:crypto';
|
|
@@ -8,7 +8,7 @@ import { readConfig } from '../config/config-manager.js';
|
|
|
8
8
|
import { parseAllStoryFiles } from '../parser/story-parser.js';
|
|
9
9
|
import { parseAllCRFiles } from '../parser/cr-parser.js';
|
|
10
10
|
import { parseAllBugFiles } from '../parser/bug-parser.js';
|
|
11
|
-
import { buildApiConfig, pullDocs, pushDocs, pushCRs, pushBugs, fetchPendingCRs, fetchOpenBugs, resetProject } from './api-client.js';
|
|
11
|
+
import { buildApiConfig, pullDocs, pushDocs, pushCRs, pushBugs, deleteDocs, deleteCRs, deleteBugs, fetchPendingCRs, fetchOpenBugs, resetProject } from './api-client.js';
|
|
12
12
|
import { readRemoteState, writeRemoteState } from './state.js';
|
|
13
13
|
import type {
|
|
14
14
|
PushResult,
|
|
@@ -100,12 +100,24 @@ export interface PushOptions {
|
|
|
100
100
|
timeout?: number;
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
+
function isReseedPush(state: RemoteStatusTrackingState, options?: PushOptions): boolean {
|
|
104
|
+
return state.needsReseed === true && !(options?.paths && options.paths.length > 0);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
type RemoteStatusTrackingState = {
|
|
108
|
+
needsReseed?: boolean;
|
|
109
|
+
documents: Record<string, { remoteId: string; remoteVersion: number; localHash: string; lastSynced: string }>;
|
|
110
|
+
changeRequests?: Record<string, { remoteId: string; localHash: string; lastSynced: string }>;
|
|
111
|
+
bugs?: Record<string, { remoteId: string; localHash: string; lastSynced: string }>;
|
|
112
|
+
};
|
|
113
|
+
|
|
103
114
|
export async function pushToRemote(root: string, options?: PushOptions): Promise<PushResult> {
|
|
104
115
|
const config = await readConfig(root);
|
|
105
116
|
const api = buildApiConfig(config, options?.timeout);
|
|
106
117
|
const state = await readRemoteState(root);
|
|
107
118
|
if (!state.changeRequests) state.changeRequests = {};
|
|
108
119
|
if (!state.bugs) state.bugs = {};
|
|
120
|
+
const reseedPush = isReseedPush(state, options);
|
|
109
121
|
|
|
110
122
|
let totalCreated = 0;
|
|
111
123
|
let totalUpdated = 0;
|
|
@@ -115,8 +127,11 @@ export async function pushToRemote(root: string, options?: PushOptions): Promise
|
|
|
115
127
|
const files = await parseAllStoryFiles(root);
|
|
116
128
|
const toPush = files.filter((f) => {
|
|
117
129
|
if (options?.paths && options.paths.length > 0) return options.paths.includes(f.relativePath);
|
|
130
|
+
if (reseedPush) return true;
|
|
118
131
|
if (options?.all) return true;
|
|
119
|
-
|
|
132
|
+
const tracked = state.documents[normalizePath(f.relativePath)];
|
|
133
|
+
if (!tracked) return true;
|
|
134
|
+
return tracked.localHash !== f.hash;
|
|
120
135
|
});
|
|
121
136
|
|
|
122
137
|
if (toPush.length > 0) {
|
|
@@ -129,7 +144,7 @@ export async function pushToRemote(root: string, options?: PushOptions): Promise
|
|
|
129
144
|
const result = await pushDocs(api, documents);
|
|
130
145
|
|
|
131
146
|
for (const doc of result.documents) {
|
|
132
|
-
const localPath = doc.path;
|
|
147
|
+
const localPath = normalizePath(doc.path);
|
|
133
148
|
const absPath = resolve(root, localPath);
|
|
134
149
|
const rawContent = existsSync(absPath) ? await readFile(absPath, 'utf-8') : '';
|
|
135
150
|
state.documents[localPath] = {
|
|
@@ -140,17 +155,6 @@ export async function pushToRemote(root: string, options?: PushOptions): Promise
|
|
|
140
155
|
};
|
|
141
156
|
}
|
|
142
157
|
|
|
143
|
-
// Mark local files as synced (drafts are excluded — they need AI enrichment first)
|
|
144
|
-
for (const f of toPush) {
|
|
145
|
-
if (f.frontmatter.status === 'draft') continue;
|
|
146
|
-
const absPath = resolve(root, f.relativePath);
|
|
147
|
-
const content = await readFile(absPath, 'utf-8');
|
|
148
|
-
const updated = content.replace(/^status:\s*(new|changed)/m, 'status: synced');
|
|
149
|
-
if (updated !== content) {
|
|
150
|
-
await writeFile(absPath, updated, 'utf-8');
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
158
|
totalCreated += result.created;
|
|
155
159
|
totalUpdated += result.updated;
|
|
156
160
|
allPushed.push(...toPush.map((f) => f.relativePath));
|
|
@@ -158,10 +162,21 @@ export async function pushToRemote(root: string, options?: PushOptions): Promise
|
|
|
158
162
|
|
|
159
163
|
// ── Change Requests ────────────────────────────────────────────────────
|
|
160
164
|
const crFiles = await parseAllCRFiles(root);
|
|
165
|
+
const crHashes = new Map<string, string>();
|
|
166
|
+
for (const cr of crFiles) {
|
|
167
|
+
const absPath = resolve(root, cr.relativePath);
|
|
168
|
+
const raw = existsSync(absPath) ? await readFile(absPath, 'utf-8') : '';
|
|
169
|
+
crHashes.set(normalizePath(cr.relativePath), sha256(raw));
|
|
170
|
+
}
|
|
161
171
|
const crsToPush = crFiles.filter((cr) => {
|
|
162
172
|
if (options?.paths && options.paths.length > 0) return options.paths.includes(cr.relativePath);
|
|
173
|
+
if (reseedPush) return true;
|
|
163
174
|
if (options?.all) return true;
|
|
164
|
-
|
|
175
|
+
const key = normalizePath(cr.relativePath);
|
|
176
|
+
const tracked = state.changeRequests![key];
|
|
177
|
+
const localHash = crHashes.get(key);
|
|
178
|
+
if (!tracked || !localHash) return true;
|
|
179
|
+
return tracked.localHash !== localHash;
|
|
165
180
|
});
|
|
166
181
|
|
|
167
182
|
if (crsToPush.length > 0) {
|
|
@@ -200,10 +215,21 @@ export async function pushToRemote(root: string, options?: PushOptions): Promise
|
|
|
200
215
|
|
|
201
216
|
// ── Bugs ───────────────────────────────────────────────────────────────
|
|
202
217
|
const bugFiles = await parseAllBugFiles(root);
|
|
218
|
+
const bugHashes = new Map<string, string>();
|
|
219
|
+
for (const bug of bugFiles) {
|
|
220
|
+
const absPath = resolve(root, bug.relativePath);
|
|
221
|
+
const raw = existsSync(absPath) ? await readFile(absPath, 'utf-8') : '';
|
|
222
|
+
bugHashes.set(normalizePath(bug.relativePath), sha256(raw));
|
|
223
|
+
}
|
|
203
224
|
const bugsToPush = bugFiles.filter((bug) => {
|
|
204
225
|
if (options?.paths && options.paths.length > 0) return options.paths.includes(bug.relativePath);
|
|
226
|
+
if (reseedPush) return true;
|
|
205
227
|
if (options?.all) return true;
|
|
206
|
-
|
|
228
|
+
const key = normalizePath(bug.relativePath);
|
|
229
|
+
const tracked = state.bugs![key];
|
|
230
|
+
const localHash = bugHashes.get(key);
|
|
231
|
+
if (!tracked || !localHash) return true;
|
|
232
|
+
return tracked.localHash !== localHash;
|
|
207
233
|
});
|
|
208
234
|
|
|
209
235
|
if (bugsToPush.length > 0) {
|
|
@@ -240,14 +266,54 @@ export async function pushToRemote(root: string, options?: PushOptions): Promise
|
|
|
240
266
|
allPushed.push(...bugsToPush.map((bug) => bug.relativePath));
|
|
241
267
|
}
|
|
242
268
|
|
|
269
|
+
// ── Detect local deletions (tracked in state but missing from disk) ──
|
|
270
|
+
const allDeleted: string[] = [];
|
|
271
|
+
|
|
272
|
+
const deletedDocPaths = Object.keys(state.documents).filter(
|
|
273
|
+
(p) => !existsSync(resolve(root, p)),
|
|
274
|
+
);
|
|
275
|
+
if (deletedDocPaths.length > 0) {
|
|
276
|
+
await deleteDocs(api, deletedDocPaths);
|
|
277
|
+
for (const p of deletedDocPaths) {
|
|
278
|
+
delete state.documents[p];
|
|
279
|
+
}
|
|
280
|
+
allDeleted.push(...deletedDocPaths);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
const deletedCRPaths = Object.keys(state.changeRequests!).filter(
|
|
284
|
+
(p) => !existsSync(resolve(root, p)),
|
|
285
|
+
);
|
|
286
|
+
if (deletedCRPaths.length > 0) {
|
|
287
|
+
await deleteCRs(api, deletedCRPaths);
|
|
288
|
+
for (const p of deletedCRPaths) {
|
|
289
|
+
delete state.changeRequests![p];
|
|
290
|
+
}
|
|
291
|
+
allDeleted.push(...deletedCRPaths);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
const deletedBugPaths = Object.keys(state.bugs!).filter(
|
|
295
|
+
(p) => !existsSync(resolve(root, p)),
|
|
296
|
+
);
|
|
297
|
+
if (deletedBugPaths.length > 0) {
|
|
298
|
+
await deleteBugs(api, deletedBugPaths);
|
|
299
|
+
for (const p of deletedBugPaths) {
|
|
300
|
+
delete state.bugs![p];
|
|
301
|
+
}
|
|
302
|
+
allDeleted.push(...deletedBugPaths);
|
|
303
|
+
}
|
|
304
|
+
|
|
243
305
|
// ── Finalize ───────────────────────────────────────────────────────────
|
|
244
306
|
state.lastPush = new Date().toISOString();
|
|
307
|
+
if (reseedPush) {
|
|
308
|
+
state.needsReseed = false;
|
|
309
|
+
}
|
|
245
310
|
await writeRemoteState(root, state);
|
|
246
311
|
|
|
247
312
|
return {
|
|
248
313
|
created: totalCreated,
|
|
249
314
|
updated: totalUpdated,
|
|
250
315
|
pushed: allPushed,
|
|
316
|
+
deleted: allDeleted,
|
|
251
317
|
};
|
|
252
318
|
}
|
|
253
319
|
|
|
@@ -262,8 +328,36 @@ export async function pullFromRemote(root: string, timeout?: number): Promise<Pu
|
|
|
262
328
|
|
|
263
329
|
const created: string[] = [];
|
|
264
330
|
const updated: string[] = [];
|
|
331
|
+
const deleted: string[] = [];
|
|
265
332
|
const conflicts: PullConflict[] = [];
|
|
266
333
|
|
|
334
|
+
// Detect remote deletions: tracked locally but not in remote response
|
|
335
|
+
const remotePathSet = new Set(remoteDocs.map((d) => d.path));
|
|
336
|
+
for (const [localPath, tracked] of Object.entries(state.documents)) {
|
|
337
|
+
if (!remotePathSet.has(localPath)) {
|
|
338
|
+
// File was deleted on remote — check if locally modified
|
|
339
|
+
const absPath = resolve(root, localPath);
|
|
340
|
+
if (existsSync(absPath)) {
|
|
341
|
+
const localRaw = await readFile(absPath, 'utf-8');
|
|
342
|
+
const localHash = sha256(localRaw);
|
|
343
|
+
if (localHash !== tracked.localHash) {
|
|
344
|
+
// Locally modified but deleted on remote → conflict
|
|
345
|
+
conflicts.push({
|
|
346
|
+
path: localPath,
|
|
347
|
+
localVersion: tracked.remoteVersion.toString(),
|
|
348
|
+
remoteVersion: 0,
|
|
349
|
+
reason: 'File modified locally but deleted on remote',
|
|
350
|
+
});
|
|
351
|
+
} else {
|
|
352
|
+
// Not modified locally → safe to delete
|
|
353
|
+
await unlink(absPath);
|
|
354
|
+
deleted.push(localPath);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
delete state.documents[localPath];
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
267
361
|
for (const doc of remoteDocs) {
|
|
268
362
|
const localPath = doc.path;
|
|
269
363
|
const absPath = resolve(root, localPath);
|
|
@@ -304,9 +398,7 @@ export async function pullFromRemote(root: string, timeout?: number): Promise<Pu
|
|
|
304
398
|
});
|
|
305
399
|
} else {
|
|
306
400
|
// Only remote body changed — surgically replace body, preserve frontmatter
|
|
307
|
-
const
|
|
308
|
-
let updatedContent = replaceBody(localRaw, doc.content);
|
|
309
|
-
updatedContent = updatedContent.replace(/^status:\s*.+/m, `status: ${newStatus}`);
|
|
401
|
+
const updatedContent = replaceBody(localRaw, doc.content);
|
|
310
402
|
await writeFile(absPath, updatedContent, 'utf-8');
|
|
311
403
|
updated.push(localPath);
|
|
312
404
|
updateDocState(state, doc, localPath, updatedContent);
|
|
@@ -317,7 +409,7 @@ export async function pullFromRemote(root: string, timeout?: number): Promise<Pu
|
|
|
317
409
|
state.lastPull = new Date().toISOString();
|
|
318
410
|
await writeRemoteState(root, state);
|
|
319
411
|
|
|
320
|
-
return { created, updated, conflicts };
|
|
412
|
+
return { created, updated, deleted, conflicts };
|
|
321
413
|
}
|
|
322
414
|
|
|
323
415
|
function updateDocState(
|
|
@@ -352,6 +444,24 @@ export async function pullCRsFromRemote(root: string, timeout?: number): Promise
|
|
|
352
444
|
|
|
353
445
|
let created = 0;
|
|
354
446
|
let updated = 0;
|
|
447
|
+
let deletedCount = 0;
|
|
448
|
+
|
|
449
|
+
// Detect remote deletions: tracked locally but not in remote response
|
|
450
|
+
const remoteCRIdSet = new Set(remoteCRs.map((cr) => cr.id));
|
|
451
|
+
for (const [localPath, tracked] of Object.entries(state.changeRequests!)) {
|
|
452
|
+
if (!remoteCRIdSet.has(tracked.remoteId)) {
|
|
453
|
+
const absPath = resolve(root, localPath);
|
|
454
|
+
if (existsSync(absPath)) {
|
|
455
|
+
const localRaw = await readFile(absPath, 'utf-8');
|
|
456
|
+
const localHash = sha256(localRaw);
|
|
457
|
+
if (localHash === tracked.localHash) {
|
|
458
|
+
await unlink(absPath);
|
|
459
|
+
deletedCount++;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
delete state.changeRequests![localPath];
|
|
463
|
+
}
|
|
464
|
+
}
|
|
355
465
|
|
|
356
466
|
for (const cr of remoteCRs) {
|
|
357
467
|
const localPath = cr.path ?? idToPath.get(cr.id) ?? `change-requests/CR-${cr.id.substring(0, 8)}.md`;
|
|
@@ -378,9 +488,7 @@ export async function pullCRsFromRemote(root: string, timeout?: number): Promise
|
|
|
378
488
|
}
|
|
379
489
|
|
|
380
490
|
// Body changed — update body, preserve frontmatter
|
|
381
|
-
const
|
|
382
|
-
let updatedContent = replaceBody(localRaw, cr.body);
|
|
383
|
-
updatedContent = updatedContent.replace(/^status:\s*.+/m, `status: ${newStatus}`);
|
|
491
|
+
const updatedContent = replaceBody(localRaw, cr.body);
|
|
384
492
|
await writeFile(absPath, updatedContent, 'utf-8');
|
|
385
493
|
updated++;
|
|
386
494
|
|
|
@@ -405,7 +513,7 @@ export async function pullCRsFromRemote(root: string, timeout?: number): Promise
|
|
|
405
513
|
}
|
|
406
514
|
|
|
407
515
|
await writeRemoteState(root, state);
|
|
408
|
-
return { created, updated };
|
|
516
|
+
return { created, updated, deleted: deletedCount };
|
|
409
517
|
}
|
|
410
518
|
|
|
411
519
|
// ─── Pull Bugs ───────────────────────────────────────────────────────────
|
|
@@ -426,6 +534,24 @@ export async function pullBugsFromRemote(root: string, timeout?: number): Promis
|
|
|
426
534
|
|
|
427
535
|
let created = 0;
|
|
428
536
|
let updated = 0;
|
|
537
|
+
let deletedCount = 0;
|
|
538
|
+
|
|
539
|
+
// Detect remote deletions: tracked locally but not in remote response
|
|
540
|
+
const remoteBugIdSet = new Set(remoteBugs.map((b) => b.id));
|
|
541
|
+
for (const [localPath, tracked] of Object.entries(state.bugs!)) {
|
|
542
|
+
if (!remoteBugIdSet.has(tracked.remoteId)) {
|
|
543
|
+
const absPath = resolve(root, localPath);
|
|
544
|
+
if (existsSync(absPath)) {
|
|
545
|
+
const localRaw = await readFile(absPath, 'utf-8');
|
|
546
|
+
const localHash = sha256(localRaw);
|
|
547
|
+
if (localHash === tracked.localHash) {
|
|
548
|
+
await unlink(absPath);
|
|
549
|
+
deletedCount++;
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
delete state.bugs![localPath];
|
|
553
|
+
}
|
|
554
|
+
}
|
|
429
555
|
|
|
430
556
|
for (const bug of remoteBugs) {
|
|
431
557
|
const localPath = bug.path ?? idToPath.get(bug.id) ?? `bugs/BUG-${bug.id.substring(0, 8)}.md`;
|
|
@@ -452,9 +578,7 @@ export async function pullBugsFromRemote(root: string, timeout?: number): Promis
|
|
|
452
578
|
}
|
|
453
579
|
|
|
454
580
|
// Body changed — update body, preserve frontmatter
|
|
455
|
-
const
|
|
456
|
-
let updatedContent = replaceBody(localRaw, bug.body);
|
|
457
|
-
updatedContent = updatedContent.replace(/^status:\s*.+/m, `status: ${newStatus}`);
|
|
581
|
+
const updatedContent = replaceBody(localRaw, bug.body);
|
|
458
582
|
await writeFile(absPath, updatedContent, 'utf-8');
|
|
459
583
|
updated++;
|
|
460
584
|
|
|
@@ -479,7 +603,7 @@ export async function pullBugsFromRemote(root: string, timeout?: number): Promis
|
|
|
479
603
|
}
|
|
480
604
|
|
|
481
605
|
await writeRemoteState(root, state);
|
|
482
|
-
return { created, updated };
|
|
606
|
+
return { created, updated, deleted: deletedCount };
|
|
483
607
|
}
|
|
484
608
|
|
|
485
609
|
// ─── Reset Remote ────────────────────────────────────────────────────────
|
|
@@ -490,8 +614,13 @@ export async function resetRemoteProject(root: string, confirmSlug: string, time
|
|
|
490
614
|
|
|
491
615
|
const result = await resetProject(api, confirmSlug);
|
|
492
616
|
|
|
493
|
-
// Clear local remote state
|
|
494
|
-
await writeRemoteState(root, {
|
|
617
|
+
// Clear local remote state and mark the project for a full reseed on the next push.
|
|
618
|
+
await writeRemoteState(root, {
|
|
619
|
+
needsReseed: true,
|
|
620
|
+
documents: {},
|
|
621
|
+
changeRequests: {},
|
|
622
|
+
bugs: {},
|
|
623
|
+
});
|
|
495
624
|
|
|
496
625
|
return result;
|
|
497
626
|
}
|
|
@@ -506,7 +635,14 @@ export async function getRemoteStatus(root: string, timeout?: number): Promise<R
|
|
|
506
635
|
}
|
|
507
636
|
|
|
508
637
|
const files = await parseAllStoryFiles(root);
|
|
509
|
-
const
|
|
638
|
+
const state = await readRemoteState(root);
|
|
639
|
+
const localPending = state.needsReseed
|
|
640
|
+
? files.length
|
|
641
|
+
: files.filter((f) => {
|
|
642
|
+
const tracked = state.documents[normalizePath(f.relativePath)];
|
|
643
|
+
if (!tracked) return true;
|
|
644
|
+
return tracked.localHash !== f.hash;
|
|
645
|
+
}).length;
|
|
510
646
|
|
|
511
647
|
try {
|
|
512
648
|
const api = buildApiConfig(config, timeout);
|
package/src/remote/types.ts
CHANGED
|
@@ -84,16 +84,24 @@ export interface RemoteEntityState {
|
|
|
84
84
|
export interface RemoteState {
|
|
85
85
|
lastPull?: string;
|
|
86
86
|
lastPush?: string;
|
|
87
|
+
needsReseed?: boolean;
|
|
87
88
|
documents: Record<string, RemoteDocState>;
|
|
88
89
|
changeRequests?: Record<string, RemoteEntityState>;
|
|
89
90
|
bugs?: Record<string, RemoteEntityState>;
|
|
90
91
|
}
|
|
91
92
|
|
|
93
|
+
/** Response from delete endpoints */
|
|
94
|
+
export interface RemoteDeleteResponse {
|
|
95
|
+
deleted: number;
|
|
96
|
+
paths: string[];
|
|
97
|
+
}
|
|
98
|
+
|
|
92
99
|
/** Result of a push operation */
|
|
93
100
|
export interface PushResult {
|
|
94
101
|
created: number;
|
|
95
102
|
updated: number;
|
|
96
103
|
pushed: string[];
|
|
104
|
+
deleted: string[];
|
|
97
105
|
}
|
|
98
106
|
|
|
99
107
|
/** A conflict detected during pull */
|
|
@@ -108,6 +116,7 @@ export interface PullConflict {
|
|
|
108
116
|
export interface PullResult {
|
|
109
117
|
created: string[];
|
|
110
118
|
updated: string[];
|
|
119
|
+
deleted: string[];
|
|
111
120
|
conflicts: PullConflict[];
|
|
112
121
|
}
|
|
113
122
|
|
|
@@ -115,6 +124,7 @@ export interface PullResult {
|
|
|
115
124
|
export interface PullEntitiesResult {
|
|
116
125
|
created: number;
|
|
117
126
|
updated: number;
|
|
127
|
+
deleted: number;
|
|
118
128
|
}
|
|
119
129
|
|
|
120
130
|
/** Result of remote status check */
|
|
@@ -4,6 +4,7 @@ import { existsSync } from 'node:fs';
|
|
|
4
4
|
import { tmpdir } from 'node:os';
|
|
5
5
|
import { join } from 'node:path';
|
|
6
6
|
import { execSync } from 'node:child_process';
|
|
7
|
+
import { createHash } from 'node:crypto';
|
|
7
8
|
import { SDD } from '../src/sdd.js';
|
|
8
9
|
import { readRemoteState } from '../src/remote/state.js';
|
|
9
10
|
import type { RemoteDocResponse, RemoteDocBulkResponse, RemoteCRResponse, RemoteBugResponse } from '../src/remote/types.js';
|
|
@@ -12,6 +13,10 @@ function git(cmd: string, cwd: string): string {
|
|
|
12
13
|
return execSync(`git ${cmd}`, { cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
13
14
|
}
|
|
14
15
|
|
|
16
|
+
function sha256(content: string): string {
|
|
17
|
+
return createHash('sha256').update(content, 'utf-8').digest('hex');
|
|
18
|
+
}
|
|
19
|
+
|
|
15
20
|
const VISION_MD = `---
|
|
16
21
|
title: "Product Vision"
|
|
17
22
|
status: new
|
|
@@ -43,6 +48,67 @@ function makeDocResponse(overrides: Partial<RemoteDocResponse> = {}): RemoteDocR
|
|
|
43
48
|
};
|
|
44
49
|
}
|
|
45
50
|
|
|
51
|
+
function makeCRResponse(overrides: Partial<RemoteCRResponse> = {}): RemoteCRResponse {
|
|
52
|
+
return {
|
|
53
|
+
id: 'cr-001',
|
|
54
|
+
project_id: 'proj-001',
|
|
55
|
+
path: 'change-requests/CR-001.md',
|
|
56
|
+
title: 'Add auth flow',
|
|
57
|
+
body: '## Description\n\nAdd JWT authentication.\n',
|
|
58
|
+
status: 'pending',
|
|
59
|
+
author_id: 'user-1',
|
|
60
|
+
assignee_id: null,
|
|
61
|
+
target_files: null,
|
|
62
|
+
closed_at: null,
|
|
63
|
+
created_at: '2026-01-01T00:00:00.000Z',
|
|
64
|
+
updated_at: '2026-01-01T00:00:00.000Z',
|
|
65
|
+
...overrides,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function makeBugResponse(overrides: Partial<RemoteBugResponse> = {}): RemoteBugResponse {
|
|
70
|
+
return {
|
|
71
|
+
id: 'bug-001',
|
|
72
|
+
project_id: 'proj-001',
|
|
73
|
+
path: 'bugs/BUG-001.md',
|
|
74
|
+
title: 'Search returns stale results',
|
|
75
|
+
body: '## Steps\n\n1. Search for a term\n2. Results are outdated\n',
|
|
76
|
+
status: 'open',
|
|
77
|
+
severity: 'major',
|
|
78
|
+
author_id: 'user-1',
|
|
79
|
+
assignee_id: null,
|
|
80
|
+
closed_at: null,
|
|
81
|
+
created_at: '2026-02-01T00:00:00.000Z',
|
|
82
|
+
updated_at: '2026-02-01T00:00:00.000Z',
|
|
83
|
+
...overrides,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const APPLIED_CR = `---
|
|
88
|
+
title: "Add auth flow"
|
|
89
|
+
status: applied
|
|
90
|
+
author: "user"
|
|
91
|
+
created-at: "2026-01-01T00:00:00.000Z"
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Description
|
|
95
|
+
|
|
96
|
+
Add JWT authentication.
|
|
97
|
+
`;
|
|
98
|
+
|
|
99
|
+
const RESOLVED_BUG = `---
|
|
100
|
+
title: "Search returns stale results"
|
|
101
|
+
status: resolved
|
|
102
|
+
author: "user"
|
|
103
|
+
created-at: "2026-02-01T00:00:00.000Z"
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Steps
|
|
107
|
+
|
|
108
|
+
1. Search for a term
|
|
109
|
+
2. Results are outdated
|
|
110
|
+
`;
|
|
111
|
+
|
|
46
112
|
describe('Sync engine - push', () => {
|
|
47
113
|
let tempDir: string;
|
|
48
114
|
let sdd: SDD;
|
|
@@ -67,7 +133,7 @@ describe('Sync engine - push', () => {
|
|
|
67
133
|
await rm(tempDir, { recursive: true });
|
|
68
134
|
});
|
|
69
135
|
|
|
70
|
-
it('pushes pending files and
|
|
136
|
+
it('pushes pending files and preserves local frontmatter status', async () => {
|
|
71
137
|
await writeFile(join(tempDir, 'product/vision.md'), VISION_MD, 'utf-8');
|
|
72
138
|
|
|
73
139
|
const pushResponse: RemoteDocBulkResponse = {
|
|
@@ -87,9 +153,9 @@ describe('Sync engine - push', () => {
|
|
|
87
153
|
expect(result.updated).toBe(0);
|
|
88
154
|
expect(result.pushed).toContain('product/vision.md');
|
|
89
155
|
|
|
90
|
-
//
|
|
156
|
+
// Push should not mutate markdown frontmatter status
|
|
91
157
|
const content = await readFile(join(tempDir, 'product/vision.md'), 'utf-8');
|
|
92
|
-
expect(content).toContain('status:
|
|
158
|
+
expect(content).toContain('status: new');
|
|
93
159
|
|
|
94
160
|
// Remote state should be updated
|
|
95
161
|
const state = await readRemoteState(tempDir);
|
|
@@ -101,6 +167,20 @@ describe('Sync engine - push', () => {
|
|
|
101
167
|
it('skips synced files when no paths specified', async () => {
|
|
102
168
|
await writeFile(join(tempDir, 'product/vision.md'), VISION_SYNCED, 'utf-8');
|
|
103
169
|
|
|
170
|
+
const { writeRemoteState } = await import('../src/remote/state.js');
|
|
171
|
+
await writeRemoteState(tempDir, {
|
|
172
|
+
documents: {
|
|
173
|
+
'product/vision.md': {
|
|
174
|
+
remoteId: 'doc-001',
|
|
175
|
+
remoteVersion: 1,
|
|
176
|
+
localHash: sha256(VISION_SYNCED),
|
|
177
|
+
lastSynced: '2026-01-01T00:00:00.000Z',
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
changeRequests: {},
|
|
181
|
+
bugs: {},
|
|
182
|
+
});
|
|
183
|
+
|
|
104
184
|
const result = await sdd.push();
|
|
105
185
|
expect(result.pushed).toHaveLength(0);
|
|
106
186
|
});
|
|
@@ -123,6 +203,77 @@ describe('Sync engine - push', () => {
|
|
|
123
203
|
expect(result.pushed).toContain('product/vision.md');
|
|
124
204
|
expect(result.updated).toBe(1);
|
|
125
205
|
});
|
|
206
|
+
|
|
207
|
+
it('repopulates remote from local files after a remote reset', async () => {
|
|
208
|
+
await writeFile(join(tempDir, 'product/vision.md'), VISION_SYNCED, 'utf-8');
|
|
209
|
+
await mkdir(join(tempDir, 'change-requests'), { recursive: true });
|
|
210
|
+
await writeFile(join(tempDir, 'change-requests/CR-001.md'), APPLIED_CR, 'utf-8');
|
|
211
|
+
await mkdir(join(tempDir, 'bugs'), { recursive: true });
|
|
212
|
+
await writeFile(join(tempDir, 'bugs/BUG-001.md'), RESOLVED_BUG, 'utf-8');
|
|
213
|
+
|
|
214
|
+
globalThis.fetch = vi.fn()
|
|
215
|
+
.mockResolvedValueOnce({
|
|
216
|
+
ok: true,
|
|
217
|
+
status: 200,
|
|
218
|
+
json: async () => ({
|
|
219
|
+
message: 'Remote project reset.',
|
|
220
|
+
deleted_documents: 4,
|
|
221
|
+
deleted_change_requests: 2,
|
|
222
|
+
deleted_bugs: 1,
|
|
223
|
+
deleted_comments: 0,
|
|
224
|
+
deleted_notifications: 0,
|
|
225
|
+
}),
|
|
226
|
+
})
|
|
227
|
+
.mockResolvedValueOnce({
|
|
228
|
+
ok: true,
|
|
229
|
+
status: 200,
|
|
230
|
+
json: async () => ({
|
|
231
|
+
created: 1,
|
|
232
|
+
updated: 0,
|
|
233
|
+
documents: [makeDocResponse()],
|
|
234
|
+
}),
|
|
235
|
+
})
|
|
236
|
+
.mockResolvedValueOnce({
|
|
237
|
+
ok: true,
|
|
238
|
+
status: 200,
|
|
239
|
+
json: async () => ({
|
|
240
|
+
created: 1,
|
|
241
|
+
updated: 0,
|
|
242
|
+
change_requests: [makeCRResponse()],
|
|
243
|
+
}),
|
|
244
|
+
})
|
|
245
|
+
.mockResolvedValueOnce({
|
|
246
|
+
ok: true,
|
|
247
|
+
status: 200,
|
|
248
|
+
json: async () => ({
|
|
249
|
+
created: 1,
|
|
250
|
+
updated: 0,
|
|
251
|
+
bugs: [makeBugResponse()],
|
|
252
|
+
}),
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
await sdd.remoteReset('test-project');
|
|
256
|
+
|
|
257
|
+
const resetState = await readRemoteState(tempDir);
|
|
258
|
+
expect(resetState.needsReseed).toBe(true);
|
|
259
|
+
expect(resetState.documents).toEqual({});
|
|
260
|
+
expect(resetState.changeRequests).toEqual({});
|
|
261
|
+
expect(resetState.bugs).toEqual({});
|
|
262
|
+
|
|
263
|
+
const result = await sdd.push();
|
|
264
|
+
|
|
265
|
+
expect(result.created).toBe(3);
|
|
266
|
+
expect(result.updated).toBe(0);
|
|
267
|
+
expect(result.pushed).toContain('product/vision.md');
|
|
268
|
+
expect(result.pushed).toContain('change-requests/CR-001.md');
|
|
269
|
+
expect(result.pushed).toContain('bugs/BUG-001.md');
|
|
270
|
+
|
|
271
|
+
const state = await readRemoteState(tempDir);
|
|
272
|
+
expect(state.needsReseed).toBe(false);
|
|
273
|
+
expect(state.documents['product/vision.md']?.remoteId).toBe('doc-001');
|
|
274
|
+
expect(state.changeRequests?.['change-requests/CR-001.md']?.remoteId).toBe('cr-001');
|
|
275
|
+
expect(state.bugs?.['bugs/BUG-001.md']?.remoteId).toBe('bug-001');
|
|
276
|
+
});
|
|
126
277
|
});
|
|
127
278
|
|
|
128
279
|
describe('Sync engine - pull', () => {
|
|
@@ -505,9 +656,9 @@ Easypick is a marketplace for on-demand services.
|
|
|
505
656
|
});
|
|
506
657
|
await sdd.push();
|
|
507
658
|
|
|
508
|
-
// Read file after push (status
|
|
659
|
+
// Read file after push (status is preserved)
|
|
509
660
|
const afterPush = await readFile(join(tempDir, 'product/vision.md'), 'utf-8');
|
|
510
|
-
expect(afterPush).toContain('status:
|
|
661
|
+
expect(afterPush).toContain('status: new');
|
|
511
662
|
|
|
512
663
|
// Pull — server returns same content, higher version
|
|
513
664
|
globalThis.fetch = vi.fn().mockResolvedValue({
|