@dogsbay/commands 0.2.0-beta.101

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 (86) hide show
  1. package/README.md +137 -0
  2. package/dist/commands/content.d.ts +78 -0
  3. package/dist/commands/content.d.ts.map +1 -0
  4. package/dist/commands/content.js +634 -0
  5. package/dist/commands/content.js.map +1 -0
  6. package/dist/commands/examples.d.ts +49 -0
  7. package/dist/commands/examples.d.ts.map +1 -0
  8. package/dist/commands/examples.js +173 -0
  9. package/dist/commands/examples.js.map +1 -0
  10. package/dist/commands/keys.d.ts +14 -0
  11. package/dist/commands/keys.d.ts.map +1 -0
  12. package/dist/commands/keys.js +87 -0
  13. package/dist/commands/keys.js.map +1 -0
  14. package/dist/commands/link-retarget.d.ts +18 -0
  15. package/dist/commands/link-retarget.d.ts.map +1 -0
  16. package/dist/commands/link-retarget.js +104 -0
  17. package/dist/commands/link-retarget.js.map +1 -0
  18. package/dist/commands/refactor-files.d.ts +27 -0
  19. package/dist/commands/refactor-files.d.ts.map +1 -0
  20. package/dist/commands/refactor-files.js +264 -0
  21. package/dist/commands/refactor-files.js.map +1 -0
  22. package/dist/commands/refactor-keys.d.ts +21 -0
  23. package/dist/commands/refactor-keys.d.ts.map +1 -0
  24. package/dist/commands/refactor-keys.js +224 -0
  25. package/dist/commands/refactor-keys.js.map +1 -0
  26. package/dist/commands/refactor-structure.d.ts +19 -0
  27. package/dist/commands/refactor-structure.d.ts.map +1 -0
  28. package/dist/commands/refactor-structure.js +314 -0
  29. package/dist/commands/refactor-structure.js.map +1 -0
  30. package/dist/commands/reindex.d.ts +10 -0
  31. package/dist/commands/reindex.d.ts.map +1 -0
  32. package/dist/commands/reindex.js +23 -0
  33. package/dist/commands/reindex.js.map +1 -0
  34. package/dist/commands/topicmap-edit.d.ts +65 -0
  35. package/dist/commands/topicmap-edit.d.ts.map +1 -0
  36. package/dist/commands/topicmap-edit.js +194 -0
  37. package/dist/commands/topicmap-edit.js.map +1 -0
  38. package/dist/commands/topicmap.d.ts +13 -0
  39. package/dist/commands/topicmap.d.ts.map +1 -0
  40. package/dist/commands/topicmap.js +69 -0
  41. package/dist/commands/topicmap.js.map +1 -0
  42. package/dist/commands/validate.d.ts +13 -0
  43. package/dist/commands/validate.d.ts.map +1 -0
  44. package/dist/commands/validate.js +753 -0
  45. package/dist/commands/validate.js.map +1 -0
  46. package/dist/commands/where-used.d.ts +16 -0
  47. package/dist/commands/where-used.d.ts.map +1 -0
  48. package/dist/commands/where-used.js +83 -0
  49. package/dist/commands/where-used.js.map +1 -0
  50. package/dist/edits.d.ts +54 -0
  51. package/dist/edits.d.ts.map +1 -0
  52. package/dist/edits.js +158 -0
  53. package/dist/edits.js.map +1 -0
  54. package/dist/engine.d.ts +103 -0
  55. package/dist/engine.d.ts.map +1 -0
  56. package/dist/engine.js +115 -0
  57. package/dist/engine.js.map +1 -0
  58. package/dist/flags.d.ts +31 -0
  59. package/dist/flags.d.ts.map +1 -0
  60. package/dist/flags.js +73 -0
  61. package/dist/flags.js.map +1 -0
  62. package/dist/frontmatter-schema.d.ts +97 -0
  63. package/dist/frontmatter-schema.d.ts.map +1 -0
  64. package/dist/frontmatter-schema.js +240 -0
  65. package/dist/frontmatter-schema.js.map +1 -0
  66. package/dist/index.d.ts +35 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +70 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/indexes.d.ts +175 -0
  71. package/dist/indexes.d.ts.map +1 -0
  72. package/dist/indexes.js +536 -0
  73. package/dist/indexes.js.map +1 -0
  74. package/dist/json-schema.d.ts +10 -0
  75. package/dist/json-schema.d.ts.map +1 -0
  76. package/dist/json-schema.js +50 -0
  77. package/dist/json-schema.js.map +1 -0
  78. package/dist/storage.d.ts +68 -0
  79. package/dist/storage.d.ts.map +1 -0
  80. package/dist/storage.js +193 -0
  81. package/dist/storage.js.map +1 -0
  82. package/dist/workspace.d.ts +30 -0
  83. package/dist/workspace.d.ts.map +1 -0
  84. package/dist/workspace.js +63 -0
  85. package/dist/workspace.js.map +1 -0
  86. package/package.json +47 -0
@@ -0,0 +1,264 @@
1
+ /**
2
+ * File-level refactor commands: rename-file, safe-delete,
3
+ * extract-include. Reuse-safe by construction — every mutation is an
4
+ * index lookup plus surgical text edits, and inbound references are
5
+ * rewritten in the same run (see edits.ts).
6
+ */
7
+ import { z } from "zod";
8
+ import { fenceOpenBefore } from "@dogsbay/format-dogsbay-md";
9
+ import { dirname } from "@dogsbay/format-topicmap";
10
+ import { normalizeStoragePath } from "../storage.js";
11
+ import { relativeHref, replaceLinkHrefs, replaceIncludePaths, replaceMapHref, rewriteInboundRefs, splitFrontmatter, } from "../edits.js";
12
+ import { defineCommand } from "../engine.js";
13
+ import { contentHash } from "./content.js";
14
+ const fail = (code, message, file) => ({
15
+ data: { applied: false },
16
+ issues: [{ severity: "error", code, message, ...(file ? { file } : {}) }],
17
+ summary: message,
18
+ });
19
+ /** Unrewritable references become warnings — never a silent miss. */
20
+ export const missIssues = (misses) => misses.map((ref) => ({
21
+ severity: "warning",
22
+ code: "reference-not-rewritten",
23
+ message: `${ref.kind} reference "${ref.raw}" could not be located for rewriting — update it manually`,
24
+ file: ref.from,
25
+ }));
26
+ const isExternal = (href) => /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(href);
27
+ /** Batched replaceMapHref with the same anti-cross-talk placeholders. */
28
+ const replaceMapHrefs = (source, pairs) => {
29
+ let out = source;
30
+ const entries = [...pairs.entries()];
31
+ entries.forEach(([oldHref], i) => {
32
+ out = replaceMapHref(out, oldHref, "\u0000" + i + "\u0000");
33
+ });
34
+ entries.forEach(([, newHref], i) => {
35
+ out = out.split("\u0000" + i + "\u0000").join(newHref);
36
+ });
37
+ return out;
38
+ };
39
+ export const renameFileCommand = defineCommand({
40
+ name: "rename-file",
41
+ writes: "structure",
42
+ description: "Move/rename a file and rewrite every inbound reference (links, includes, topic maps)",
43
+ input: z
44
+ .object({
45
+ from: z.string().min(1).describe("Current workspace-relative path"),
46
+ to: z.string().min(1).describe("New workspace-relative path"),
47
+ })
48
+ .strict(),
49
+ positionals: ["from", "to"],
50
+ async run(ctx, input) {
51
+ const from = normalizeStoragePath(input.from);
52
+ const to = normalizeStoragePath(input.to);
53
+ const { storage } = ctx.workspace;
54
+ if (from === to)
55
+ return fail("rename-noop", "from and to are the same path");
56
+ if (!(await storage.exists(from)))
57
+ return fail("rename-source-missing", `${from} does not exist`);
58
+ if (await storage.exists(to))
59
+ return fail("rename-target-exists", `${to} already exists`);
60
+ const index = await ctx.workspace.index();
61
+ let content = await storage.read(from);
62
+ // The moved doc's own outbound references keep pointing at their
63
+ // (unmoved) targets from the file's NEW location
64
+ const doc = index.docs.get(from);
65
+ if (doc) {
66
+ const newDir = dirname(to);
67
+ const linkPairs = new Map();
68
+ for (const link of doc.links) {
69
+ if (!link.target || link.href.startsWith("#"))
70
+ continue;
71
+ const target = link.target === from ? to : link.target;
72
+ const fragment = link.fragment ? `#${link.fragment}` : "";
73
+ const newHref = relativeHref(newDir, target) + fragment;
74
+ if (newHref !== link.href)
75
+ linkPairs.set(link.href, newHref);
76
+ }
77
+ content = replaceLinkHrefs(content, linkPairs);
78
+ const includePairs = new Map();
79
+ for (const include of doc.includes) {
80
+ const newPath = relativeHref(newDir, include.target);
81
+ if (newPath !== include.raw)
82
+ includePairs.set(include.raw, newPath);
83
+ }
84
+ content = replaceIncludePaths(content, includePairs);
85
+ }
86
+ // A moved topic map or keys file must keep addressing ITS targets
87
+ // from the new location — rebase its own href entries too
88
+ const movedMap = index.maps.get(from);
89
+ if (movedMap && dirname(to) !== dirname(from)) {
90
+ const pairs = new Map();
91
+ for (const ref of movedMap.refs) {
92
+ if (!ref.target)
93
+ continue;
94
+ const newHref = relativeHref(dirname(to), ref.target);
95
+ if (newHref !== ref.href)
96
+ pairs.set(ref.href, newHref);
97
+ }
98
+ content = replaceMapHrefs(content, pairs);
99
+ }
100
+ const ownKeyDefs = [...index.keys.values()].flat().filter((def) => def.file === from);
101
+ if (ownKeyDefs.length > 0 && dirname(to) !== dirname(from)) {
102
+ const pairs = new Map();
103
+ for (const def of ownKeyDefs) {
104
+ const href = def.def.href;
105
+ if (typeof href !== "string" || isExternal(href))
106
+ continue;
107
+ const target = normalizeStoragePath(`${dirname(from)}/${href}`);
108
+ const newHref = relativeHref(dirname(to), target);
109
+ if (newHref !== href)
110
+ pairs.set(href, newHref);
111
+ }
112
+ content = replaceMapHrefs(content, pairs);
113
+ }
114
+ const { changed, misses } = await rewriteInboundRefs(ctx.workspace, index, from, (ref) => {
115
+ const fragment = ref.fragment ? `#${ref.fragment}` : "";
116
+ return relativeHref(dirname(ref.from), to) + fragment;
117
+ });
118
+ const issues = missIssues(misses);
119
+ // Key definitions addressing the moved file follow it — the key
120
+ // keeps resolving (safe-delete treats these as referrers; so do we)
121
+ const keyEditsByFile = new Map();
122
+ for (const defs of index.keys.values()) {
123
+ for (const def of defs) {
124
+ if (def.file === from)
125
+ continue; // rebased above, moves with the file
126
+ const href = def.def.href;
127
+ if (typeof href !== "string" || isExternal(href))
128
+ continue;
129
+ if (normalizeStoragePath(`${dirname(def.file)}/${href}`) !== from)
130
+ continue;
131
+ const pairs = keyEditsByFile.get(def.file) ?? new Map();
132
+ pairs.set(href, relativeHref(dirname(def.file), to));
133
+ keyEditsByFile.set(def.file, pairs);
134
+ }
135
+ }
136
+ for (const [keysFile, pairs] of keyEditsByFile) {
137
+ const source = await storage.read(keysFile);
138
+ const updated = replaceMapHrefs(source, pairs);
139
+ if (updated !== source) {
140
+ await storage.write(keysFile, updated);
141
+ changed.push(keysFile);
142
+ }
143
+ }
144
+ await storage.write(to, content);
145
+ await storage.delete(from);
146
+ ctx.workspace.invalidate();
147
+ return {
148
+ data: { applied: true, from, to, rewrittenFiles: changed },
149
+ issues,
150
+ summary: `${from} → ${to} (${changed.length} referencing file(s) updated)`,
151
+ };
152
+ },
153
+ });
154
+ export const safeDeleteCommand = defineCommand({
155
+ name: "safe-delete",
156
+ writes: "structure",
157
+ description: "Delete a file only when nothing references it (links, includes, topic maps, keys)",
158
+ input: z
159
+ .object({
160
+ file: z.string().min(1).describe("Workspace-relative path to delete"),
161
+ force: z.boolean().optional().describe("Delete even when referenced (referrers become issues)"),
162
+ })
163
+ .strict(),
164
+ positionals: ["file"],
165
+ async run(ctx, input) {
166
+ const file = normalizeStoragePath(input.file);
167
+ const { storage } = ctx.workspace;
168
+ if (!(await storage.exists(file)))
169
+ return fail("delete-source-missing", `${file} does not exist`);
170
+ const index = await ctx.workspace.index();
171
+ const referrers = (index.inbound.get(file) ?? []).map((ref) => ({
172
+ severity: input.force ? "warning" : "error",
173
+ code: input.force ? "delete-broke-reference" : "delete-blocked",
174
+ message: `${ref.kind} reference "${ref.raw}" targets ${file}`,
175
+ file: ref.from,
176
+ }));
177
+ // Key definitions pointing at the file block deletion too
178
+ for (const defs of index.keys.values()) {
179
+ for (const def of defs) {
180
+ const href = def.def.href;
181
+ if (typeof href !== "string" || /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(href))
182
+ continue;
183
+ const resolved = normalizeStoragePath(`${dirname(def.file)}/${href}`);
184
+ if (resolved === file) {
185
+ referrers.push({
186
+ severity: input.force ? "warning" : "error",
187
+ code: input.force ? "delete-broke-reference" : "delete-blocked",
188
+ message: `key "${def.name}" href targets ${file}`,
189
+ file: def.file,
190
+ });
191
+ }
192
+ }
193
+ }
194
+ if (referrers.length > 0 && !input.force) {
195
+ return {
196
+ data: { applied: false, referrers: referrers.length },
197
+ issues: referrers,
198
+ summary: `${file} is referenced ${referrers.length} time(s) — not deleted (use --force to override)`,
199
+ };
200
+ }
201
+ await storage.delete(file);
202
+ ctx.workspace.invalidate();
203
+ return {
204
+ data: { applied: true, file, brokenReferences: referrers.length },
205
+ issues: referrers,
206
+ summary: referrers.length > 0
207
+ ? `${file} deleted — ${referrers.length} reference(s) now broken`
208
+ : `${file} deleted (no references)`,
209
+ };
210
+ },
211
+ });
212
+ export const extractIncludeCommand = defineCommand({
213
+ name: "extract-include",
214
+ writes: "content",
215
+ description: "Extract a line range into a reusable snippet and replace it with {% include %}",
216
+ input: z
217
+ .object({
218
+ file: z.string().min(1).describe("Workspace-relative .md path"),
219
+ start: z.number().int().min(1).describe("First line of the range (1-based, inclusive)"),
220
+ end: z.number().int().min(1).describe("Last line of the range (1-based, inclusive)"),
221
+ snippet: z.string().min(1).describe("Workspace-relative path for the new snippet file"),
222
+ expect: z.string().optional().describe("Divergence gate: the file's `fileHash` from topic-read (a LINE RANGE is only meaningful against the text it was read from)"),
223
+ })
224
+ .strict(),
225
+ positionals: ["file"],
226
+ async run(ctx, input) {
227
+ const file = normalizeStoragePath(input.file);
228
+ const snippet = normalizeStoragePath(input.snippet);
229
+ const { storage } = ctx.workspace;
230
+ if (!(await storage.exists(file)))
231
+ return fail("extract-source-missing", `${file} does not exist`);
232
+ if (await storage.exists(snippet))
233
+ return fail("extract-snippet-exists", `${snippet} already exists`);
234
+ const content = await storage.read(file);
235
+ if (input.expect !== undefined && input.expect !== contentHash(content)) {
236
+ return fail("stale-expect", `${file} changed since it was read; the line range no longer means what it did. Re-read it with topic-read.`, file);
237
+ }
238
+ const lines = content.split("\n");
239
+ if (input.end < input.start || input.end > lines.length) {
240
+ return fail("extract-range-invalid", `line range ${input.start}..${input.end} is out of bounds (${lines.length} lines)`, file);
241
+ }
242
+ // The frontmatter block is metadata, not extractable content
243
+ const [frontmatterBlock] = splitFrontmatter(content);
244
+ const frontmatterLines = frontmatterBlock === "" ? 0 : frontmatterBlock.split("\n").length - 1;
245
+ if (input.start <= frontmatterLines) {
246
+ return fail("extract-range-in-frontmatter", `line range ${input.start}..${input.end} overlaps the frontmatter block (lines 1..${frontmatterLines})`, file);
247
+ }
248
+ const openBefore = fenceOpenBefore(content);
249
+ if (openBefore[input.start - 1] || openBefore[input.end]) {
250
+ return fail("extract-range-splits-fence", `line range ${input.start}..${input.end} starts or ends inside a code fence`, file);
251
+ }
252
+ const extracted = lines.slice(input.start - 1, input.end);
253
+ const include = `{% include "${relativeHref(dirname(file), snippet)}" %}`;
254
+ const updated = [...lines.slice(0, input.start - 1), include, ...lines.slice(input.end)];
255
+ await storage.write(snippet, `${extracted.join("\n").replace(/\s+$/, "")}\n`);
256
+ await storage.write(file, updated.join("\n"));
257
+ ctx.workspace.invalidate();
258
+ return {
259
+ data: { applied: true, file, snippet, lines: extracted.length },
260
+ summary: `${extracted.length} line(s) → ${snippet}, replaced with an include`,
261
+ };
262
+ },
263
+ });
264
+ //# sourceMappingURL=refactor-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refactor-files.js","sourceRoot":"","sources":["../../src/commands/refactor-files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Key-space refactor commands: rename-key, keyify.
3
+ *
4
+ * Documents are edited through the prose walk (editMarkdownProse), so
5
+ * `key:` links and `{{ var }}` examples inside code fences/spans are
6
+ * never rewritten. Keys files are edited TEXTUALLY first (comments and
7
+ * unrelated content survive); only when the textual edit can't locate
8
+ * the entry does the YAML load/dump fallback run — with a warning,
9
+ * because dump normalizes formatting and drops comments.
10
+ */
11
+ import { z } from "zod";
12
+ export declare const renameKeyCommand: import("../engine.js").CommandDef<z.ZodObject<{
13
+ from: z.ZodString;
14
+ to: z.ZodString;
15
+ }, z.core.$strict>>;
16
+ export declare const keyifyCommand: import("../engine.js").CommandDef<z.ZodObject<{
17
+ file: z.ZodString;
18
+ key: z.ZodString;
19
+ keysFile: z.ZodOptional<z.ZodString>;
20
+ }, z.core.$strict>>;
21
+ //# sourceMappingURL=refactor-keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refactor-keys.d.ts","sourceRoot":"","sources":["../../src/commands/refactor-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA0BxB,eAAO,MAAM,gBAAgB;;;mBAyF3B,CAAC;AAEH,eAAO,MAAM,aAAa;;;;mBA4GxB,CAAC"}
@@ -0,0 +1,224 @@
1
+ /**
2
+ * Key-space refactor commands: rename-key, keyify.
3
+ *
4
+ * Documents are edited through the prose walk (editMarkdownProse), so
5
+ * `key:` links and `{{ var }}` examples inside code fences/spans are
6
+ * never rewritten. Keys files are edited TEXTUALLY first (comments and
7
+ * unrelated content survive); only when the textual edit can't locate
8
+ * the entry does the YAML load/dump fallback run — with a warning,
9
+ * because dump normalizes formatting and drops comments.
10
+ */
11
+ import { z } from "zod";
12
+ import { load as loadYaml, dump as dumpYaml } from "js-yaml";
13
+ import { dirname } from "@dogsbay/format-topicmap";
14
+ import { normalizeStoragePath } from "../storage.js";
15
+ import { relativeHref, editMarkdownProse } from "../edits.js";
16
+ import { defineCommand } from "../engine.js";
17
+ const fail = (code, message, file) => ({
18
+ data: { applied: false },
19
+ issues: [{ severity: "error", code, message, ...(file ? { file } : {}) }],
20
+ summary: message,
21
+ });
22
+ const escapeRegExp = (text) => text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
23
+ /**
24
+ * Rename a key's entry line in a keys file, preserving everything else
25
+ * (comments included). Matches the generated two-space/tab indent
26
+ * convention; returns null when the entry can't be located textually.
27
+ */
28
+ const renameKeyEntryLine = (source, from, to) => {
29
+ const entryRe = new RegExp(`^((?: |\\t))${escapeRegExp(from)}:(?=\\s|$)`, "m");
30
+ if (!entryRe.test(source))
31
+ return null;
32
+ return source.replace(entryRe, `$1${to}:`);
33
+ };
34
+ export const renameKeyCommand = defineCommand({
35
+ name: "rename-key",
36
+ writes: "structure",
37
+ description: "Rename a key across keys files, key: links, and {{ variable }} references",
38
+ input: z
39
+ .object({
40
+ from: z.string().min(1).describe("Current key name"),
41
+ to: z.string().min(1).describe("New key name"),
42
+ })
43
+ .strict(),
44
+ positionals: ["from", "to"],
45
+ async run(ctx, { from, to }) {
46
+ const index = await ctx.workspace.index();
47
+ const defs = index.keys.get(from);
48
+ if (!defs || defs.length === 0)
49
+ return fail("key-undefined", `key "${from}" is not defined`);
50
+ if (index.keys.has(to))
51
+ return fail("key-conflict", `key "${to}" already exists`);
52
+ const { storage } = ctx.workspace;
53
+ const issues = [];
54
+ // Definitions: textual entry rename first (comments survive);
55
+ // YAML round-trip only as a flagged fallback
56
+ const defFiles = [...new Set(defs.map((def) => def.file))];
57
+ for (const file of defFiles) {
58
+ const source = await storage.read(file);
59
+ const textual = renameKeyEntryLine(source, from, to);
60
+ if (textual !== null) {
61
+ await storage.write(file, textual);
62
+ continue;
63
+ }
64
+ const raw = loadYaml(source);
65
+ const newKeys = {};
66
+ for (const [name, def] of Object.entries(raw?.keys ?? {})) {
67
+ newKeys[name === from ? to : name] = def;
68
+ }
69
+ await storage.write(file, dumpYaml({ keys: newKeys }));
70
+ issues.push({
71
+ severity: "warning",
72
+ code: "keys-file-normalized",
73
+ message: `"${from}" could not be renamed textually — ${file} was rewritten via YAML round-trip (comments/formatting lost)`,
74
+ file,
75
+ });
76
+ }
77
+ // key: links in documents (prose only — fenced examples untouched)
78
+ const linkRe = new RegExp(`\\]\\(\\s*key:${escapeRegExp(from)}(?=[#)\\s])`, "g");
79
+ const updatedDocs = [];
80
+ for (const docPath of index.keyUses.get(from) ?? []) {
81
+ const source = await storage.read(docPath);
82
+ const updated = editMarkdownProse(source, (prose) => prose.replace(linkRe, (match) => match.replace(`key:${from}`, `key:${to}`)));
83
+ if (updated !== source) {
84
+ await storage.write(docPath, updated);
85
+ updatedDocs.push(docPath);
86
+ }
87
+ }
88
+ // {{ from }} minja text references (the TEXT-key reuse form the DITA
89
+ // importer emits). Variable names are shared with build attributes,
90
+ // so renames here are flagged for a human sanity check.
91
+ const varRe = new RegExp(`\\{\\{\\s*${escapeRegExp(from)}\\s*\\}\\}`, "g");
92
+ let variableRefs = 0;
93
+ for (const doc of index.docs.values()) {
94
+ const source = await storage.read(doc.path);
95
+ const updated = editMarkdownProse(source, (prose) => {
96
+ const matches = prose.match(varRe);
97
+ if (matches)
98
+ variableRefs += matches.length;
99
+ return prose.replace(varRe, `{{ ${to} }}`);
100
+ });
101
+ if (updated !== source) {
102
+ await storage.write(doc.path, updated);
103
+ if (!updatedDocs.includes(doc.path))
104
+ updatedDocs.push(doc.path);
105
+ }
106
+ }
107
+ if (variableRefs > 0) {
108
+ issues.push({
109
+ severity: "warning",
110
+ code: "key-variable-renamed",
111
+ message: `renamed ${variableRefs} {{ ${from} }} reference(s) — verify they referred to this key, not a build attribute of the same name`,
112
+ });
113
+ }
114
+ ctx.workspace.invalidate();
115
+ return {
116
+ data: { applied: true, from, to, definitionFiles: defFiles, updatedDocs, variableRefs },
117
+ issues,
118
+ summary: `key "${from}" → "${to}" (${defFiles.length} keys file(s), ${updatedDocs.length} doc(s))`,
119
+ };
120
+ },
121
+ });
122
+ export const keyifyCommand = defineCommand({
123
+ name: "keyify",
124
+ writes: "structure",
125
+ description: "Give a file a key and convert inbound direct links to key: references",
126
+ input: z
127
+ .object({
128
+ file: z.string().min(1).describe("Workspace-relative file the key should address"),
129
+ key: z.string().min(1).describe("Key name to define"),
130
+ keysFile: z
131
+ .string()
132
+ .optional()
133
+ .describe("Keys file to define it in (default: first existing keys file, else keys.yaml)"),
134
+ })
135
+ .strict(),
136
+ positionals: ["file", "key"],
137
+ async run(ctx, input) {
138
+ const file = normalizeStoragePath(input.file);
139
+ const { storage } = ctx.workspace;
140
+ if (!(await storage.exists(file)))
141
+ return fail("keyify-target-missing", `${file} does not exist`);
142
+ const index = await ctx.workspace.index();
143
+ const issues = [];
144
+ // Where does the definition live?
145
+ const existingKeysFiles = [...new Set([...index.keys.values()].flat().map((d) => d.file))].sort();
146
+ const keysFile = normalizeStoragePath(input.keysFile ?? existingKeysFiles[0] ?? "keys.yaml");
147
+ const keyHref = relativeHref(dirname(keysFile), file);
148
+ const existing = index.keys.get(input.key);
149
+ if (existing && existing.length > 0) {
150
+ const currentHref = existing[0].def.href;
151
+ const resolves = typeof currentHref === "string" &&
152
+ normalizeStoragePath(`${dirname(existing[0].file)}/${currentHref}`) === file;
153
+ if (!resolves) {
154
+ return fail("key-conflict", `key "${input.key}" already exists in ${existing[0].file} and does not address ${file}`);
155
+ }
156
+ }
157
+ else if (await storage.exists(keysFile)) {
158
+ // Insert textually right under the `keys:` table line so
159
+ // hand-authored comments and siblings survive
160
+ const source = await storage.read(keysFile);
161
+ const tableLine = source.match(/^keys:[ \t]*$/m);
162
+ if (tableLine && tableLine.index !== undefined) {
163
+ const insertAt = tableLine.index + tableLine[0].length;
164
+ const entry = `\n ${input.key}:\n href: ${keyHref}`;
165
+ await storage.write(keysFile, source.slice(0, insertAt) + entry + source.slice(insertAt));
166
+ }
167
+ else {
168
+ const raw = loadYaml(source)?.keys ?? {};
169
+ raw[input.key] = { href: keyHref };
170
+ await storage.write(keysFile, dumpYaml({ keys: raw }));
171
+ issues.push({
172
+ severity: "warning",
173
+ code: "keys-file-normalized",
174
+ message: `no plain "keys:" table line found — ${keysFile} was rewritten via YAML round-trip (comments/formatting lost)`,
175
+ file: keysFile,
176
+ });
177
+ }
178
+ }
179
+ else {
180
+ await storage.write(keysFile, `keys:\n ${input.key}:\n href: ${keyHref}\n`);
181
+ }
182
+ // Inbound direct links become key: references. Fragment links and
183
+ // includes/topic-map entries are left alone (keys address whole
184
+ // resources), each with a note so nothing is silently skipped.
185
+ const updatedDocs = [];
186
+ const byFile = new Map();
187
+ for (const ref of index.inbound.get(file) ?? []) {
188
+ if (ref.kind !== "link") {
189
+ continue; // images/includes/topic maps keep direct paths
190
+ }
191
+ if (ref.fragment) {
192
+ issues.push({
193
+ severity: "warning",
194
+ code: "keyify-fragment-skipped",
195
+ message: `link "${ref.raw}" targets an anchor — key references address whole files; left as a direct link`,
196
+ file: ref.from,
197
+ });
198
+ continue;
199
+ }
200
+ const list = byFile.get(ref.from) ?? [];
201
+ list.push({ raw: ref.raw });
202
+ byFile.set(ref.from, list);
203
+ }
204
+ for (const [docPath, refs] of byFile) {
205
+ const source = await storage.read(docPath);
206
+ let updated = source;
207
+ for (const ref of refs) {
208
+ const re = new RegExp(`\\]\\(\\s*${escapeRegExp(ref.raw)}(?=[)\\s])`, "g");
209
+ updated = editMarkdownProse(updated, (prose) => prose.replace(re, (match) => match.replace(ref.raw, `key:${input.key}`)));
210
+ }
211
+ if (updated !== source) {
212
+ await storage.write(docPath, updated);
213
+ updatedDocs.push(docPath);
214
+ }
215
+ }
216
+ ctx.workspace.invalidate();
217
+ return {
218
+ data: { applied: true, file, key: input.key, keysFile, keyHref, updatedDocs },
219
+ issues,
220
+ summary: `key "${input.key}" → ${file} (${updatedDocs.length} doc(s) now use key: links)`,
221
+ };
222
+ },
223
+ });
224
+ //# sourceMappingURL=refactor-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refactor-keys.js","sourceRoot":"","sources":["../../src/commands/refactor-keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Structural refactor commands: split-topic, merge-topics.
3
+ *
4
+ * Both operate line-wise with the shared fence grammar (a `## heading`
5
+ * inside a code example is never structure), then reindex and repair
6
+ * inbound references so links keep landing after the surgery. What
7
+ * cannot be repaired mechanically is issued, never silently dropped.
8
+ */
9
+ import { z } from "zod";
10
+ export declare const splitTopicCommand: import("../engine.js").CommandDef<z.ZodObject<{
11
+ file: z.ZodString;
12
+ expect: z.ZodOptional<z.ZodString>;
13
+ }, z.core.$strict>>;
14
+ export declare const mergeTopicsCommand: import("../engine.js").CommandDef<z.ZodObject<{
15
+ into: z.ZodString;
16
+ sources: z.ZodArray<z.ZodString>;
17
+ expect: z.ZodOptional<z.ZodString>;
18
+ }, z.core.$strict>>;
19
+ //# sourceMappingURL=refactor-structure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refactor-structure.d.ts","sourceRoot":"","sources":["../../src/commands/refactor-structure.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA2BxB,eAAO,MAAM,iBAAiB;;;mBAwH5B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;mBA4K7B,CAAC"}