@dalzoubi/dev-agents-sync 2.0.24 → 2.0.26
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/README.md +35 -25
- package/package.json +1 -1
- package/src/commands/init.mjs +19 -7
- package/src/commands/update.mjs +22 -11
- package/src/hooks.mjs +38 -1
- package/src/settings.mjs +203 -46
- package/tests/hook-retirement.test.mjs +684 -0
- package/tests/hooks-cli-install.test.mjs +67 -0
- package/tests/rules-injector-registration.test.mjs +523 -84
- package/tests/rules-injector-runtime.test.mjs +0 -313
|
@@ -1210,6 +1210,73 @@ describe('S4 H10 — malformed settings.json triggers ESETTINGS_PARSE (no write)
|
|
|
1210
1210
|
'mergeHookSettings must leave malformed settings.json byte-identical (no partial write)',
|
|
1211
1211
|
);
|
|
1212
1212
|
});
|
|
1213
|
+
|
|
1214
|
+
// -------------------------------------------------------------------------
|
|
1215
|
+
// S1 cycle 3, L6 (Group A — regression guard): before cycle 2, --dry-run
|
|
1216
|
+
// never read settings.json at all; now update.mjs's dry-run branch computes
|
|
1217
|
+
// the planned hook-registration prune (update.mjs:196-202), which means it
|
|
1218
|
+
// calls mergeHookSettings -> readSettings on every dry run. A malformed file
|
|
1219
|
+
// now turns `update --dry-run` from a clean exit 0 into a thrown
|
|
1220
|
+
// ESETTINGS_PARSE — an unstated contract change (the better posture per §5:
|
|
1221
|
+
// a dry run should predict the real failure) that only the H10a/H10b
|
|
1222
|
+
// non-dry-run cases above pinned before this test.
|
|
1223
|
+
// -------------------------------------------------------------------------
|
|
1224
|
+
|
|
1225
|
+
it('H10e: update --dry-run fails loud with ESETTINGS_PARSE when settings.json is invalid JSON', async () => {
|
|
1226
|
+
setupInitializedRepo(consumerDir, { resolvedVersion: '1.0.0' });
|
|
1227
|
+
|
|
1228
|
+
const settingsPath = path.join(consumerDir, '.claude', 'settings.json');
|
|
1229
|
+
mkdirSync(path.dirname(settingsPath), { recursive: true });
|
|
1230
|
+
writeFileSync(settingsPath, '{not: valid JSON}}', 'utf8');
|
|
1231
|
+
|
|
1232
|
+
let thrownError = null;
|
|
1233
|
+
try {
|
|
1234
|
+
await runUpdate(consumerDir, {
|
|
1235
|
+
dryRun: true,
|
|
1236
|
+
fetcher: makeFixtureFetcher(),
|
|
1237
|
+
availableTags: ['v1.0.0', 'v1.2.0'],
|
|
1238
|
+
});
|
|
1239
|
+
} catch (err) {
|
|
1240
|
+
thrownError = err;
|
|
1241
|
+
}
|
|
1242
|
+
|
|
1243
|
+
assert.ok(
|
|
1244
|
+
thrownError !== null,
|
|
1245
|
+
'update --dry-run must throw when settings.json is malformed JSON — a dry run that ' +
|
|
1246
|
+
'returns cleanly while the real run would fail is a broken prediction (§5)',
|
|
1247
|
+
);
|
|
1248
|
+
assert.ok(
|
|
1249
|
+
thrownError.code === 'ESETTINGS_PARSE' ||
|
|
1250
|
+
(thrownError.message && /ESETTINGS_PARSE/i.test(thrownError.message)),
|
|
1251
|
+
`error must carry code ESETTINGS_PARSE; got code=${thrownError?.code} message=${thrownError?.message}`,
|
|
1252
|
+
);
|
|
1253
|
+
});
|
|
1254
|
+
|
|
1255
|
+
it('H10f: update --dry-run leaves malformed settings.json byte-identical (no partial write)', async () => {
|
|
1256
|
+
setupInitializedRepo(consumerDir, { resolvedVersion: '1.0.0' });
|
|
1257
|
+
|
|
1258
|
+
const settingsPath = path.join(consumerDir, '.claude', 'settings.json');
|
|
1259
|
+
mkdirSync(path.dirname(settingsPath), { recursive: true });
|
|
1260
|
+
const malformed = '{not: valid JSON}}';
|
|
1261
|
+
writeFileSync(settingsPath, malformed, 'utf8');
|
|
1262
|
+
|
|
1263
|
+
try {
|
|
1264
|
+
await runUpdate(consumerDir, {
|
|
1265
|
+
dryRun: true,
|
|
1266
|
+
fetcher: makeFixtureFetcher(),
|
|
1267
|
+
availableTags: ['v1.0.0', 'v1.2.0'],
|
|
1268
|
+
});
|
|
1269
|
+
} catch {
|
|
1270
|
+
// Expected — swallow the error for the preservation check.
|
|
1271
|
+
}
|
|
1272
|
+
|
|
1273
|
+
const after = readFileSync(settingsPath, 'utf8');
|
|
1274
|
+
assert.equal(
|
|
1275
|
+
after,
|
|
1276
|
+
malformed,
|
|
1277
|
+
'malformed settings.json must remain unmodified after a failed --dry-run update (no partial write)',
|
|
1278
|
+
);
|
|
1279
|
+
});
|
|
1213
1280
|
});
|
|
1214
1281
|
|
|
1215
1282
|
// ---------------------------------------------------------------------------
|