@deskwork/core 0.45.1 → 0.46.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/config.d.ts +14 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +43 -12
- package/dist/config.js.map +1 -1
- package/dist/content-index.d.ts +25 -0
- package/dist/content-index.d.ts.map +1 -1
- package/dist/content-index.js +142 -15
- package/dist/content-index.js.map +1 -1
- package/dist/doctor/index.d.ts +3 -0
- package/dist/doctor/index.d.ts.map +1 -1
- package/dist/doctor/index.js +3 -0
- package/dist/doctor/index.js.map +1 -1
- package/dist/doctor/legacy-config.d.ts +98 -0
- package/dist/doctor/legacy-config.d.ts.map +1 -0
- package/dist/doctor/legacy-config.js +174 -0
- package/dist/doctor/legacy-config.js.map +1 -0
- package/dist/doctor/project-scope-gate.d.ts +12 -21
- package/dist/doctor/project-scope-gate.d.ts.map +1 -1
- package/dist/doctor/project-scope-gate.js +13 -25
- package/dist/doctor/project-scope-gate.js.map +1 -1
- package/dist/doctor/repair.d.ts +11 -0
- package/dist/doctor/repair.d.ts.map +1 -1
- package/dist/doctor/repair.js +10 -89
- package/dist/doctor/repair.js.map +1 -1
- package/dist/doctor/rules/duplicate-id.d.ts +7 -2
- package/dist/doctor/rules/duplicate-id.d.ts.map +1 -1
- package/dist/doctor/rules/duplicate-id.js +8 -5
- package/dist/doctor/rules/duplicate-id.js.map +1 -1
- package/dist/doctor/rules/duplicate-id.ts +8 -5
- package/dist/doctor/rules/legacy-top-level-id-migration.d.ts.map +1 -1
- package/dist/doctor/rules/legacy-top-level-id-migration.js +11 -8
- package/dist/doctor/rules/legacy-top-level-id-migration.js.map +1 -1
- package/dist/doctor/rules/legacy-top-level-id-migration.ts +10 -11
- package/dist/doctor/rules/sites-to-lanes-migration.d.ts +39 -0
- package/dist/doctor/rules/sites-to-lanes-migration.d.ts.map +1 -0
- package/dist/doctor/rules/sites-to-lanes-migration.js +395 -0
- package/dist/doctor/rules/sites-to-lanes-migration.js.map +1 -0
- package/dist/doctor/rules/sites-to-lanes-migration.ts +449 -0
- package/dist/doctor/rules/workflow-stale.d.ts.map +1 -1
- package/dist/doctor/rules/workflow-stale.js +5 -2
- package/dist/doctor/rules/workflow-stale.js.map +1 -1
- package/dist/doctor/rules/workflow-stale.ts +5 -1
- package/dist/doctor/runner.d.ts +15 -1
- package/dist/doctor/runner.d.ts.map +1 -1
- package/dist/doctor/runner.js +48 -41
- package/dist/doctor/runner.js.map +1 -1
- package/dist/doctor/sites-migration-backfill.d.ts +71 -0
- package/dist/doctor/sites-migration-backfill.d.ts.map +1 -0
- package/dist/doctor/sites-migration-backfill.js +164 -0
- package/dist/doctor/sites-migration-backfill.js.map +1 -0
- package/dist/doctor/validate.d.ts.map +1 -1
- package/dist/doctor/validate.js +34 -73
- package/dist/doctor/validate.js.map +1 -1
- package/dist/entry/resolve-artifact.d.ts +80 -0
- package/dist/entry/resolve-artifact.d.ts.map +1 -0
- package/dist/entry/resolve-artifact.js +102 -0
- package/dist/entry/resolve-artifact.js.map +1 -0
- package/dist/entry/shortform-path.d.ts +34 -0
- package/dist/entry/shortform-path.d.ts.map +1 -0
- package/dist/entry/shortform-path.js +50 -0
- package/dist/entry/shortform-path.js.map +1 -0
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/iterate/iterate.d.ts.map +1 -1
- package/dist/iterate/iterate.js +21 -26
- package/dist/iterate/iterate.js.map +1 -1
- package/dist/lanes/bootstrap.d.ts +11 -7
- package/dist/lanes/bootstrap.d.ts.map +1 -1
- package/dist/lanes/bootstrap.js +42 -17
- package/dist/lanes/bootstrap.js.map +1 -1
- package/dist/lanes/index.d.ts +1 -0
- package/dist/lanes/index.d.ts.map +1 -1
- package/dist/lanes/index.js +6 -0
- package/dist/lanes/index.js.map +1 -1
- package/dist/lanes/loader.d.ts +33 -6
- package/dist/lanes/loader.d.ts.map +1 -1
- package/dist/lanes/loader.js +44 -11
- package/dist/lanes/loader.js.map +1 -1
- package/dist/lanes/operations/create.d.ts +11 -2
- package/dist/lanes/operations/create.d.ts.map +1 -1
- package/dist/lanes/operations/create.js +15 -4
- package/dist/lanes/operations/create.js.map +1 -1
- package/dist/lanes/operations/list.d.ts +3 -2
- package/dist/lanes/operations/list.d.ts.map +1 -1
- package/dist/lanes/operations/list.js +3 -2
- package/dist/lanes/operations/list.js.map +1 -1
- package/dist/lanes/operations/move.d.ts +29 -25
- package/dist/lanes/operations/move.d.ts.map +1 -1
- package/dist/lanes/operations/move.js +45 -242
- package/dist/lanes/operations/move.js.map +1 -1
- package/dist/lanes/operations/update.d.ts +15 -5
- package/dist/lanes/operations/update.d.ts.map +1 -1
- package/dist/lanes/operations/update.js +32 -12
- package/dist/lanes/operations/update.js.map +1 -1
- package/dist/lanes/scaffold-path.d.ts +88 -0
- package/dist/lanes/scaffold-path.d.ts.map +1 -0
- package/dist/lanes/scaffold-path.js +122 -0
- package/dist/lanes/scaffold-path.js.map +1 -0
- package/dist/lanes/types.d.ts +54 -31
- package/dist/lanes/types.d.ts.map +1 -1
- package/dist/lanes/types.js +60 -21
- package/dist/lanes/types.js.map +1 -1
- package/dist/outline-split.d.ts +2 -3
- package/dist/outline-split.d.ts.map +1 -1
- package/dist/outline-split.js +2 -3
- package/dist/outline-split.js.map +1 -1
- package/dist/paths.d.ts +14 -87
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +21 -131
- package/dist/paths.js.map +1 -1
- package/dist/remark-strip-outline.mjs +2 -3
- package/dist/rename-slug.d.ts +3 -3
- package/dist/rename-slug.d.ts.map +1 -1
- package/dist/rename-slug.js +137 -44
- package/dist/rename-slug.js.map +1 -1
- package/dist/review/handlers.d.ts +3 -3
- package/dist/review/handlers.d.ts.map +1 -1
- package/dist/review/handlers.js +18 -14
- package/dist/review/handlers.js.map +1 -1
- package/dist/review/report.d.ts +13 -2
- package/dist/review/report.d.ts.map +1 -1
- package/dist/review/report.js +48 -18
- package/dist/review/report.js.map +1 -1
- package/dist/review/start-handlers.d.ts +4 -4
- package/dist/review/start-handlers.d.ts.map +1 -1
- package/dist/review/start-handlers.js +25 -25
- package/dist/review/start-handlers.js.map +1 -1
- package/dist/review/workflow-paths.d.ts +24 -26
- package/dist/review/workflow-paths.d.ts.map +1 -1
- package/dist/review/workflow-paths.js +70 -60
- package/dist/review/workflow-paths.js.map +1 -1
- package/dist/schema/draft-annotation.d.ts +8 -8
- package/dist/schema/entry.d.ts +6 -6
- package/dist/schema/journal-events.d.ts +56 -42
- package/dist/schema/journal-events.d.ts.map +1 -1
- package/dist/schema/journal-events.js +23 -9
- package/dist/schema/journal-events.js.map +1 -1
- package/dist/sidecar/read.d.ts +8 -0
- package/dist/sidecar/read.d.ts.map +1 -1
- package/dist/sidecar/read.js +36 -9
- package/dist/sidecar/read.js.map +1 -1
- package/dist/sidecar/write.d.ts +14 -0
- package/dist/sidecar/write.d.ts.map +1 -1
- package/dist/sidecar/write.js +25 -0
- package/dist/sidecar/write.js.map +1 -1
- package/package.json +9 -9
- package/dist/body-state.d.ts +0 -27
- package/dist/body-state.d.ts.map +0 -1
- package/dist/body-state.js +0 -62
- package/dist/body-state.js.map +0 -1
- package/dist/scaffold.d.ts +0 -67
- package/dist/scaffold.d.ts.map +0 -1
- package/dist/scaffold.js +0 -122
- package/dist/scaffold.js.map +0 -1
package/dist/config.d.ts
CHANGED
|
@@ -9,6 +9,12 @@
|
|
|
9
9
|
* fields per site, no hidden defaults. `parseConfig` validates an unknown
|
|
10
10
|
* JSON value and returns a typed DeskworkConfig or throws an Error whose
|
|
11
11
|
* message tells the user which field is wrong.
|
|
12
|
+
*
|
|
13
|
+
* `sites` is tolerated as absent or empty (AUDIT-20260603-11): the
|
|
14
|
+
* sites→lanes migration drops the `sites`/`defaultSite` block, and a
|
|
15
|
+
* migrated project must still load. An absent/empty `sites` normalizes to
|
|
16
|
+
* `{}` and `defaultSite` to `''`. A PRESENT but mis-shaped `sites`
|
|
17
|
+
* (non-object/array, or a site missing required fields) is still rejected.
|
|
12
18
|
*/
|
|
13
19
|
/** Current config schema version. Bumped only with a migration path. */
|
|
14
20
|
export declare const CONFIG_VERSION = 1;
|
|
@@ -53,10 +59,14 @@ export interface SiteConfig {
|
|
|
53
59
|
*/
|
|
54
60
|
blogOutlineSection?: boolean;
|
|
55
61
|
/**
|
|
56
|
-
*
|
|
57
|
-
* the
|
|
58
|
-
*
|
|
59
|
-
*
|
|
62
|
+
* LEGACY MIGRATION INPUT ONLY (Phase 39c / spec Decision #23). Path to
|
|
63
|
+
* the site's `_redirects` file (Netlify-style), relative to the project
|
|
64
|
+
* root. This field is RETIRED for runtime use: `redirectsPath` re-homed
|
|
65
|
+
* onto `LaneConfig.redirectsPath`, and `renameSlug` now reads
|
|
66
|
+
* `loadLaneConfig(sidecar.lane).redirectsPath` — it no longer reads this
|
|
67
|
+
* `SiteConfig` field. Retained solely so the sites-to-lanes migration can
|
|
68
|
+
* read the legacy value and carry it onto the lane; removed wholesale
|
|
69
|
+
* with `SiteConfig` in the terminal-deletion step.
|
|
60
70
|
*/
|
|
61
71
|
redirectsPath?: string;
|
|
62
72
|
}
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,wEAAwE;AACxE,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,mDAAmD;AACnD,MAAM,WAAW,UAAU;IACzB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC;IACrB,8EAA8E;IAC9E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;;;;;;;;OASG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,iCAAiC;AACjC,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,cAAc,CAAC;IAC/B,qFAAqF;IACrF,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAqBD,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CA2E1D;AA6JD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAWxE;AAED,6DAA6D;AAC7D,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,CAoB9D"}
|
package/dist/config.js
CHANGED
|
@@ -9,6 +9,12 @@
|
|
|
9
9
|
* fields per site, no hidden defaults. `parseConfig` validates an unknown
|
|
10
10
|
* JSON value and returns a typed DeskworkConfig or throws an Error whose
|
|
11
11
|
* message tells the user which field is wrong.
|
|
12
|
+
*
|
|
13
|
+
* `sites` is tolerated as absent or empty (AUDIT-20260603-11): the
|
|
14
|
+
* sites→lanes migration drops the `sites`/`defaultSite` block, and a
|
|
15
|
+
* migrated project must still load. An absent/empty `sites` normalizes to
|
|
16
|
+
* `{}` and `defaultSite` to `''`. A PRESENT but mis-shaped `sites`
|
|
17
|
+
* (non-object/array, or a site missing required fields) is still rejected.
|
|
12
18
|
*/
|
|
13
19
|
import { readFileSync } from 'node:fs';
|
|
14
20
|
import { join } from 'node:path';
|
|
@@ -57,20 +63,29 @@ export function parseConfig(value) {
|
|
|
57
63
|
if (obj.version !== CONFIG_VERSION) {
|
|
58
64
|
throw new Error(`Invalid deskwork config: expected version ${CONFIG_VERSION}, got ${JSON.stringify(obj.version)}. Run /deskwork:install to regenerate the config.`);
|
|
59
65
|
}
|
|
66
|
+
// `sites` is tolerated as ABSENT or EMPTY (AUDIT-20260603-11). The
|
|
67
|
+
// sites→lanes migration (`dropSitesBlock`) rewrites a project's config
|
|
68
|
+
// with the `sites`/`defaultSite` block removed; a migrated project must
|
|
69
|
+
// still load through this loader so every config-reading command
|
|
70
|
+
// (`install`, `studio`, `ingest`, `doctor`) keeps working between 39b
|
|
71
|
+
// (migration lands) and 39c (schema fully drops `sites`). An absent or
|
|
72
|
+
// empty `sites` is normalized to `{}`. A PRESENT `sites` that is the
|
|
73
|
+
// wrong shape (non-object / array) is still rejected — that is a
|
|
74
|
+
// malformed config, not a post-migration one.
|
|
60
75
|
const sitesValue = obj.sites;
|
|
61
|
-
if (sitesValue === undefined ||
|
|
62
|
-
sitesValue === null ||
|
|
63
|
-
typeof sitesValue !== 'object' ||
|
|
64
|
-
Array.isArray(sitesValue)) {
|
|
65
|
-
throw new Error(`Invalid deskwork config: "sites" must be an object keyed by site slug.`);
|
|
66
|
-
}
|
|
67
|
-
const siteSlugs = Object.keys(sitesValue);
|
|
68
|
-
if (siteSlugs.length === 0) {
|
|
69
|
-
throw new Error(`Invalid deskwork config: at least one site must be defined under "sites".`);
|
|
70
|
-
}
|
|
71
76
|
const sites = {};
|
|
72
|
-
|
|
73
|
-
|
|
77
|
+
const siteSlugs = [];
|
|
78
|
+
if (sitesValue !== undefined && sitesValue !== null) {
|
|
79
|
+
if (typeof sitesValue !== 'object' || Array.isArray(sitesValue)) {
|
|
80
|
+
throw new Error(`Invalid deskwork config: "sites" must be an object keyed by site slug.`);
|
|
81
|
+
}
|
|
82
|
+
// `Object.entries` over the narrowed record avoids an indexed-access
|
|
83
|
+
// cast — `slug`/`raw` are typed `string`/`unknown` and `parseSiteConfig`
|
|
84
|
+
// validates `raw`.
|
|
85
|
+
for (const [slug, raw] of Object.entries(sitesValue)) {
|
|
86
|
+
siteSlugs.push(slug);
|
|
87
|
+
sites[slug] = parseSiteConfig(slug, raw);
|
|
88
|
+
}
|
|
74
89
|
}
|
|
75
90
|
const defaultSite = resolveDefaultSite(obj.defaultSite, siteSlugs);
|
|
76
91
|
const config = { version: CONFIG_VERSION, sites, defaultSite };
|
|
@@ -170,6 +185,13 @@ function parseSiteConfig(slug, value) {
|
|
|
170
185
|
}
|
|
171
186
|
function resolveDefaultSite(value, siteSlugs) {
|
|
172
187
|
if (value === undefined || value === null) {
|
|
188
|
+
// No sites configured (absent/empty `sites` — the post-migration
|
|
189
|
+
// shape per AUDIT-20260603-11) → no default site to resolve. Return
|
|
190
|
+
// the empty string; callers that need a site (e.g. `getContentDir`,
|
|
191
|
+
// `selectSites`) operate over `Object.keys(config.sites)` and simply
|
|
192
|
+
// see an empty list.
|
|
193
|
+
if (siteSlugs.length === 0)
|
|
194
|
+
return '';
|
|
173
195
|
if (siteSlugs.length === 1)
|
|
174
196
|
return siteSlugs[0];
|
|
175
197
|
throw new Error(`Invalid deskwork config: "defaultSite" is required when more than one site is defined. ` +
|
|
@@ -178,6 +200,15 @@ function resolveDefaultSite(value, siteSlugs) {
|
|
|
178
200
|
if (typeof value !== 'string') {
|
|
179
201
|
throw new Error(`Invalid deskwork config: "defaultSite" must be a string, got ${describe(value)}.`);
|
|
180
202
|
}
|
|
203
|
+
// Phase 39c (sites→lanes retirement): an explicit empty-string
|
|
204
|
+
// `defaultSite` with no configured sites is the round-trippable
|
|
205
|
+
// post-migration shape. `parseConfig` normalizes an absent/empty
|
|
206
|
+
// `sites` to `{}` and `defaultSite` to `''`, and re-writes that to
|
|
207
|
+
// disk (the install path does exactly this). Re-reading it must NOT
|
|
208
|
+
// throw — `''` with no sites means "no default site to resolve",
|
|
209
|
+
// identical to the absent case above (AUDIT-20260603-11 tolerance).
|
|
210
|
+
if (value === '' && siteSlugs.length === 0)
|
|
211
|
+
return '';
|
|
181
212
|
if (!siteSlugs.includes(value)) {
|
|
182
213
|
throw new Error(`Invalid deskwork config: defaultSite "${value}" is not a configured site. ` +
|
|
183
214
|
`Valid sites: ${siteSlugs.join(', ')}.`);
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/content-index.d.ts
CHANGED
|
@@ -71,4 +71,29 @@ export interface ContentIndex {
|
|
|
71
71
|
* proceed; doctor will report calendar entries with no matching files.
|
|
72
72
|
*/
|
|
73
73
|
export declare function buildContentIndex(projectRoot: string, config: DeskworkConfig, site: string): ContentIndex;
|
|
74
|
+
/**
|
|
75
|
+
* The studio content-browser discovery roots (Phase 39c, c5 — sites→lanes
|
|
76
|
+
* retirement, Decision #21): the de-duplicated, SORTED union of every
|
|
77
|
+
* configured lane's `scaffoldDefaults` directories, resolved to absolute
|
|
78
|
+
* paths. Reuses the doctor's `collectLaneScaffoldDirs` pattern so the
|
|
79
|
+
* content browser walks the same add-time content roots the sidecar index
|
|
80
|
+
* already discovers — introducing no new "location-as-key" coupling
|
|
81
|
+
* (`scaffoldDefaults` stays a convenience/discovery field per Decision #5;
|
|
82
|
+
* per-entry resolution remains `entry.artifactPath` only).
|
|
83
|
+
*
|
|
84
|
+
* Archived lanes are included (matching the doctor's discovery) so content
|
|
85
|
+
* under a lane that was later archived stays visible in the browser.
|
|
86
|
+
* Malformed lane files are skipped (other doctor rules surface those).
|
|
87
|
+
*/
|
|
88
|
+
export declare function collectContentRoots(projectRoot: string): string[];
|
|
89
|
+
/**
|
|
90
|
+
* The discovery roots for the sidecar-driven content index (Phase 39c):
|
|
91
|
+
* the union of (a) every entry's resolved artifact DIRECTORY and (b)
|
|
92
|
+
* every lane's `scaffoldDefaults` directory. (a) finds bound content;
|
|
93
|
+
* (b) finds not-yet-bound content (orphans / duplicates / legacy ids)
|
|
94
|
+
* sitting in a lane's add-time content root. Returns absolute paths,
|
|
95
|
+
* de-duplicated and sorted for deterministic walks.
|
|
96
|
+
*/
|
|
97
|
+
export declare function collectSidecarArtifactDirs(projectRoot: string): Promise<string[]>;
|
|
98
|
+
export declare function buildContentIndexFromSidecars(projectRoot: string): Promise<ContentIndex>;
|
|
74
99
|
//# sourceMappingURL=content-index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-index.d.ts","sourceRoot":"","sources":["../src/content-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"content-index.d.ts","sourceRoot":"","sources":["../src/content-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAMlD,gFAAgF;AAChF,MAAM,WAAW,iBAAiB;IAChC,2CAA2C;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,4EAA4E;AAC5E,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B;;;;;OAKG;IACH,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B;;;;;OAKG;IACH,OAAO,EAAE,iBAAiB,EAAE,CAAC;CAC9B;AAgLD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,MAAM,GACX,YAAY,CAgBd;AAwDD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAEjE;AAED;;;;;;;GAOG;AACH,wBAAsB,0BAA0B,CAC9C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,EAAE,CAAC,CAmBnB;AAED,wBAAsB,6BAA6B,CACjD,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC,CAkBvB"}
|
package/dist/content-index.js
CHANGED
|
@@ -31,9 +31,11 @@
|
|
|
31
31
|
* resolve under tsx at runtime in this package's `src/`, only in tests.
|
|
32
32
|
*/
|
|
33
33
|
import { readdirSync, statSync } from 'node:fs';
|
|
34
|
-
import { join, relative } from 'node:path';
|
|
34
|
+
import { dirname, join, relative } from 'node:path';
|
|
35
35
|
import { resolveContentDir } from "./paths.js";
|
|
36
36
|
import { readFrontmatter } from "./frontmatter.js";
|
|
37
|
+
import { readAllSidecarsPartitioned } from "./sidecar/read-all.js";
|
|
38
|
+
import { listLaneConfigs, loadLaneConfig } from "./lanes/loader.js";
|
|
37
39
|
/** Directory names skipped by the walk. Matched case-insensitively on the leaf. */
|
|
38
40
|
const SKIP_DIRS = new Set([
|
|
39
41
|
'scrapbook',
|
|
@@ -160,6 +162,32 @@ function readIdFromFrontmatter(absPath) {
|
|
|
160
162
|
}
|
|
161
163
|
return { kind: 'valid', id: trimmed };
|
|
162
164
|
}
|
|
165
|
+
/**
|
|
166
|
+
* Bind each file's frontmatter UUID into the `byId` / `byPath` maps,
|
|
167
|
+
* recording parse failures on `invalid`. Shared by both index builders
|
|
168
|
+
* (`buildContentIndex`'s contentDir walk + `buildContentIndexFromSidecars`'s
|
|
169
|
+
* sidecar-driven discovery). `baseDir` is the root the stored `byPath` key
|
|
170
|
+
* is made relative to. First-encountered wins for `byId` on duplicate ids
|
|
171
|
+
* (callers pass a deterministically-ordered `files` so "first" is stable);
|
|
172
|
+
* `byPath` records every path so a later caller can still resolve uuid by
|
|
173
|
+
* path even for the colliding entry.
|
|
174
|
+
*/
|
|
175
|
+
function bindFilesToIndex(files, baseDir, byId, byPath, invalid) {
|
|
176
|
+
for (const abs of files) {
|
|
177
|
+
const lookup = readIdFromFrontmatter(abs);
|
|
178
|
+
if (lookup.kind === 'absent')
|
|
179
|
+
continue;
|
|
180
|
+
if (lookup.kind === 'invalid') {
|
|
181
|
+
invalid.push({ absolutePath: abs, reason: lookup.reason });
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
const rel = relative(baseDir, abs);
|
|
185
|
+
if (!byId.has(lookup.id)) {
|
|
186
|
+
byId.set(lookup.id, abs);
|
|
187
|
+
}
|
|
188
|
+
byPath.set(rel, lookup.id);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
163
191
|
/**
|
|
164
192
|
* Build a content index for one site. Walks `<contentDir>/`, parses
|
|
165
193
|
* every markdown file's frontmatter, and binds `id ↔ path` where the
|
|
@@ -181,25 +209,124 @@ export function buildContentIndex(projectRoot, config, site) {
|
|
|
181
209
|
catch {
|
|
182
210
|
return { byId, byPath, invalid };
|
|
183
211
|
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
212
|
+
bindFilesToIndex(files, contentDir, byId, byPath, invalid);
|
|
213
|
+
return { byId, byPath, invalid };
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Build a content index driven by the sidecar set (Phase 39c — sites→lanes
|
|
217
|
+
* retirement, scope item 7).
|
|
218
|
+
*
|
|
219
|
+
* Where `buildContentIndex` walks a site's `contentDir` to DISCOVER files,
|
|
220
|
+
* this builder discovers the content roots from the sidecars themselves:
|
|
221
|
+
* the sidecar is the source of truth (Phase 30), and `entry.artifactPath`
|
|
222
|
+
* points at each entry's on-disk file. We collect the directory of every
|
|
223
|
+
* entry's resolved artifact, walk each unique directory for markdown files,
|
|
224
|
+
* and bind `id ↔ path` exactly as `buildContentIndex` does — but WITHOUT a
|
|
225
|
+
* configured `site` / `contentDir` axis. This lets the doctor (and any other
|
|
226
|
+
* project-scoped consumer) build a content index for a project whose
|
|
227
|
+
* `config.sites` has been migrated away.
|
|
228
|
+
*
|
|
229
|
+
* `byPath` keys are PROJECT-ROOT-relative (matching `entry.artifactPath`'s
|
|
230
|
+
* own base — `resolveStoredArtifactPath` joins it against `projectRoot`), so
|
|
231
|
+
* callers reconstruct absolute paths with `join(projectRoot, relPath)`. This
|
|
232
|
+
* differs from `buildContentIndex`, whose `byPath` keys are contentDir-
|
|
233
|
+
* relative.
|
|
234
|
+
*
|
|
235
|
+
* Entries without an `artifactPath` contribute no discovery root (their
|
|
236
|
+
* location is unknown until `doctor --fix` backfills it). A directory that
|
|
237
|
+
* doesn't exist on disk yet is silently skipped (the walk tolerates ENOENT).
|
|
238
|
+
*/
|
|
239
|
+
/**
|
|
240
|
+
* Collect the lane `scaffoldDefaults` directories (absolute). These are
|
|
241
|
+
* the lanes' add-time content roots — where new files land. Including
|
|
242
|
+
* them in the discovery set lets the sidecar-driven index also find
|
|
243
|
+
* content that has no sidecar yet (orphan files, duplicate-id collisions,
|
|
244
|
+
* legacy top-level-id files), which the doctor rules that walk "the
|
|
245
|
+
* content tree" depend on. A lane that declares no `scaffoldDefaults`
|
|
246
|
+
* contributes nothing. Malformed lane files are skipped (loadLaneConfig
|
|
247
|
+
* throws — other doctor rules surface those).
|
|
248
|
+
*/
|
|
249
|
+
function collectLaneScaffoldDirs(projectRoot) {
|
|
250
|
+
const roots = new Set();
|
|
251
|
+
for (const laneId of listLaneConfigs(projectRoot, { includeArchived: true })) {
|
|
252
|
+
let lane;
|
|
253
|
+
try {
|
|
254
|
+
lane = loadLaneConfig(laneId, projectRoot);
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
187
257
|
continue;
|
|
188
|
-
|
|
189
|
-
|
|
258
|
+
}
|
|
259
|
+
const scaffold = lane.scaffoldDefaults;
|
|
260
|
+
if (scaffold === undefined)
|
|
190
261
|
continue;
|
|
262
|
+
for (const dir of Object.values(scaffold)) {
|
|
263
|
+
if (typeof dir === 'string' && dir.length > 0) {
|
|
264
|
+
roots.add(join(projectRoot, dir));
|
|
265
|
+
}
|
|
191
266
|
}
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
267
|
+
}
|
|
268
|
+
return [...roots];
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* The studio content-browser discovery roots (Phase 39c, c5 — sites→lanes
|
|
272
|
+
* retirement, Decision #21): the de-duplicated, SORTED union of every
|
|
273
|
+
* configured lane's `scaffoldDefaults` directories, resolved to absolute
|
|
274
|
+
* paths. Reuses the doctor's `collectLaneScaffoldDirs` pattern so the
|
|
275
|
+
* content browser walks the same add-time content roots the sidecar index
|
|
276
|
+
* already discovers — introducing no new "location-as-key" coupling
|
|
277
|
+
* (`scaffoldDefaults` stays a convenience/discovery field per Decision #5;
|
|
278
|
+
* per-entry resolution remains `entry.artifactPath` only).
|
|
279
|
+
*
|
|
280
|
+
* Archived lanes are included (matching the doctor's discovery) so content
|
|
281
|
+
* under a lane that was later archived stays visible in the browser.
|
|
282
|
+
* Malformed lane files are skipped (other doctor rules surface those).
|
|
283
|
+
*/
|
|
284
|
+
export function collectContentRoots(projectRoot) {
|
|
285
|
+
return collectLaneScaffoldDirs(projectRoot).sort();
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* The discovery roots for the sidecar-driven content index (Phase 39c):
|
|
289
|
+
* the union of (a) every entry's resolved artifact DIRECTORY and (b)
|
|
290
|
+
* every lane's `scaffoldDefaults` directory. (a) finds bound content;
|
|
291
|
+
* (b) finds not-yet-bound content (orphans / duplicates / legacy ids)
|
|
292
|
+
* sitting in a lane's add-time content root. Returns absolute paths,
|
|
293
|
+
* de-duplicated and sorted for deterministic walks.
|
|
294
|
+
*/
|
|
295
|
+
export async function collectSidecarArtifactDirs(projectRoot) {
|
|
296
|
+
// Use the PARTITIONED reader: a corrupt sidecar must NOT abort index
|
|
297
|
+
// construction. The doctor builds this index at the start of every run
|
|
298
|
+
// (`runner.ts` `buildContext`); a throwing reader here would crash the
|
|
299
|
+
// whole audit before any rule executes — including the rules whose job
|
|
300
|
+
// is to surface the corruption gracefully (sites-to-lanes-migration's
|
|
301
|
+
// AUDIT-20260603-14 error-finding path). Malformed sidecars contribute
|
|
302
|
+
// no discovery root; the rules report them.
|
|
303
|
+
const { entries } = await readAllSidecarsPartitioned(projectRoot);
|
|
304
|
+
const roots = new Set();
|
|
305
|
+
for (const entry of entries) {
|
|
306
|
+
if (entry.artifactPath === undefined || entry.artifactPath === '')
|
|
307
|
+
continue;
|
|
308
|
+
const absArtifact = join(projectRoot, entry.artifactPath);
|
|
309
|
+
roots.add(dirname(absArtifact));
|
|
310
|
+
}
|
|
311
|
+
for (const dir of collectLaneScaffoldDirs(projectRoot)) {
|
|
312
|
+
roots.add(dir);
|
|
313
|
+
}
|
|
314
|
+
return [...roots].sort();
|
|
315
|
+
}
|
|
316
|
+
export async function buildContentIndexFromSidecars(projectRoot) {
|
|
317
|
+
const roots = await collectSidecarArtifactDirs(projectRoot);
|
|
318
|
+
const byId = new Map();
|
|
319
|
+
const byPath = new Map();
|
|
320
|
+
const invalid = [];
|
|
321
|
+
const files = new Set();
|
|
322
|
+
for (const root of roots) {
|
|
323
|
+
for (const abs of collectMarkdownFiles(root)) {
|
|
324
|
+
files.add(abs);
|
|
200
325
|
}
|
|
201
|
-
byPath.set(rel, lookup.id);
|
|
202
326
|
}
|
|
327
|
+
// Deterministic order: sort so byId's first-wins on a duplicate id is
|
|
328
|
+
// stable across runs (mirrors buildContentIndex's sorted walk).
|
|
329
|
+
bindFilesToIndex([...files].sort(), projectRoot, byId, byPath, invalid);
|
|
203
330
|
return { byId, byPath, invalid };
|
|
204
331
|
}
|
|
205
332
|
//# sourceMappingURL=content-index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-index.js","sourceRoot":"","sources":["../src/content-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"content-index.js","sourceRoot":"","sources":["../src/content-index.ts"],"names":[],"mappings":"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"}
|
package/dist/doctor/index.d.ts
CHANGED
|
@@ -9,4 +9,7 @@ export type { DoctorContext, DoctorInteraction, DoctorReport, DoctorRule, Findin
|
|
|
9
9
|
export { RULES, parseFixArgument, runAudit, runRepair, yesInteraction, declineInteraction, type DoctorRunOptions, } from './runner.ts';
|
|
10
10
|
export { printSchemaPatchInstructions } from './schema-patch.ts';
|
|
11
11
|
export { migrateLaneMembership, type LaneMigrationResult, type LaneMigrationOptions, } from './lane-migration.ts';
|
|
12
|
+
export { default as sitesToLanesMigrationRule } from './rules/sites-to-lanes-migration.ts';
|
|
13
|
+
export { backfillFromLegacySites, detectAmbiguousBackfills, type AmbiguousBackfill, type BackfillResult, } from './sites-migration-backfill.ts';
|
|
14
|
+
export { readLegacySites, dropSitesBlock, type LegacySite, type LegacySites, } from './legacy-config.ts';
|
|
12
15
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/doctor/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,UAAU,EACV,OAAO,EACP,eAAe,EACf,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,KAAK,EACL,gBAAgB,EAChB,QAAQ,EACR,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AAEjE,OAAO,EACL,qBAAqB,EACrB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,GAC1B,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/doctor/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,UAAU,EACV,OAAO,EACP,eAAe,EACf,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,KAAK,EACL,gBAAgB,EAChB,QAAQ,EACR,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AAEjE,OAAO,EACL,qBAAqB,EACrB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,GAC1B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAE3F,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,KAAK,iBAAiB,EACtB,KAAK,cAAc,GACpB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,eAAe,EACf,cAAc,EACd,KAAK,UAAU,EACf,KAAK,WAAW,GACjB,MAAM,oBAAoB,CAAC"}
|
package/dist/doctor/index.js
CHANGED
|
@@ -8,4 +8,7 @@
|
|
|
8
8
|
export { RULES, parseFixArgument, runAudit, runRepair, yesInteraction, declineInteraction, } from "./runner.js";
|
|
9
9
|
export { printSchemaPatchInstructions } from "./schema-patch.js";
|
|
10
10
|
export { migrateLaneMembership, } from "./lane-migration.js";
|
|
11
|
+
export { default as sitesToLanesMigrationRule } from "./rules/sites-to-lanes-migration.js";
|
|
12
|
+
export { backfillFromLegacySites, detectAmbiguousBackfills, } from "./sites-migration-backfill.js";
|
|
13
|
+
export { readLegacySites, dropSitesBlock, } from "./legacy-config.js";
|
|
11
14
|
//# sourceMappingURL=index.js.map
|
package/dist/doctor/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/doctor/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAeH,OAAO,EACL,KAAK,EACL,gBAAgB,EAChB,QAAQ,EACR,SAAS,EACT,cAAc,EACd,kBAAkB,GAEnB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AAEjE,OAAO,EACL,qBAAqB,GAGtB,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/doctor/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAeH,OAAO,EACL,KAAK,EACL,gBAAgB,EAChB,QAAQ,EACR,SAAS,EACT,cAAc,EACd,kBAAkB,GAEnB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AAEjE,OAAO,EACL,qBAAqB,GAGtB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAE3F,OAAO,EACL,uBAAuB,EACvB,wBAAwB,GAGzB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,eAAe,EACf,cAAc,GAGf,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration-only tolerant reader for the legacy `config.sites` block
|
|
3
|
+
* (Phase 39b; finalized in 39c as the sole home for `SiteConfig`).
|
|
4
|
+
*
|
|
5
|
+
* Per the sites→lanes retirement spec §"Migration":
|
|
6
|
+
*
|
|
7
|
+
* > `sites` reads are tolerated *only* inside this migration. After it
|
|
8
|
+
* > runs, nothing reads `sites`.
|
|
9
|
+
*
|
|
10
|
+
* This module is that tolerated read surface. It parses the on-disk
|
|
11
|
+
* `.deskwork/config.json` directly and extracts just the fields the
|
|
12
|
+
* migration needs (`sites.<id>.{contentDir, calendarPath, host}`),
|
|
13
|
+
* WITHOUT going through `parseConfig`. `parseConfig` strips the legacy
|
|
14
|
+
* fields the migration consumes (it surfaces only the typed `SiteConfig`
|
|
15
|
+
* subset and, post-migration, tolerates an absent `sites` by normalizing
|
|
16
|
+
* it to `{}` — AUDIT-20260603-11), so the migration reads the raw JSON
|
|
17
|
+
* directly to see the legacy block verbatim. It must read both shapes:
|
|
18
|
+
*
|
|
19
|
+
* - pre-migration (`sites` present) → returns the legacy sites map.
|
|
20
|
+
* - post-migration (`sites` absent) → returns an EMPTY map, the
|
|
21
|
+
* "nothing to migrate" signal the rule's idempotency relies on.
|
|
22
|
+
*
|
|
23
|
+
* 39b keeps the field present in the live schema; this reader exists so
|
|
24
|
+
* the migration does not depend on the live schema's required-`sites`
|
|
25
|
+
* invariant. 39c moves `SiteConfig` here and removes the live-schema
|
|
26
|
+
* `sites` field; until then this is a focused, additive read helper.
|
|
27
|
+
*
|
|
28
|
+
* Sibling-relative imports per the doctor convention (`@/` does not
|
|
29
|
+
* resolve under tsx at runtime in this package's `src/`).
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* The legacy per-site fields the migration consumes. A subset of the
|
|
33
|
+
* full `SiteConfig` — only what lanes-from-sites + the host/redirects
|
|
34
|
+
* re-home need. Other legacy fields (`blogLayout`, …) are not read by
|
|
35
|
+
* the migration and are intentionally not surfaced here.
|
|
36
|
+
*/
|
|
37
|
+
export interface LegacySite {
|
|
38
|
+
/** Content directory, relative to the project root (or absolute). */
|
|
39
|
+
readonly contentDir: string;
|
|
40
|
+
/** Editorial calendar markdown path (vestigial under Phase 30). */
|
|
41
|
+
readonly calendarPath?: string;
|
|
42
|
+
/** Bare public hostname — re-homed onto the lane's `host`. */
|
|
43
|
+
readonly host?: string;
|
|
44
|
+
/**
|
|
45
|
+
* Netlify-style `_redirects` file path — re-homed onto the lane's
|
|
46
|
+
* `redirectsPath` (Phase 39c, spec Decision #23). Website-publishing
|
|
47
|
+
* metadata; carried forward only when present on the legacy site.
|
|
48
|
+
*/
|
|
49
|
+
readonly redirectsPath?: string;
|
|
50
|
+
}
|
|
51
|
+
/** A legacy site keyed by its slug (the lane id the migration creates). */
|
|
52
|
+
export interface LegacySites {
|
|
53
|
+
readonly sites: ReadonlyMap<string, LegacySite>;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Read the legacy `sites` block from `<projectRoot>/.deskwork/config.json`
|
|
57
|
+
* tolerantly.
|
|
58
|
+
*
|
|
59
|
+
* - Config file ABSENT (ENOENT — never installed, or a bare fixture) →
|
|
60
|
+
* returns an empty map. A project with no config has no legacy sites
|
|
61
|
+
* to migrate; the rule no-ops. This mirrors `bootstrap.ts`'s
|
|
62
|
+
* "no-config → nothing to do" branch and keeps the migration rule
|
|
63
|
+
* safe to run unconditionally across the doctor's per-site loop.
|
|
64
|
+
* - Config PRESENT but unreadable (non-ENOENT I/O) / not valid JSON →
|
|
65
|
+
* throws. A config that exists but is broken should surface loudly
|
|
66
|
+
* where the operator can fix it (AUDIT-20260530-10 precedent;
|
|
67
|
+
* silently treating it as "no sites" would mask a real config-side
|
|
68
|
+
* problem — the project's "no fallbacks" rule).
|
|
69
|
+
* - Config present but no `sites` block (the post-migration shape) →
|
|
70
|
+
* returns an empty map. This is the idempotency signal: nothing to
|
|
71
|
+
* migrate.
|
|
72
|
+
* - `sites` present → returns each site's `{ contentDir, calendarPath,
|
|
73
|
+
* host, redirectsPath }`. A site missing a non-empty `contentDir`
|
|
74
|
+
* throws (the migration cannot derive `scaffoldDefaults` without it).
|
|
75
|
+
*
|
|
76
|
+
* @throws when a PRESENT config is unreadable / not JSON, or a declared
|
|
77
|
+
* site lacks a non-empty `contentDir`.
|
|
78
|
+
*/
|
|
79
|
+
export declare function readLegacySites(projectRoot: string): LegacySites;
|
|
80
|
+
/**
|
|
81
|
+
* Rewrite `<projectRoot>/.deskwork/config.json` with the `sites` and
|
|
82
|
+
* `defaultSite` keys removed (migration step 3 — "drop sites"). Every
|
|
83
|
+
* other top-level key is preserved verbatim. A no-op when neither key
|
|
84
|
+
* is present (idempotent).
|
|
85
|
+
*
|
|
86
|
+
* Returns `true` when the file was rewritten (a key was dropped),
|
|
87
|
+
* `false` when there was nothing to drop.
|
|
88
|
+
*
|
|
89
|
+
* Note: `parseConfig` tolerates the resulting `sites`-less config
|
|
90
|
+
* (AUDIT-20260603-11 — an absent/empty `sites` normalizes to `{}`), so a
|
|
91
|
+
* migrated project still loads through `readConfig` and every
|
|
92
|
+
* config-reading command keeps working between 39b and 39c. 39c removes
|
|
93
|
+
* the `sites` field from the schema entirely; until then the migration's
|
|
94
|
+
* own `sites` reads go through `readLegacySites` (this module), which
|
|
95
|
+
* does not depend on the live schema's shape.
|
|
96
|
+
*/
|
|
97
|
+
export declare function dropSitesBlock(projectRoot: string): boolean;
|
|
98
|
+
//# sourceMappingURL=legacy-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-config.d.ts","sourceRoot":"","sources":["../../src/doctor/legacy-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAKH;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,qEAAqE;IACrE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,mEAAmE;IACnE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,2EAA2E;AAC3E,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACjD;AAaD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CAmFhE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAsB3D"}
|