@namewta/speculo 0.7.6 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +5 -6
  2. package/dist/src/cli.js +18 -13
  3. package/dist/src/cli.js.map +1 -1
  4. package/dist/src/config.d.ts +20 -0
  5. package/dist/src/config.js +94 -0
  6. package/dist/src/config.js.map +1 -0
  7. package/dist/src/index.d.ts +3 -2
  8. package/dist/src/index.js +56 -27
  9. package/dist/src/index.js.map +1 -1
  10. package/dist/src/manifest.d.ts +20 -0
  11. package/dist/src/manifest.js +57 -0
  12. package/dist/src/manifest.js.map +1 -0
  13. package/dist/src/refresh.d.ts +30 -0
  14. package/dist/src/refresh.js +465 -0
  15. package/dist/src/refresh.js.map +1 -0
  16. package/dist/src/structured.d.ts +12 -0
  17. package/dist/src/structured.js +236 -0
  18. package/dist/src/structured.js.map +1 -0
  19. package/package.json +2 -2
  20. package/template/.speculo/README.md +12 -11
  21. package/template/.speculo/refresh-contract.json +30 -0
  22. package/template/canonical/canonical-specdev-engineering-cognitive-mentor.md +1 -0
  23. package/template/canonical/canonical-specdev-goal-plan.md +1 -0
  24. package/template/canonical/canonical-specdev-grill-with-docs.md +1 -0
  25. package/template/canonical/canonical-specdev-spec.md +1 -0
  26. package/template/canonical/canonical-specdev-tickets.md +1 -0
  27. package/template/skills/github-npm-ops/references/preflight-checklist.md +1 -1
  28. package/template/workflows/person/runtime-contract.json +9 -0
  29. package/template/workflows/specdev/E-eli5/E-eli5.md +35 -0
  30. package/template/workflows/specdev/I-init-setup/I-init-setup.md +1 -1
  31. package/template/workflows/specdev/INDEX.md +15 -12
  32. package/template/workflows/specdev/common/rules/artifact-contract.md +1 -0
  33. package/template/workflows/specdev/common/tools/README.md +1 -1
  34. package/template/workflows/specdev/common/tools/validate-specdev.mjs +28 -0
  35. package/template/workflows/specdev/runtime-contract.json +26 -0
  36. package/dist/src/migrations.d.ts +0 -23
  37. package/dist/src/migrations.js +0 -1202
  38. package/dist/src/migrations.js.map +0 -1
  39. package/template/commands/migrate-runtime-state.md +0 -43
  40. package/template/skills/migrate-runtime-state/SKILL.md +0 -93
  41. package/template/skills/migrate-runtime-state/references/migration-contract.md +0 -64
  42. package/template/skills/migrate-runtime-state/scripts/migrate-runtime-state.mjs +0 -916
@@ -0,0 +1,465 @@
1
+ import { createHash } from "node:crypto";
2
+ import { cp, lstat, mkdir, readFile, readdir, rm, writeFile } from "node:fs/promises";
3
+ import { dirname, join, relative } from "node:path";
4
+ import { assertJsonObject, reconcileConfig } from "./config.js";
5
+ import { collectFiles, toPosix } from "./manifest.js";
6
+ import { migrateSpecdevConfig, migrateStructuredRuntime, validateSpecdevConfig } from "./structured.js";
7
+ import { pathExists } from "./utils.js";
8
+ export class RefreshBlockedError extends Error {
9
+ blockers;
10
+ constructor(blockers) {
11
+ super("Speculo refresh is blocked; the existing installation was not changed.");
12
+ this.name = "RefreshBlockedError";
13
+ this.blockers = blockers;
14
+ }
15
+ }
16
+ const EMPTY_STATS = { added: 0, updated: 0, preserved: 0, removed: 0 };
17
+ function addStats(target, next) {
18
+ target.added += next.added;
19
+ target.updated += next.updated;
20
+ target.preserved += next.preserved;
21
+ target.removed += next.removed;
22
+ }
23
+ async function readJson(path, label) {
24
+ let value;
25
+ try {
26
+ value = JSON.parse(await readFile(path, "utf8"));
27
+ }
28
+ catch (error) {
29
+ throw new RefreshBlockedError([{ code: "invalid-json", path: label, message: String(error) }]);
30
+ }
31
+ try {
32
+ assertJsonObject(value, label);
33
+ }
34
+ catch (error) {
35
+ throw new RefreshBlockedError([{ code: "invalid-config", path: label, message: String(error) }]);
36
+ }
37
+ return value;
38
+ }
39
+ async function packageVersion(packageRoot) {
40
+ const manifest = await readJson(join(packageRoot, "package.json"), "package.json");
41
+ if (typeof manifest.version !== "string")
42
+ throw new Error("package.json has no version");
43
+ return manifest.version;
44
+ }
45
+ async function sourceVersion(previousRoot) {
46
+ const path = join(previousRoot, ".speculo", "install.json");
47
+ if (!(await pathExists(path)))
48
+ return "0.7.0-unversioned";
49
+ const install = await readJson(path, ".speculo/install.json");
50
+ if (![1, 2].includes(Number(install.schema_version)) || typeof install.package_version !== "string") {
51
+ throw new RefreshBlockedError([{
52
+ code: "unsupported-install-manifest",
53
+ path: ".speculo/install.json",
54
+ message: "refresh supports install manifest schema v1 or v2",
55
+ }]);
56
+ }
57
+ const match = /^(\d+)\.(\d+)\.(\d+)/.exec(install.package_version);
58
+ if (!match || (Number(match[1]) === 0 && Number(match[2]) < 7)) {
59
+ throw new RefreshBlockedError([{
60
+ code: "unsupported-source-version",
61
+ path: ".speculo/install.json",
62
+ message: "automatic refresh supports Speculo v0.7 and newer installations",
63
+ }]);
64
+ }
65
+ return install.package_version;
66
+ }
67
+ function validateRelativePath(path, label) {
68
+ if (!path || path.startsWith("/") || path.split("/").includes("..") || path.includes("\\")) {
69
+ throw new Error(label + " contains an unsafe relative path: " + path);
70
+ }
71
+ }
72
+ async function loadRefreshContract(stagedRoot) {
73
+ const contract = await readJson(join(stagedRoot, ".speculo", "refresh-contract.json"), ".speculo/refresh-contract.json");
74
+ if (contract.schema_version !== 1 || contract.runtime_root !== ".speculo" ||
75
+ !Array.isArray(contract.managed_roots) || !Array.isArray(contract.managed_metadata) ||
76
+ !Array.isArray(contract.reserved_runtime) ||
77
+ ![...contract.managed_roots, ...contract.managed_metadata, ...contract.reserved_runtime].every((item) => typeof item === "string")) {
78
+ throw new Error("template refresh contract must use schema v1 and declare managed and runtime paths");
79
+ }
80
+ assertJsonObject(contract.project_config, "project_config contract");
81
+ for (const path of [...contract.managed_roots, ...contract.managed_metadata, ...contract.reserved_runtime]) {
82
+ validateRelativePath(path, "refresh contract");
83
+ }
84
+ for (const root of contract.managed_roots) {
85
+ if (root === ".speculo" || root.startsWith(".speculo/"))
86
+ throw new Error("managed roots cannot own the runtime root");
87
+ }
88
+ for (const path of contract.managed_metadata) {
89
+ if (!path.startsWith(".speculo/"))
90
+ throw new Error("managed metadata must be inside .speculo");
91
+ if (!contract.reserved_runtime.includes(path.slice(".speculo/".length))) {
92
+ throw new Error("managed metadata must also be reserved runtime: " + path);
93
+ }
94
+ }
95
+ if (typeof contract.project_config.path !== "string" || typeof contract.project_config.baseline !== "string" ||
96
+ contract.project_config.schema_version !== 1 || contract.project_config.additional_properties !== true)
97
+ throw new Error("project_config contract is incomplete");
98
+ validateRelativePath(contract.project_config.path, "project_config.path");
99
+ validateRelativePath(contract.project_config.baseline, "project_config.baseline");
100
+ return contract;
101
+ }
102
+ async function loadWorkflowContract(stagedRoot, workflowId) {
103
+ const path = join(stagedRoot, "workflows", workflowId, "runtime-contract.json");
104
+ const contract = await readJson(path, `workflows/${workflowId}/runtime-contract.json`);
105
+ if (contract.schema_version !== 1 || contract.workflow !== workflowId ||
106
+ !Array.isArray(contract.structured_state) || contract.opaque_default !== "preserve-byte-for-byte") {
107
+ throw new Error("workflow " + workflowId + " has an invalid runtime contract");
108
+ }
109
+ for (const item of contract.structured_state) {
110
+ if (typeof item !== "string")
111
+ throw new Error("workflow " + workflowId + " has a non-string structured state path");
112
+ validateRelativePath(item.replaceAll("*", "segment"), "structured_state");
113
+ }
114
+ if (contract.config !== null) {
115
+ assertJsonObject(contract.config, "workflow config contract");
116
+ const config = contract.config;
117
+ for (const item of [config.path, config.template, config.baseline]) {
118
+ if (typeof item !== "string")
119
+ throw new Error("workflow " + workflowId + " config contract is incomplete");
120
+ validateRelativePath(item, "workflow config contract");
121
+ }
122
+ if (!config.path.startsWith(`.speculo/${workflowId}/`) || !config.baseline.startsWith(".speculo/baselines/")) {
123
+ throw new Error("workflow " + workflowId + " config paths cross their ownership boundary");
124
+ }
125
+ }
126
+ for (const item of contract.structured_state) {
127
+ if (!item.startsWith(`.speculo/${workflowId}/`)) {
128
+ throw new Error("workflow " + workflowId + " structured state crosses its ownership boundary");
129
+ }
130
+ }
131
+ return contract;
132
+ }
133
+ async function assertNoSymlinks(root) {
134
+ if (!(await pathExists(root)))
135
+ return;
136
+ const blockers = [];
137
+ async function visit(current) {
138
+ for (const entry of await readdir(current, { withFileTypes: true })) {
139
+ const path = join(current, entry.name);
140
+ const stats = await lstat(path);
141
+ if (stats.isSymbolicLink()) {
142
+ blockers.push({
143
+ code: "runtime-symlink",
144
+ path: toPosix(relative(root, path)),
145
+ message: "runtime symlinks cannot be proven to stay within the installation",
146
+ });
147
+ }
148
+ else if (stats.isDirectory()) {
149
+ await visit(path);
150
+ }
151
+ }
152
+ }
153
+ await visit(root);
154
+ if (blockers.length > 0)
155
+ throw new RefreshBlockedError(blockers);
156
+ }
157
+ function isReserved(path, reserved) {
158
+ const first = path.split("/")[0];
159
+ return reserved.has(first);
160
+ }
161
+ function matchesContractPath(runtimePath, contractPath) {
162
+ const expected = contractPath.startsWith(".speculo/") ? contractPath.slice(".speculo/".length) : contractPath;
163
+ const actualSegments = runtimePath.split("/");
164
+ const expectedSegments = expected.split("/");
165
+ return actualSegments.length === expectedSegments.length &&
166
+ expectedSegments.every((segment, index) => segment === "*" || segment === actualSegments[index]);
167
+ }
168
+ function isStructured(path, contracts) {
169
+ return contracts.some((contract) => (contract.config !== null && matchesContractPath(path, contract.config.path)) ||
170
+ contract.structured_state.some((pattern) => matchesContractPath(path, pattern)));
171
+ }
172
+ async function copyPreviousRuntime(previousRoot, stagedRoot, reserved) {
173
+ const previousState = join(previousRoot, ".speculo");
174
+ if (!(await pathExists(previousState)))
175
+ return;
176
+ const stagedState = join(stagedRoot, ".speculo");
177
+ for (const entry of await readdir(previousState, { withFileTypes: true })) {
178
+ if (reserved.has(entry.name))
179
+ continue;
180
+ await cp(join(previousState, entry.name), join(stagedState, entry.name), {
181
+ recursive: entry.isDirectory(),
182
+ force: true,
183
+ });
184
+ }
185
+ const baselines = join(previousState, "baselines");
186
+ if (await pathExists(baselines)) {
187
+ await cp(baselines, join(stagedState, "baselines"), { recursive: true, force: true });
188
+ }
189
+ }
190
+ async function opaqueFiles(stateRoot, reserved, contracts) {
191
+ const records = await collectFiles(stateRoot, {
192
+ include: (path) => !isReserved(path, reserved) && !isStructured(path, contracts),
193
+ });
194
+ return new Map(records.map((record) => [record.path, record.sha256]));
195
+ }
196
+ function verifyOpaqueFiles(before, after) {
197
+ const blockers = [];
198
+ for (const [path, hash] of before) {
199
+ if (after.get(path) !== hash) {
200
+ blockers.push({ code: "persistent-drift", path: `.speculo/${path}`, message: "opaque runtime content changed during refresh staging" });
201
+ }
202
+ }
203
+ if (blockers.length > 0)
204
+ throw new RefreshBlockedError(blockers);
205
+ }
206
+ async function reconcileProjectConfig(previousRoot, stagedRoot, existed, contract, stats, backups) {
207
+ const incomingPath = join(stagedRoot, contract.path);
208
+ const incoming = await readJson(incomingPath, contract.path);
209
+ const baselinePath = join(previousRoot, contract.baseline);
210
+ const nextBaselinePath = join(stagedRoot, contract.baseline);
211
+ await mkdir(dirname(nextBaselinePath), { recursive: true });
212
+ if (!existed) {
213
+ await writeFile(nextBaselinePath, JSON.stringify(incoming, null, 2) + "\n", "utf8");
214
+ return;
215
+ }
216
+ const localPath = join(previousRoot, contract.path);
217
+ if (!(await pathExists(localPath))) {
218
+ throw new RefreshBlockedError([{ code: "missing-config", path: contract.path, message: "existing installation has no project config" }]);
219
+ }
220
+ if ((await lstat(localPath)).isSymbolicLink()) {
221
+ throw new RefreshBlockedError([{ code: "runtime-symlink", path: contract.path, message: "persistent config symlinks are not supported" }]);
222
+ }
223
+ const before = await readFile(localPath);
224
+ const local = await readJson(localPath, contract.path);
225
+ if (local.schema_version !== contract.schema_version) {
226
+ throw new RefreshBlockedError([{ code: "unsupported-config", path: contract.path, message: "project config schema_version must be " + contract.schema_version }]);
227
+ }
228
+ const baseline = await pathExists(baselinePath) ? await readJson(baselinePath, ".speculo/baselines/config.json") : undefined;
229
+ let merged;
230
+ try {
231
+ merged = reconcileConfig({ baseline, local, incoming, allowsUnknown: () => contract.additional_properties });
232
+ }
233
+ catch (error) {
234
+ throw new RefreshBlockedError([{ code: "config-conflict", path: contract.path, message: String(error) }]);
235
+ }
236
+ addStats(stats, merged.stats);
237
+ if (merged.removedPaths.length > 0)
238
+ backups.push({ sourcePath: contract.path, before, reason: "removed config fields: " + merged.removedPaths.join(", ") });
239
+ await writeFile(incomingPath, JSON.stringify(merged.value, null, 2) + "\n", "utf8");
240
+ await writeFile(nextBaselinePath, JSON.stringify(incoming, null, 2) + "\n", "utf8");
241
+ }
242
+ async function reconcileWorkflowConfig(previousRoot, stagedRoot, contract, existed, stats, backups) {
243
+ if (contract.config === null)
244
+ return;
245
+ const incoming = await readJson(join(stagedRoot, contract.config.template), contract.config.template);
246
+ const nextBaselinePath = join(stagedRoot, contract.config.baseline);
247
+ await mkdir(dirname(nextBaselinePath), { recursive: true });
248
+ await writeFile(nextBaselinePath, JSON.stringify(incoming, null, 2) + "\n", "utf8");
249
+ if (!existed)
250
+ return;
251
+ const localPath = join(previousRoot, contract.config.path);
252
+ if (!(await pathExists(localPath)))
253
+ return;
254
+ const before = await readFile(localPath);
255
+ const localRaw = await readJson(localPath, contract.config.path);
256
+ const baselinePath = join(previousRoot, contract.config.baseline);
257
+ const baselineRaw = await pathExists(baselinePath) ? await readJson(baselinePath, contract.config.baseline) : undefined;
258
+ let localMigration;
259
+ let baselineMigration;
260
+ try {
261
+ localMigration = migrateSpecdevConfig(localRaw, incoming);
262
+ baselineMigration = baselineRaw ? migrateSpecdevConfig(baselineRaw, incoming) : undefined;
263
+ }
264
+ catch (error) {
265
+ throw new RefreshBlockedError([{ code: "config-migration", path: contract.config.path, message: String(error) }]);
266
+ }
267
+ let merged;
268
+ try {
269
+ merged = reconcileConfig({
270
+ baseline: baselineMigration?.value,
271
+ local: localMigration.value,
272
+ incoming,
273
+ allowsUnknown: (parent) => contract.config?.additional_properties[parent.join(".")] ?? false,
274
+ });
275
+ validateSpecdevConfig(merged.value);
276
+ }
277
+ catch (error) {
278
+ throw new RefreshBlockedError([{ code: "config-conflict", path: contract.config.path, message: String(error) }]);
279
+ }
280
+ addStats(stats, merged.stats);
281
+ if (localMigration.migrated || merged.removedPaths.length > 0) {
282
+ const reasons = [localMigration.migrated ? "schema migration" : "", merged.removedPaths.length > 0 ? "removed fields: " + merged.removedPaths.join(", ") : ""].filter(Boolean);
283
+ backups.push({ sourcePath: contract.config.path, before, reason: reasons.join("; ") });
284
+ }
285
+ const stagedPath = join(stagedRoot, contract.config.path);
286
+ await mkdir(dirname(stagedPath), { recursive: true });
287
+ await writeFile(stagedPath, JSON.stringify(merged.value, null, 2) + "\n", "utf8");
288
+ }
289
+ function backupDestination(sourcePath) {
290
+ return sourcePath.startsWith(".speculo/") ? "state/" + sourcePath.slice(".speculo/".length) : sourcePath;
291
+ }
292
+ async function writeTargetedBackup(stagedRoot, items, source, target) {
293
+ const root = join(stagedRoot, ".speculo", "back");
294
+ await rm(root, { recursive: true, force: true });
295
+ if (items.length === 0)
296
+ return null;
297
+ const unique = new Map();
298
+ for (const item of items)
299
+ if (!unique.has(item.sourcePath))
300
+ unique.set(item.sourcePath, item);
301
+ const files = [];
302
+ for (const item of unique.values()) {
303
+ const backupPath = backupDestination(item.sourcePath);
304
+ const path = join(root, backupPath);
305
+ await mkdir(dirname(path), { recursive: true });
306
+ await writeFile(path, item.before);
307
+ files.push({
308
+ source_path: item.sourcePath,
309
+ backup_path: backupPath,
310
+ bytes: item.before.byteLength,
311
+ sha256: createHash("sha256").update(item.before).digest("hex"),
312
+ reason: item.reason,
313
+ });
314
+ }
315
+ await writeFile(join(root, "manifest.json"), JSON.stringify({
316
+ schema_version: 2,
317
+ scope: "targeted-refresh-backup",
318
+ source_version: source,
319
+ target_version: target,
320
+ created_at: new Date().toISOString(),
321
+ files: files.sort((left, right) => left.source_path.localeCompare(right.source_path)),
322
+ }, null, 2) + "\n", "utf8");
323
+ return "speculo/.speculo/back";
324
+ }
325
+ async function writeMetadata(packageRoot, previousRoot, stagedRoot, contract, targetVersion, source, selected, installedWorkflowIds) {
326
+ const all = await collectFiles(stagedRoot);
327
+ const priorManagedPath = join(previousRoot, ".speculo", "managed.json");
328
+ const priorManaged = new Set();
329
+ if (await pathExists(priorManagedPath)) {
330
+ const manifest = await readJson(priorManagedPath, ".speculo/managed.json");
331
+ if (Array.isArray(manifest.files)) {
332
+ for (const item of manifest.files) {
333
+ if (item && typeof item === "object" && typeof item.path === "string")
334
+ priorManaged.add(item.path);
335
+ }
336
+ }
337
+ }
338
+ const managed = [];
339
+ for (const file of all) {
340
+ let owner = null;
341
+ let kind = "static";
342
+ if (contract.managed_metadata.includes(file.path))
343
+ owner = "core";
344
+ else if (file.path === ".speculo/commands/.gitkeep")
345
+ owner = "core/runtime-seed";
346
+ else if (file.path.startsWith("commands/"))
347
+ owner = "core/commands";
348
+ else if (file.path.startsWith("skills/"))
349
+ owner = "core/skills";
350
+ else if (file.path.startsWith(".speculo/baselines/")) {
351
+ const match = /^\.speculo\/baselines\/workflows\/([^/]+)\//.exec(file.path);
352
+ owner = match ? "workflow/" + match[1] : "core/config";
353
+ kind = "baseline";
354
+ }
355
+ else if (file.path.startsWith("workflows/")) {
356
+ const workflowId = file.path.split("/")[1];
357
+ if (installedWorkflowIds.includes(workflowId) &&
358
+ (selected.has(workflowId) || priorManaged.has(file.path) || await pathExists(join(packageRoot, "template", file.path))))
359
+ owner = "workflow/" + workflowId;
360
+ }
361
+ if (file.path.endsWith("runtime-contract.json"))
362
+ kind = "contract";
363
+ if (owner)
364
+ managed.push({
365
+ ...file,
366
+ owner,
367
+ kind,
368
+ package_version: owner.startsWith("workflow/") && !selected.has(owner.slice("workflow/".length))
369
+ ? source ?? targetVersion
370
+ : targetVersion,
371
+ });
372
+ }
373
+ managed.sort((left, right) => left.path.localeCompare(right.path));
374
+ const stateRoot = join(stagedRoot, ".speculo");
375
+ await writeFile(join(stateRoot, "managed.json"), JSON.stringify({
376
+ schema_version: 1,
377
+ package_version: targetVersion,
378
+ files: managed,
379
+ }, null, 2) + "\n", "utf8");
380
+ await writeFile(join(stateRoot, "install.json"), JSON.stringify({
381
+ schema_version: 2,
382
+ package_version: targetVersion,
383
+ workflows: [...installedWorkflowIds].sort(),
384
+ managed_manifest: ".speculo/managed.json",
385
+ config_baseline_schema: 1,
386
+ }, null, 2) + "\n", "utf8");
387
+ return managed;
388
+ }
389
+ function structuredBackups(changes, stagedRoot) {
390
+ return changes.map((change) => ({
391
+ sourcePath: toPosix(relative(stagedRoot, change.path)),
392
+ before: change.before,
393
+ reason: change.reason,
394
+ }));
395
+ }
396
+ export async function assertNoLegacyPending(previousRoot) {
397
+ const marker = join(previousRoot, ".speculo", "migration.json");
398
+ if (!(await pathExists(marker)))
399
+ return;
400
+ throw new RefreshBlockedError([{
401
+ code: "legacy-pending-migration",
402
+ path: ".speculo/migration.json",
403
+ message: "complete the installed migrate-runtime-state Agent command before refreshing this legacy installation",
404
+ }]);
405
+ }
406
+ export async function prepareRefresh(options) {
407
+ const targetVersion = await packageVersion(options.packageRoot);
408
+ const source = options.existed ? await sourceVersion(options.previousRoot) : null;
409
+ const contract = await loadRefreshContract(options.stagedRoot);
410
+ const selected = new Set(options.selectedWorkflowIds);
411
+ const reserved = new Set(contract.reserved_runtime);
412
+ const workflowContracts = await Promise.all(options.selectedWorkflowIds.map((workflowId) => loadWorkflowContract(options.stagedRoot, workflowId)));
413
+ const stats = { ...EMPTY_STATS };
414
+ const backups = [];
415
+ const previousState = join(options.previousRoot, ".speculo");
416
+ const stagedState = join(options.stagedRoot, ".speculo");
417
+ if (options.existed) {
418
+ await assertNoSymlinks(previousState);
419
+ const opaqueBefore = await opaqueFiles(previousState, reserved, workflowContracts);
420
+ await copyPreviousRuntime(options.previousRoot, options.stagedRoot, reserved);
421
+ await reconcileProjectConfig(options.previousRoot, options.stagedRoot, true, contract.project_config, stats, backups);
422
+ for (const workflowContract of workflowContracts) {
423
+ await reconcileWorkflowConfig(options.previousRoot, options.stagedRoot, workflowContract, true, stats, backups);
424
+ }
425
+ let structured;
426
+ try {
427
+ structured = await migrateStructuredRuntime(options.stagedRoot, options.selectedWorkflowIds);
428
+ }
429
+ catch (error) {
430
+ throw new RefreshBlockedError([{ code: "structured-state-conflict", path: ".speculo", message: String(error) }]);
431
+ }
432
+ backups.push(...structuredBackups(structured, options.stagedRoot));
433
+ verifyOpaqueFiles(opaqueBefore, await opaqueFiles(stagedState, reserved, workflowContracts));
434
+ const backupPath = await writeTargetedBackup(options.stagedRoot, backups, source ?? "unknown", targetVersion);
435
+ const managed = await writeMetadata(options.packageRoot, options.previousRoot, options.stagedRoot, contract, targetVersion, source, selected, options.installedWorkflowIds);
436
+ await assertNoSymlinks(options.stagedRoot);
437
+ return {
438
+ status: "updated",
439
+ sourceVersion: source,
440
+ targetVersion,
441
+ managedFiles: managed.length,
442
+ preservedFiles: opaqueBefore.size,
443
+ config: stats,
444
+ structuredUpgrades: structured.length,
445
+ backupPath,
446
+ };
447
+ }
448
+ await reconcileProjectConfig(options.previousRoot, options.stagedRoot, false, contract.project_config, stats, backups);
449
+ for (const workflowContract of workflowContracts) {
450
+ await reconcileWorkflowConfig(options.previousRoot, options.stagedRoot, workflowContract, false, stats, backups);
451
+ }
452
+ const managed = await writeMetadata(options.packageRoot, options.previousRoot, options.stagedRoot, contract, targetVersion, null, selected, options.installedWorkflowIds);
453
+ await assertNoSymlinks(options.stagedRoot);
454
+ return {
455
+ status: "initialized",
456
+ sourceVersion: null,
457
+ targetVersion,
458
+ managedFiles: managed.length,
459
+ preservedFiles: 0,
460
+ config: stats,
461
+ structuredUpgrades: 0,
462
+ backupPath: null,
463
+ };
464
+ }
465
+ //# sourceMappingURL=refresh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh.js","sourceRoot":"","sources":["../../src/refresh.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type JsonObject } from "./config.js";
2
+ export type StructuredChange = {
3
+ path: string;
4
+ before: Buffer;
5
+ reason: string;
6
+ };
7
+ export declare function migrateSpecdevConfig(local: JsonObject, defaults: JsonObject): {
8
+ value: JsonObject;
9
+ migrated: boolean;
10
+ };
11
+ export declare function validateSpecdevConfig(config: JsonObject): void;
12
+ export declare function migrateStructuredRuntime(stagedRoot: string, selectedWorkflowIds: string[]): Promise<StructuredChange[]>;