@commentray/core 0.0.4 → 0.0.5

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 (43) hide show
  1. package/dist/angles-toml.d.ts +14 -0
  2. package/dist/angles-toml.d.ts.map +1 -1
  3. package/dist/angles-toml.js +51 -0
  4. package/dist/angles-toml.js.map +1 -1
  5. package/dist/commentray-disk-pairs.d.ts +14 -0
  6. package/dist/commentray-disk-pairs.d.ts.map +1 -0
  7. package/dist/commentray-disk-pairs.js +51 -0
  8. package/dist/commentray-disk-pairs.js.map +1 -0
  9. package/dist/git-relocation-scan.d.ts +9 -0
  10. package/dist/git-relocation-scan.d.ts.map +1 -0
  11. package/dist/git-relocation-scan.js +96 -0
  12. package/dist/git-relocation-scan.js.map +1 -0
  13. package/dist/index.d.ts +9 -3
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +5 -2
  16. package/dist/index.js.map +1 -1
  17. package/dist/migrate-angles-layout.d.ts +27 -0
  18. package/dist/migrate-angles-layout.d.ts.map +1 -0
  19. package/dist/migrate-angles-layout.js +72 -0
  20. package/dist/migrate-angles-layout.js.map +1 -0
  21. package/dist/paths.d.ts +6 -0
  22. package/dist/paths.d.ts.map +1 -1
  23. package/dist/paths.js +15 -0
  24. package/dist/paths.js.map +1 -1
  25. package/dist/relocation-hints.d.ts +18 -0
  26. package/dist/relocation-hints.d.ts.map +1 -0
  27. package/dist/relocation-hints.js +170 -0
  28. package/dist/relocation-hints.js.map +1 -0
  29. package/dist/scm/git-scm-provider.d.ts.map +1 -1
  30. package/dist/scm/git-scm-provider.js +1 -21
  31. package/dist/scm/git-scm-provider.js.map +1 -1
  32. package/dist/scm/git-spawn.d.ts +10 -0
  33. package/dist/scm/git-spawn.d.ts.map +1 -0
  34. package/dist/scm/git-spawn.js +26 -0
  35. package/dist/scm/git-spawn.js.map +1 -0
  36. package/dist/validate-project.d.ts.map +1 -1
  37. package/dist/validate-project.js +72 -23
  38. package/dist/validate-project.js.map +1 -1
  39. package/dist/walk-commentray-source-md.d.ts +5 -0
  40. package/dist/walk-commentray-source-md.d.ts.map +1 -0
  41. package/dist/walk-commentray-source-md.js +33 -0
  42. package/dist/walk-commentray-source-md.js.map +1 -0
  43. package/package.json +1 -1
@@ -15,4 +15,18 @@ export declare function ensureAnglesSentinelFile(repoRoot: string, storageDir: s
15
15
  * TOML stringify (comments and key order are not preserved).
16
16
  */
17
17
  export declare function upsertAngleDefinitionInCommentrayToml(repoRoot: string, input: UpsertAngleDefinitionInput): Promise<void>;
18
+ export type ApplyAnglesFlatMigrationTomlInput = {
19
+ angleId: string;
20
+ /** Optional label for the single migrated angle (defaults to title-cased id). */
21
+ angleTitle?: string;
22
+ /** When both set, replace `[static_site].commentray_markdown` if it equals `from`. */
23
+ staticCommentrayMarkdownFrom?: string;
24
+ staticCommentrayMarkdownTo?: string;
25
+ };
26
+ /**
27
+ * After flat → Angles filesystem moves, stamp `[angles]` and optionally rewrite
28
+ * `[static_site].commentray_markdown` to the new companion path. Refuses when
29
+ * `[angles].definitions` is already non-empty (avoid clobbering a configured project).
30
+ */
31
+ export declare function applyAnglesFlatMigrationToCommentrayToml(repoRoot: string, input: ApplyAnglesFlatMigrationTomlInput): Promise<void>;
18
32
  //# sourceMappingURL=angles-toml.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"angles-toml.d.ts","sourceRoot":"","sources":["../src/angles-toml.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,0BAA0B,GAAG;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAMF;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAaf;AAED;;;;GAIG;AACH,wBAAsB,qCAAqC,CACzD,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,IAAI,CAAC,CAmCf"}
1
+ {"version":3,"file":"angles-toml.d.ts","sourceRoot":"","sources":["../src/angles-toml.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,0BAA0B,GAAG;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAMF;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAaf;AAED;;;;GAIG;AACH,wBAAsB,qCAAqC,CACzD,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,IAAI,CAAC,CAmCf;AAED,MAAM,MAAM,iCAAiC,GAAG;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sFAAsF;IACtF,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,0BAA0B,CAAC,EAAE,MAAM,CAAC;CACrC,CAAC;AAsBF;;;;GAIG;AACH,wBAAsB,wCAAwC,CAC5D,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,iCAAiC,GACvC,OAAO,CAAC,IAAI,CAAC,CAkCf"}
@@ -59,4 +59,55 @@ export async function upsertAngleDefinitionInCommentrayToml(repoRoot, input) {
59
59
  const body = raw.trim() ? serialized : `${MINIMAL_NEW_TOML.trim()}\n\n${serialized}`;
60
60
  await fs.writeFile(configPath, `${body}\n`, "utf8");
61
61
  }
62
+ function defaultTitleForAngleId(angleId) {
63
+ return angleId
64
+ .split(/[-_]+/)
65
+ .filter(Boolean)
66
+ .map((s) => s.charAt(0).toUpperCase() + s.slice(1).toLowerCase())
67
+ .join(" ");
68
+ }
69
+ function maybeRewriteStaticCommentrayMarkdown(ss, from, to) {
70
+ if (!from || !to)
71
+ return;
72
+ const cur = (ss.commentray_markdown ?? ss.commentary_markdown ?? "").trim();
73
+ if (cur !== from)
74
+ return;
75
+ ss.commentray_markdown = to;
76
+ delete ss.commentary_markdown;
77
+ }
78
+ /**
79
+ * After flat → Angles filesystem moves, stamp `[angles]` and optionally rewrite
80
+ * `[static_site].commentray_markdown` to the new companion path. Refuses when
81
+ * `[angles].definitions` is already non-empty (avoid clobbering a configured project).
82
+ */
83
+ export async function applyAnglesFlatMigrationToCommentrayToml(repoRoot, input) {
84
+ const id = assertValidAngleId(input.angleId);
85
+ const configPath = path.join(repoRoot, ".commentray.toml");
86
+ let raw;
87
+ try {
88
+ raw = await fs.readFile(configPath, "utf8");
89
+ }
90
+ catch (err) {
91
+ const code = err.code;
92
+ if (code === "ENOENT") {
93
+ throw new Error("Missing .commentray.toml (run: commentray init config)", { cause: err });
94
+ }
95
+ throw err;
96
+ }
97
+ const parsed = raw.trim() ? parseToml(raw) : {};
98
+ const existingDefs = parsed.angles?.definitions ?? [];
99
+ if (existingDefs.length > 0) {
100
+ throw new Error("Refusing to migrate: [angles].definitions is already set. Remove or merge angles manually, then retry.");
101
+ }
102
+ const title = input.angleTitle?.trim() || defaultTitleForAngleId(id) || id;
103
+ parsed.angles = {
104
+ default_angle: id,
105
+ definitions: [{ id, title }],
106
+ };
107
+ const ss = parsed.static_site ?? {};
108
+ maybeRewriteStaticCommentrayMarkdown(ss, input.staticCommentrayMarkdownFrom?.trim(), input.staticCommentrayMarkdownTo?.trim());
109
+ parsed.static_site = ss;
110
+ mergeCommentrayConfig(parsed);
111
+ await fs.writeFile(configPath, `${stringify(parsed)}\n`, "utf8");
112
+ }
62
113
  //# sourceMappingURL=angles-toml.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"angles-toml.js","sourceRoot":"","sources":["../src/angles-toml.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"angles-toml.js","sourceRoot":"","sources":["../src/angles-toml.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export type DiskCommentrayPair = {
2
+ sourcePath: string;
3
+ commentrayPath: string;
4
+ };
5
+ /**
6
+ * Maps a Markdown path relative to `{storage}/source/` to `(sourcePath, commentrayPath)` using
7
+ * the same flat vs Angles rules as the rest of Commentray.
8
+ */
9
+ export declare function pairFromCommentraySourceRel(storageDirNorm: string, relFromSourceDir: string, anglesOn: boolean): DiskCommentrayPair | null;
10
+ /**
11
+ * Lists every `*.md` under `{storage}/source/` as source ↔ commentray path pairs (flat or Angles).
12
+ */
13
+ export declare function discoverCommentrayPairsOnDisk(repoRoot: string, storageDir?: string): Promise<DiskCommentrayPair[]>;
14
+ //# sourceMappingURL=commentray-disk-pairs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commentray-disk-pairs.d.ts","sourceRoot":"","sources":["../src/commentray-disk-pairs.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,cAAc,EAAE,MAAM,EACtB,gBAAgB,EAAE,MAAM,EACxB,QAAQ,EAAE,OAAO,GAChB,kBAAkB,GAAG,IAAI,CAe3B;AAED;;GAEG;AACH,wBAAsB,6BAA6B,CACjD,QAAQ,EAAE,MAAM,EAChB,UAAU,SAAgB,GACzB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAoB/B"}
@@ -0,0 +1,51 @@
1
+ import path from "node:path";
2
+ import { commentrayAnglesLayoutEnabled, normalizeRepoRelativePath } from "./paths.js";
3
+ import { collectMdRelPathsUnderSourceAbs } from "./walk-commentray-source-md.js";
4
+ /**
5
+ * Maps a Markdown path relative to `{storage}/source/` to `(sourcePath, commentrayPath)` using
6
+ * the same flat vs Angles rules as the rest of Commentray.
7
+ */
8
+ export function pairFromCommentraySourceRel(storageDirNorm, relFromSourceDir, anglesOn) {
9
+ const norm = relFromSourceDir.replaceAll("\\", "/");
10
+ if (!norm.endsWith(".md") || norm === ".default" || norm.startsWith(".default/"))
11
+ return null;
12
+ const crPath = path.posix.join(storageDirNorm, "source", norm);
13
+ if (!anglesOn) {
14
+ return { sourcePath: norm.slice(0, Math.max(0, norm.length - 3)), commentrayPath: crPath };
15
+ }
16
+ const dir = path.posix.dirname(norm);
17
+ const base = path.posix.basename(norm);
18
+ const stem = base.slice(0, Math.max(0, base.length - 3));
19
+ const angleStemValid = /^[a-zA-Z0-9_-]{1,64}$/.test(stem);
20
+ if (dir !== "." && dir !== "" && angleStemValid) {
21
+ return { sourcePath: dir, commentrayPath: crPath };
22
+ }
23
+ return { sourcePath: norm.slice(0, Math.max(0, norm.length - 3)), commentrayPath: crPath };
24
+ }
25
+ /**
26
+ * Lists every `*.md` under `{storage}/source/` as source ↔ commentray path pairs (flat or Angles).
27
+ */
28
+ export async function discoverCommentrayPairsOnDisk(repoRoot, storageDir = ".commentray") {
29
+ const storageNorm = normalizeRepoRelativePath(storageDir.replaceAll("\\", "/"));
30
+ const sourceAbs = path.join(repoRoot, ...storageNorm.split("/"), "source");
31
+ const anglesOn = commentrayAnglesLayoutEnabled(repoRoot, storageDir);
32
+ let rels;
33
+ try {
34
+ rels = await collectMdRelPathsUnderSourceAbs(sourceAbs);
35
+ }
36
+ catch {
37
+ return [];
38
+ }
39
+ const out = [];
40
+ const seen = new Set();
41
+ for (const rel of rels) {
42
+ const pair = pairFromCommentraySourceRel(storageNorm, rel, anglesOn);
43
+ if (!pair || seen.has(pair.commentrayPath))
44
+ continue;
45
+ seen.add(pair.commentrayPath);
46
+ out.push(pair);
47
+ }
48
+ out.sort((a, b) => a.commentrayPath.localeCompare(b.commentrayPath));
49
+ return out;
50
+ }
51
+ //# sourceMappingURL=commentray-disk-pairs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commentray-disk-pairs.js","sourceRoot":"","sources":["../src/commentray-disk-pairs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Reads UTF-8 text from Git-tracked source-like files that are **not** already in
3
+ * `indexedPathsNorm`, for relocation heuristics only. Bounded by file count and per-file size.
4
+ */
5
+ export declare function loadGitTrackedSourceTextsOutsideIndex(repoRoot: string, indexedPathsNorm: ReadonlySet<string>, options?: {
6
+ maxFiles?: number;
7
+ maxBytesPerFile?: number;
8
+ }): Promise<Map<string, string>>;
9
+ //# sourceMappingURL=git-relocation-scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-relocation-scan.d.ts","sourceRoot":"","sources":["../src/git-relocation-scan.ts"],"names":[],"mappings":"AAoEA;;;GAGG;AACH,wBAAsB,qCAAqC,CACzD,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,EACrC,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,GACxD,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAsB9B"}
@@ -0,0 +1,96 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { normalizeRepoRelativePath } from "./paths.js";
4
+ import { runGit } from "./scm/git-spawn.js";
5
+ /** Tracked paths we may read for marker/snippet relocation hints (bounded scan). */
6
+ const RELOCATION_SCAN_SUFFIXES = new Set([
7
+ ".c",
8
+ ".cc",
9
+ ".cpp",
10
+ ".cs",
11
+ ".cts",
12
+ ".cxx",
13
+ ".fs",
14
+ ".go",
15
+ ".h",
16
+ ".hpp",
17
+ ".java",
18
+ ".js",
19
+ ".jsx",
20
+ ".kt",
21
+ ".kts",
22
+ ".mjs",
23
+ ".mts",
24
+ ".php",
25
+ ".py",
26
+ ".rb",
27
+ ".rs",
28
+ ".scala",
29
+ ".svelte",
30
+ ".swift",
31
+ ".ts",
32
+ ".tsx",
33
+ ".vue",
34
+ ".zig",
35
+ ]);
36
+ function isRelocationScanCandidate(repoRelative) {
37
+ const lower = repoRelative.toLowerCase();
38
+ if (lower.includes("/node_modules/"))
39
+ return false;
40
+ const ext = path.posix.extname(lower);
41
+ return RELOCATION_SCAN_SUFFIXES.has(ext);
42
+ }
43
+ async function readUtf8SourceUnderMaxBytes(repoRoot, norm, maxBytes) {
44
+ const abs = path.join(repoRoot, ...norm.split("/"));
45
+ let st;
46
+ try {
47
+ st = await fs.stat(abs);
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ if (!st.isFile() || st.size > maxBytes)
53
+ return null;
54
+ let buf;
55
+ try {
56
+ buf = await fs.readFile(abs);
57
+ }
58
+ catch {
59
+ return null;
60
+ }
61
+ if (buf.includes(0))
62
+ return null;
63
+ return buf.toString("utf8").replaceAll("\r\n", "\n");
64
+ }
65
+ /**
66
+ * Reads UTF-8 text from Git-tracked source-like files that are **not** already in
67
+ * `indexedPathsNorm`, for relocation heuristics only. Bounded by file count and per-file size.
68
+ */
69
+ export async function loadGitTrackedSourceTextsOutsideIndex(repoRoot, indexedPathsNorm, options) {
70
+ const maxFiles = options?.maxFiles ?? 400;
71
+ const maxBytes = options?.maxBytesPerFile ?? 200_000;
72
+ const { code, stdout, stderr } = await runGit(repoRoot, ["ls-files", "-z", "--cached"]);
73
+ if (code !== 0) {
74
+ throw new Error(`git ls-files failed (${code}): ${stderr.trim() || stdout.trim()}`);
75
+ }
76
+ const raw = stdout.split("\0").filter(Boolean);
77
+ const sorted = [...raw].sort((a, b) => a.localeCompare(b));
78
+ const out = new Map();
79
+ let n = 0;
80
+ for (const rel of sorted) {
81
+ if (n >= maxFiles)
82
+ break;
83
+ const norm = normalizeRepoRelativePath(rel.replaceAll("\\", "/"));
84
+ if (indexedPathsNorm.has(norm))
85
+ continue;
86
+ if (!isRelocationScanCandidate(norm))
87
+ continue;
88
+ const text = await readUtf8SourceUnderMaxBytes(repoRoot, norm, maxBytes);
89
+ if (text === null)
90
+ continue;
91
+ out.set(norm, text);
92
+ n++;
93
+ }
94
+ return out;
95
+ }
96
+ //# sourceMappingURL=git-relocation-scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-relocation-scan.js","sourceRoot":"","sources":["../src/git-relocation-scan.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -3,17 +3,21 @@ export { coerceIndexSchemaVersion, CURRENT_SCHEMA_VERSION } from "./model.js";
3
3
  export type { AddBlockToIndexInput, BlockRange, CreateBlockForRangeInput, CreatedBlock, } from "./blocks.js";
4
4
  export { addBlockToIndex, appendBlockToCommentray, createBlockForRange, generateBlockId, } from "./blocks.js";
5
5
  export { assertValidAngleId } from "./angles.js";
6
- export { ensureAnglesSentinelFile, upsertAngleDefinitionInCommentrayToml } from "./angles-toml.js";
7
- export type { UpsertAngleDefinitionInput } from "./angles-toml.js";
6
+ export { applyAnglesFlatMigrationToCommentrayToml, ensureAnglesSentinelFile, upsertAngleDefinitionInCommentrayToml, } from "./angles-toml.js";
7
+ export type { ApplyAnglesFlatMigrationTomlInput, UpsertAngleDefinitionInput, } from "./angles-toml.js";
8
8
  export { defaultAngleIdForOpen, FALLBACK_DEFAULT_ANGLE_ID, resolveCommentrayMarkdownPath, } from "./commentray-path-resolution.js";
9
9
  export type { ResolvedCommentrayMarkdownPath } from "./commentray-path-resolution.js";
10
- export { commentrayAnglesLayoutEnabled, commentrayAnglesSentinelPath, commentrayMarkdownPath, commentrayMarkdownPathForAngle, defaultMetadataIndexPath, normalizeRepoRelativePath, } from "./paths.js";
10
+ export { commentrayAnglesLayoutEnabled, commentrayAnglesSentinelPath, commentrayMarkdownPath, commentrayMarkdownPathForAngle, defaultMetadataIndexPath, normalizeRepoRelativePath, resolvePathUnderRepoRoot, } from "./paths.js";
11
+ export { discoverCommentrayPairsOnDisk, pairFromCommentraySourceRel, } from "./commentray-disk-pairs.js";
12
+ export type { DiskCommentrayPair } from "./commentray-disk-pairs.js";
11
13
  export type { CommentrayToml, ResolvedAngleDefinition, ResolvedAngles, ResolvedCommentrayConfig, ResolvedGithubNavLink, ResolvedStaticSite, } from "./config.js";
12
14
  export { loadCommentrayConfig, mergeCommentrayConfig } from "./config.js";
13
15
  export { githubRepoBlobFileUrl, parseGithubRepoWebUrl } from "./github-url.js";
14
16
  export { assertValidIndex, emptyIndex } from "./metadata.js";
15
17
  export { describeIndexSchemaRemediation } from "./index-schema-messages.js";
16
18
  export { migrateIndex } from "./migrate.js";
19
+ export { discoverFlatCompanionMarkdownFiles, flatRelToSourcePath, planAnglesMigrationFromCompanions, rewriteIndexKeysForAnglesMigration, } from "./migrate-angles-layout.js";
20
+ export type { AnglesMigrationMove, AnglesMigrationPlan, FlatCompanionEntry, } from "./migrate-angles-layout.js";
17
21
  export type { ParsedAnchor } from "./anchors.js";
18
22
  export { formatLineRange, parseAnchor } from "./anchors.js";
19
23
  export type { ScmPathRename, ScmProvider } from "./scm/scm-provider.js";
@@ -24,6 +28,8 @@ export type { BlockDiagnostic } from "./staleness.js";
24
28
  export { diagnoseBlock } from "./staleness.js";
25
29
  export type { ValidationIssue, ValidationResult } from "./validate-project.js";
26
30
  export { readIndex, refreshIndexMigrationsOnDisk, validateProject, writeIndex, } from "./validate-project.js";
31
+ export { relocationHintMessages } from "./relocation-hints.js";
32
+ export type { RelocationHintsInput } from "./relocation-hints.js";
27
33
  export { runCommanderMain } from "./cli-bootstrap.js";
28
34
  export type { BlockScrollLink } from "./scroll-sync.js";
29
35
  export { buildBlockScrollLinks, pickCommentrayLineForSourceScroll, pickSourceLine0ForCommentrayScroll, } from "./scroll-sync.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,19 +1,22 @@
1
1
  export { coerceIndexSchemaVersion, CURRENT_SCHEMA_VERSION } from "./model.js";
2
2
  export { addBlockToIndex, appendBlockToCommentray, createBlockForRange, generateBlockId, } from "./blocks.js";
3
3
  export { assertValidAngleId } from "./angles.js";
4
- export { ensureAnglesSentinelFile, upsertAngleDefinitionInCommentrayToml } from "./angles-toml.js";
4
+ export { applyAnglesFlatMigrationToCommentrayToml, ensureAnglesSentinelFile, upsertAngleDefinitionInCommentrayToml, } from "./angles-toml.js";
5
5
  export { defaultAngleIdForOpen, FALLBACK_DEFAULT_ANGLE_ID, resolveCommentrayMarkdownPath, } from "./commentray-path-resolution.js";
6
- export { commentrayAnglesLayoutEnabled, commentrayAnglesSentinelPath, commentrayMarkdownPath, commentrayMarkdownPathForAngle, defaultMetadataIndexPath, normalizeRepoRelativePath, } from "./paths.js";
6
+ export { commentrayAnglesLayoutEnabled, commentrayAnglesSentinelPath, commentrayMarkdownPath, commentrayMarkdownPathForAngle, defaultMetadataIndexPath, normalizeRepoRelativePath, resolvePathUnderRepoRoot, } from "./paths.js";
7
+ export { discoverCommentrayPairsOnDisk, pairFromCommentraySourceRel, } from "./commentray-disk-pairs.js";
7
8
  export { loadCommentrayConfig, mergeCommentrayConfig } from "./config.js";
8
9
  export { githubRepoBlobFileUrl, parseGithubRepoWebUrl } from "./github-url.js";
9
10
  export { assertValidIndex, emptyIndex } from "./metadata.js";
10
11
  export { describeIndexSchemaRemediation } from "./index-schema-messages.js";
11
12
  export { migrateIndex } from "./migrate.js";
13
+ export { discoverFlatCompanionMarkdownFiles, flatRelToSourcePath, planAnglesMigrationFromCompanions, rewriteIndexKeysForAnglesMigration, } from "./migrate-angles-layout.js";
12
14
  export { formatLineRange, parseAnchor } from "./anchors.js";
13
15
  export { GitScmProvider, parseGitRenameLines } from "./scm/git-scm-provider.js";
14
16
  export { applyPathRenamesToCommentrayIndex, inferAngleIdFromCommentrayPath, } from "./commentray-index-renames.js";
15
17
  export { diagnoseBlock } from "./staleness.js";
16
18
  export { readIndex, refreshIndexMigrationsOnDisk, validateProject, writeIndex, } from "./validate-project.js";
19
+ export { relocationHintMessages } from "./relocation-hints.js";
17
20
  export { runCommanderMain } from "./cli-bootstrap.js";
18
21
  export { buildBlockScrollLinks, pickCommentrayLineForSourceScroll, pickSourceLine0ForCommentrayScroll, } from "./scroll-sync.js";
19
22
  export { commentrayRegionInsertions, lineCommentLeaderForLanguage, parseCommentrayRegionBoundary, sourceLineRangeForMarkerId, } from "./source-markers.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAO9E,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,mBAAmB,EACnB,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,wBAAwB,EAAE,qCAAqC,EAAE,MAAM,kBAAkB,CAAC;AAEnG,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,6BAA6B,GAC9B,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,6BAA6B,EAC7B,4BAA4B,EAC5B,sBAAsB,EACtB,8BAA8B,EAC9B,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,YAAY,CAAC;AASpB,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,EACL,iCAAiC,EACjC,8BAA8B,GAC/B,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EACL,SAAS,EACT,4BAA4B,EAC5B,eAAe,EACf,UAAU,GACX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EACL,qBAAqB,EACrB,iCAAiC,EACjC,kCAAkC,GACnC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,EAC5B,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,wCAAwC,EACxC,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAElG,OAAO,EACL,4BAA4B,EAC5B,gCAAgC,GACjC,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAO9E,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,mBAAmB,EACnB,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,wCAAwC,EACxC,wBAAwB,EACxB,qCAAqC,GACtC,MAAM,kBAAkB,CAAC;AAK1B,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,6BAA6B,GAC9B,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,6BAA6B,EAC7B,4BAA4B,EAC5B,sBAAsB,EACtB,8BAA8B,EAC9B,wBAAwB,EACxB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,4BAA4B,CAAC;AAUpC,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EACL,kCAAkC,EAClC,mBAAmB,EACnB,iCAAiC,EACjC,kCAAkC,GACnC,MAAM,4BAA4B,CAAC;AAOpC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,EACL,iCAAiC,EACjC,8BAA8B,GAC/B,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EACL,SAAS,EACT,4BAA4B,EAC5B,eAAe,EACf,UAAU,GACX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EACL,qBAAqB,EACrB,iCAAiC,EACjC,kCAAkC,GACnC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,EAC5B,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,wCAAwC,EACxC,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAElG,OAAO,EACL,4BAA4B,EAC5B,gCAAgC,GACjC,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { CommentrayIndex } from "./model.js";
2
+ export type FlatCompanionEntry = {
3
+ /** Repo-relative path, e.g. `.commentray/source/README.md.md`. */
4
+ flatCommentrayPath: string;
5
+ /** Repo-relative primary source path, e.g. `README.md`. */
6
+ sourcePath: string;
7
+ };
8
+ export type AnglesMigrationMove = {
9
+ fromRepoRel: string;
10
+ toRepoRel: string;
11
+ sourcePath: string;
12
+ };
13
+ export type AnglesMigrationPlan = {
14
+ moves: AnglesMigrationMove[];
15
+ /** Old flat companion path → new angle Markdown path (repo-relative). */
16
+ flatToAnglePath: Map<string, string>;
17
+ };
18
+ /**
19
+ * Lists every flat-layout companion Markdown file under `{storage}/source/`.
20
+ * Returns an empty list when Angles layout is already enabled (sentinel present).
21
+ */
22
+ export declare function discoverFlatCompanionMarkdownFiles(repoRoot: string, storageDir?: string): Promise<FlatCompanionEntry[]>;
23
+ /** `rel` is relative to `{storage}/source/` using `/` separators. */
24
+ export declare function flatRelToSourcePath(relFromSourceDir: string): string;
25
+ export declare function planAnglesMigrationFromCompanions(companions: FlatCompanionEntry[], angleId: string, storageDir: string): AnglesMigrationPlan;
26
+ export declare function rewriteIndexKeysForAnglesMigration(index: CommentrayIndex, flatToAnglePath: Map<string, string>): CommentrayIndex;
27
+ //# sourceMappingURL=migrate-angles-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-angles-layout.d.ts","sourceRoot":"","sources":["../src/migrate-angles-layout.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAwB,MAAM,YAAY,CAAC;AAQxE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,kEAAkE;IAClE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,yEAAyE;IACzE,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC,CAAC;AAEF;;;GAGG;AACH,wBAAsB,kCAAkC,CACtD,QAAQ,EAAE,MAAM,EAChB,UAAU,SAAgB,GACzB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA2B/B;AAED,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAKpE;AAED,wBAAgB,iCAAiC,CAC/C,UAAU,EAAE,kBAAkB,EAAE,EAChC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,mBAAmB,CAerB;AAED,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,eAAe,EACtB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,eAAe,CAOjB"}
@@ -0,0 +1,72 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { assertValidAngleId } from "./angles.js";
4
+ import { commentrayAnglesLayoutEnabled, commentrayMarkdownPathForAngle, normalizeRepoRelativePath, } from "./paths.js";
5
+ import { collectMdRelPathsUnderSourceAbs } from "./walk-commentray-source-md.js";
6
+ /**
7
+ * Lists every flat-layout companion Markdown file under `{storage}/source/`.
8
+ * Returns an empty list when Angles layout is already enabled (sentinel present).
9
+ */
10
+ export async function discoverFlatCompanionMarkdownFiles(repoRoot, storageDir = ".commentray") {
11
+ if (commentrayAnglesLayoutEnabled(repoRoot, storageDir)) {
12
+ return [];
13
+ }
14
+ const storageNorm = normalizeRepoRelativePath(storageDir.replaceAll("\\", "/"));
15
+ const sourceAbs = path.join(repoRoot, ...storageNorm.split("/"), "source");
16
+ let stat;
17
+ try {
18
+ stat = await fs.stat(sourceAbs);
19
+ }
20
+ catch {
21
+ return [];
22
+ }
23
+ if (!stat.isDirectory()) {
24
+ return [];
25
+ }
26
+ const rels = await collectMdRelPathsUnderSourceAbs(sourceAbs);
27
+ const out = [];
28
+ for (const rel of rels) {
29
+ if (rel === ".default" || rel.startsWith(".default/"))
30
+ continue;
31
+ if (!rel.endsWith(".md"))
32
+ continue;
33
+ const sourcePath = flatRelToSourcePath(rel);
34
+ const flatCommentrayPath = path.posix.join(storageNorm, "source", rel);
35
+ out.push({ flatCommentrayPath, sourcePath });
36
+ }
37
+ out.sort((a, b) => a.flatCommentrayPath.localeCompare(b.flatCommentrayPath));
38
+ return out;
39
+ }
40
+ /** `rel` is relative to `{storage}/source/` using `/` separators. */
41
+ export function flatRelToSourcePath(relFromSourceDir) {
42
+ if (!relFromSourceDir.endsWith(".md")) {
43
+ throw new Error(`Expected *.md under source, got: ${relFromSourceDir}`);
44
+ }
45
+ return relFromSourceDir.slice(0, Math.max(0, relFromSourceDir.length - 3));
46
+ }
47
+ export function planAnglesMigrationFromCompanions(companions, angleId, storageDir) {
48
+ const id = assertValidAngleId(angleId);
49
+ const moves = [];
50
+ const flatToAnglePath = new Map();
51
+ for (const c of companions) {
52
+ const toRepoRel = commentrayMarkdownPathForAngle(c.sourcePath, id, storageDir);
53
+ if (c.flatCommentrayPath === toRepoRel)
54
+ continue;
55
+ moves.push({
56
+ fromRepoRel: c.flatCommentrayPath,
57
+ toRepoRel: toRepoRel,
58
+ sourcePath: c.sourcePath,
59
+ });
60
+ flatToAnglePath.set(c.flatCommentrayPath, toRepoRel);
61
+ }
62
+ return { moves, flatToAnglePath };
63
+ }
64
+ export function rewriteIndexKeysForAnglesMigration(index, flatToAnglePath) {
65
+ const next = {};
66
+ for (const [k, entry] of Object.entries(index.byCommentrayPath)) {
67
+ const newKey = flatToAnglePath.get(k) ?? k;
68
+ next[newKey] = { ...entry, commentrayPath: newKey };
69
+ }
70
+ return { ...index, byCommentrayPath: next };
71
+ }
72
+ //# sourceMappingURL=migrate-angles-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-angles-layout.js","sourceRoot":"","sources":["../src/migrate-angles-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EACL,6BAA6B,EAC7B,8BAA8B,EAC9B,yBAAyB,GAC1B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAC;AAqBjF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kCAAkC,CACtD,QAAgB,EAChB,UAAU,GAAG,aAAa;IAE1B,IAAI,6BAA6B,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC;QACxD,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,WAAW,GAAG,yBAAyB,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IAChF,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC3E,IAAI,IAAI,CAAC;IACT,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,+BAA+B,CAAC,SAAS,CAAC,CAAC;IAC9D,MAAM,GAAG,GAAyB,EAAE,CAAC;IACrC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC;YAAE,SAAS;QAChE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QACnC,MAAM,UAAU,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QACvE,GAAG,CAAC,IAAI,CAAC,EAAE,kBAAkB,EAAE,UAAU,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC7E,OAAO,GAAG,CAAC;AACb,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,mBAAmB,CAAC,gBAAwB;IAC1D,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,oCAAoC,gBAAgB,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,UAAgC,EAChC,OAAe,EACf,UAAkB;IAElB,MAAM,EAAE,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,KAAK,GAA0B,EAAE,CAAC;IACxC,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,8BAA8B,CAAC,CAAC,CAAC,UAAU,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;QAC/E,IAAI,CAAC,CAAC,kBAAkB,KAAK,SAAS;YAAE,SAAS;QACjD,KAAK,CAAC,IAAI,CAAC;YACT,WAAW,EAAE,CAAC,CAAC,kBAAkB;YACjC,SAAS,EAAE,SAAS;YACpB,UAAU,EAAE,CAAC,CAAC,UAAU;SACzB,CAAC,CAAC;QACH,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,kCAAkC,CAChD,KAAsB,EACtB,eAAoC;IAEpC,MAAM,IAAI,GAAyC,EAAE,CAAC;IACtD,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAChE,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC;IACtD,CAAC;IACD,OAAO,EAAE,GAAG,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;AAC9C,CAAC"}
package/dist/paths.d.ts CHANGED
@@ -11,6 +11,12 @@
11
11
  * `..` segments are traversal.
12
12
  */
13
13
  export declare function normalizeRepoRelativePath(relativePath: string): string;
14
+ /**
15
+ * Resolve `repoRelative` under `repoRootAbs` after {@link normalizeRepoRelativePath} validation,
16
+ * then assert the absolute path cannot escape `repoRootAbs` (defense in depth for index or
17
+ * nav-derived paths, not only hand-edited config).
18
+ */
19
+ export declare function resolvePathUnderRepoRoot(repoRootAbs: string, repoRelative: string): string;
14
20
  /** Commentray Markdown path for a repo-relative source file (implicit default angle, flat layout). */
15
21
  export declare function commentrayMarkdownPath(sourceRepoRelativePath: string, storageDir?: string): string;
16
22
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAWtE;AAED,sGAAsG;AACtG,wBAAgB,sBAAsB,CACpC,sBAAsB,EAAE,MAAM,EAC9B,UAAU,SAAgB,GACzB,MAAM,CAIR;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,UAAU,SAAgB,GAAG,MAAM,CAG/E;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,MAAM,EAChB,UAAU,SAAgB,GACzB,OAAO,CAIT;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,sBAAsB,EAAE,MAAM,EAC9B,OAAO,EAAE,MAAM,EACf,UAAU,SAAgB,GACzB,MAAM,CAKR;AAED,uDAAuD;AACvD,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD"}
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAWtE;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAS1F;AAED,sGAAsG;AACtG,wBAAgB,sBAAsB,CACpC,sBAAsB,EAAE,MAAM,EAC9B,UAAU,SAAgB,GACzB,MAAM,CAIR;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,UAAU,SAAgB,GAAG,MAAM,CAG/E;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,MAAM,EAChB,UAAU,SAAgB,GACzB,OAAO,CAIT;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,sBAAsB,EAAE,MAAM,EAC9B,OAAO,EAAE,MAAM,EACf,UAAU,SAAgB,GACzB,MAAM,CAKR;AAED,uDAAuD;AACvD,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD"}
package/dist/paths.js CHANGED
@@ -25,6 +25,21 @@ export function normalizeRepoRelativePath(relativePath) {
25
25
  }
26
26
  return segments.join("/");
27
27
  }
28
+ /**
29
+ * Resolve `repoRelative` under `repoRootAbs` after {@link normalizeRepoRelativePath} validation,
30
+ * then assert the absolute path cannot escape `repoRootAbs` (defense in depth for index or
31
+ * nav-derived paths, not only hand-edited config).
32
+ */
33
+ export function resolvePathUnderRepoRoot(repoRootAbs, repoRelative) {
34
+ const rel = normalizeRepoRelativePath(repoRelative);
35
+ const root = path.resolve(repoRootAbs);
36
+ const resolved = path.resolve(root, rel);
37
+ const back = path.relative(root, resolved);
38
+ if (back.startsWith("..") || path.isAbsolute(back)) {
39
+ throw new Error(`Resolved path leaves repository root: ${repoRelative}`);
40
+ }
41
+ return resolved;
42
+ }
28
43
  /** Commentray Markdown path for a repo-relative source file (implicit default angle, flat layout). */
29
44
  export function commentrayMarkdownPath(sourceRepoRelativePath, storageDir = ".commentray") {
30
45
  const normalized = normalizeRepoRelativePath(sourceRepoRelativePath);
package/dist/paths.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { CommentrayIndex } from "./model.js";
2
+ import type { ScmPathRename } from "./scm/scm-provider.js";
3
+ export type RelocationHintsInput = {
4
+ index: CommentrayIndex;
5
+ /** Normalized repo-relative paths that are indexed but not readable on disk */
6
+ missingSourcePathsNorm: ReadonlySet<string>;
7
+ /** Optional Git renames (same shape as `sync-moved-paths`, e.g. `HEAD~1` → `HEAD`) */
8
+ gitRenames?: readonly ScmPathRename[];
9
+ /** Readable indexed primaries: normalized path → LF source text */
10
+ indexedSourceTextsByPath: ReadonlyMap<string, string>;
11
+ };
12
+ /**
13
+ * Non-authoritative hints when indexed primary files are missing: Git renames,
14
+ * marker ids found under other indexed sources, and snippet-shaped matches.
15
+ * Intended for validation / doctor output — does not modify the index.
16
+ */
17
+ export declare function relocationHintMessages(input: RelocationHintsInput): string[];
18
+ //# sourceMappingURL=relocation-hints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relocation-hints.d.ts","sourceRoot":"","sources":["../src/relocation-hints.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAmB,eAAe,EAAwB,MAAM,YAAY,CAAC;AAGzF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,eAAe,CAAC;IACvB,+EAA+E;IAC/E,sBAAsB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC5C,sFAAsF;IACtF,UAAU,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IACtC,mEAAmE;IACnE,wBAAwB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvD,CAAC;AA2MF;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAG5E"}
@@ -0,0 +1,170 @@
1
+ import { parseAnchor } from "./anchors.js";
2
+ import { parseCommentraySnippetV1 } from "./block-snippet.js";
3
+ import { normalizeRepoRelativePath } from "./paths.js";
4
+ import { findCommentrayMarkerPairs } from "./region-marker-convert.js";
5
+ function entriesForNormalizedSource(index, missingNorm) {
6
+ return Object.values(index.byCommentrayPath).filter((e) => normalizeRepoRelativePath(e.sourcePath) === missingNorm);
7
+ }
8
+ function markerPathsContainingId(markerId, textsByPath, excludeNorm) {
9
+ const out = [];
10
+ for (const [p, text] of textsByPath) {
11
+ if (p === excludeNorm)
12
+ continue;
13
+ const pairs = findCommentrayMarkerPairs(text);
14
+ if (pairs.some((pair) => pair.id === markerId))
15
+ out.push(p);
16
+ }
17
+ return [...new Set(out)].sort((a, b) => a.localeCompare(b));
18
+ }
19
+ function snippetNeedleFromBlock(block) {
20
+ if (!block.snippet)
21
+ return null;
22
+ const lines = parseCommentraySnippetV1(block.snippet);
23
+ if (!lines || lines.length === 0)
24
+ return null;
25
+ const substantive = lines.map((l) => l.trim()).filter((l) => l.length >= 3);
26
+ if (substantive.length === 0)
27
+ return null;
28
+ const needle = substantive.slice(0, 4).join("\n");
29
+ return needle.length >= 12 ? needle : null;
30
+ }
31
+ function pathsContainingSnippetNeedle(needle, textsByPath, excludeNorm) {
32
+ const out = [];
33
+ for (const [p, text] of textsByPath) {
34
+ if (p === excludeNorm)
35
+ continue;
36
+ if (text.includes(needle))
37
+ out.push(p);
38
+ }
39
+ return [...new Set(out)].sort((a, b) => a.localeCompare(b));
40
+ }
41
+ function markerIdFromBlock(block) {
42
+ try {
43
+ const a = parseAnchor(block.anchor);
44
+ if (a.kind === "marker")
45
+ return a.id;
46
+ }
47
+ catch {
48
+ /* ignore */
49
+ }
50
+ return null;
51
+ }
52
+ function collectMarkerIds(entries) {
53
+ const markerIds = new Set();
54
+ for (const e of entries) {
55
+ for (const b of e.blocks) {
56
+ const mid = markerIdFromBlock(b);
57
+ if (mid)
58
+ markerIds.add(mid);
59
+ }
60
+ }
61
+ return markerIds;
62
+ }
63
+ function gitRenameHint(prefix, gitHit) {
64
+ const to = normalizeRepoRelativePath(gitHit.to);
65
+ return (`${prefix}: Git lists a rename to "${to}". Run: commentray sync-moved-paths --from HEAD~1 --to HEAD ` +
66
+ `(adjust --from/--to to the commit range that contains the rename).`);
67
+ }
68
+ function markerHintsForMissing(prefix, markerIds, texts, missingNorm) {
69
+ const out = [];
70
+ for (const mid of [...markerIds].sort((a, b) => a.localeCompare(b))) {
71
+ const paths = markerPathsContainingId(mid, texts, missingNorm);
72
+ if (paths.length === 1) {
73
+ out.push(`${prefix}: marker id "${mid}" appears in indexed source "${paths[0]}". ` +
74
+ `If commentary should follow that file, update index sourcePath (e.g. apply renames then sync-moved-paths, or edit index.json).`);
75
+ }
76
+ else if (paths.length > 1) {
77
+ out.push(`${prefix}: marker id "${mid}" appears in several indexed sources (${paths.join(", ")}); pick the intended file and update the index.`);
78
+ }
79
+ }
80
+ return out;
81
+ }
82
+ function snippetHintLineForBlock(prefix, block, texts, missingNorm) {
83
+ let anchorKind;
84
+ try {
85
+ anchorKind = parseAnchor(block.anchor).kind;
86
+ }
87
+ catch {
88
+ return null;
89
+ }
90
+ if (anchorKind !== "lines")
91
+ return null;
92
+ const needle = snippetNeedleFromBlock(block);
93
+ if (!needle)
94
+ return null;
95
+ const hits = pathsContainingSnippetNeedle(needle, texts, missingNorm);
96
+ if (hits.length === 1) {
97
+ return (`${prefix}: block "${block.id}" snippet text matches indexed source "${hits[0]}" ` +
98
+ `(lines: anchor may need new line numbers after the move).`);
99
+ }
100
+ if (hits.length > 1) {
101
+ return `${prefix}: block "${block.id}" snippet text matches multiple indexed sources (${hits.join(", ")}); narrow manually.`;
102
+ }
103
+ return null;
104
+ }
105
+ function snippetHintsForMissing(prefix, entries, texts, missingNorm) {
106
+ const out = [];
107
+ for (const e of entries) {
108
+ for (const b of e.blocks) {
109
+ const line = snippetHintLineForBlock(prefix, b, texts, missingNorm);
110
+ if (line)
111
+ out.push(line);
112
+ }
113
+ }
114
+ return out;
115
+ }
116
+ function symbolOpaqueHints(prefix, entries, affectedMd) {
117
+ let needsSymbolNote = false;
118
+ let needsOpaqueNote = false;
119
+ for (const e of entries) {
120
+ for (const b of e.blocks) {
121
+ try {
122
+ const k = parseAnchor(b.anchor).kind;
123
+ if (k === "symbol")
124
+ needsSymbolNote = true;
125
+ if (k === "opaque")
126
+ needsOpaqueNote = true;
127
+ }
128
+ catch {
129
+ /* handled elsewhere */
130
+ }
131
+ }
132
+ }
133
+ const out = [];
134
+ if (needsSymbolNote) {
135
+ out.push(`${prefix}: one or more blocks use symbol: anchors (${affectedMd.join(", ")}). ` +
136
+ `After a cross-file move, re-point anchors with language tooling or by hand — Commentray does not resolve symbols across files yet.`);
137
+ }
138
+ if (needsOpaqueNote) {
139
+ out.push(`${prefix}: one or more blocks use opaque anchors; update those anchors manually after the move.`);
140
+ }
141
+ return out;
142
+ }
143
+ function hintsForOneMissingPath(missingNorm, input) {
144
+ const entries = entriesForNormalizedSource(input.index, missingNorm);
145
+ const affectedMd = [...new Set(entries.map((e) => e.commentrayPath))].sort((a, b) => a.localeCompare(b));
146
+ const prefix = `Missing primary "${missingNorm}"`;
147
+ const gitHit = input.gitRenames?.find((r) => normalizeRepoRelativePath(r.from) === missingNorm);
148
+ const markerIds = collectMarkerIds(entries);
149
+ const parts = [
150
+ ...(gitHit ? [gitRenameHint(prefix, gitHit)] : []),
151
+ ...markerHintsForMissing(prefix, markerIds, input.indexedSourceTextsByPath, missingNorm),
152
+ ...snippetHintsForMissing(prefix, entries, input.indexedSourceTextsByPath, missingNorm),
153
+ ...symbolOpaqueHints(prefix, entries, affectedMd),
154
+ ];
155
+ if (parts.length === 0) {
156
+ parts.push(`${prefix}: no Git rename in the supplied range and no marker/snippet matches in other indexed primaries. ` +
157
+ `Remove stale index rows, restore the file, or point sourcePath at the new primary.`);
158
+ }
159
+ return parts;
160
+ }
161
+ /**
162
+ * Non-authoritative hints when indexed primary files are missing: Git renames,
163
+ * marker ids found under other indexed sources, and snippet-shaped matches.
164
+ * Intended for validation / doctor output — does not modify the index.
165
+ */
166
+ export function relocationHintMessages(input) {
167
+ const sortedMissing = [...input.missingSourcePathsNorm].sort((a, b) => a.localeCompare(b));
168
+ return sortedMissing.flatMap((m) => hintsForOneMissingPath(m, input));
169
+ }
170
+ //# sourceMappingURL=relocation-hints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relocation-hints.js","sourceRoot":"","sources":["../src/relocation-hints.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"git-scm-provider.d.ts","sourceRoot":"","sources":["../../src/scm/git-scm-provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA0BpE;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,EAAE,CAmBnE;AAED,qBAAa,cAAe,YAAW,WAAW;IAC1C,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgBnF,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYxF,+BAA+B,CACnC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,EAAE,CAAC;CAa5B"}
1
+ {"version":3,"file":"git-scm-provider.d.ts","sourceRoot":"","sources":["../../src/scm/git-scm-provider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEpE;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,EAAE,CAmBnE;AAED,qBAAa,cAAe,YAAW,WAAW;IAC1C,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgBnF,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYxF,+BAA+B,CACnC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,EAAE,CAAC;CAa5B"}
@@ -1,25 +1,5 @@
1
- import { spawn } from "node:child_process";
2
1
  import { normalizeRepoRelativePath } from "../paths.js";
3
- function runGit(repoRoot, args) {
4
- return new Promise((resolve, reject) => {
5
- const child = spawn("git", args, {
6
- cwd: repoRoot,
7
- env: process.env,
8
- });
9
- let stdout = "";
10
- let stderr = "";
11
- child.stdout.on("data", (d) => {
12
- stdout += String(d);
13
- });
14
- child.stderr.on("data", (d) => {
15
- stderr += String(d);
16
- });
17
- child.on("error", reject);
18
- child.on("close", (code) => {
19
- resolve({ code: code ?? 1, stdout, stderr });
20
- });
21
- });
22
- }
2
+ import { runGit } from "./git-spawn.js";
23
3
  /**
24
4
  * Parses `git diff --name-status` output for `R` (rename) lines. Tab-separated
25
5
  * `R086\told/path\tnew/path` (score optional).
@@ -1 +1 @@
1
- {"version":3,"file":"git-scm-provider.js","sourceRoot":"","sources":["../../src/scm/git-scm-provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git-scm-provider.js","sourceRoot":"","sources":["../../src/scm/git-scm-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Runs `git` with `args` in `repoRoot`; collects stdout/stderr as strings.
3
+ * Resolves with exit code (defaults to 1 when null).
4
+ */
5
+ export declare function runGit(repoRoot: string, args: string[]): Promise<{
6
+ code: number;
7
+ stdout: string;
8
+ stderr: string;
9
+ }>;
10
+ //# sourceMappingURL=git-spawn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-spawn.d.ts","sourceRoot":"","sources":["../../src/scm/git-spawn.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,MAAM,CACpB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAmB3D"}
@@ -0,0 +1,26 @@
1
+ import { spawn } from "node:child_process";
2
+ /**
3
+ * Runs `git` with `args` in `repoRoot`; collects stdout/stderr as strings.
4
+ * Resolves with exit code (defaults to 1 when null).
5
+ */
6
+ export function runGit(repoRoot, args) {
7
+ return new Promise((resolve, reject) => {
8
+ const child = spawn("git", args, {
9
+ cwd: repoRoot,
10
+ env: process.env,
11
+ });
12
+ let stdout = "";
13
+ let stderr = "";
14
+ child.stdout.on("data", (d) => {
15
+ stdout += String(d);
16
+ });
17
+ child.stderr.on("data", (d) => {
18
+ stderr += String(d);
19
+ });
20
+ child.on("error", reject);
21
+ child.on("close", (code) => {
22
+ resolve({ code: code ?? 1, stdout, stderr });
23
+ });
24
+ });
25
+ }
26
+ //# sourceMappingURL=git-spawn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-spawn.js","sourceRoot":"","sources":["../../src/scm/git-spawn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C;;;GAGG;AACH,MAAM,UAAU,MAAM,CACpB,QAAgB,EAChB,IAAc;IAEd,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE;YAC/B,GAAG,EAAE,QAAQ;YACb,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAC,CAAC;QACH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAkB,EAAE,EAAE;YAC7C,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAkB,EAAE,EAAE;YAC7C,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAmB,EAAE,EAAE;YACxC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"validate-project.d.ts","sourceRoot":"","sources":["../src/validate-project.ts"],"names":[],"mappings":"AAOA,OAAO,EAAoD,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAOpG,MAAM,MAAM,eAAe,GAAG;IAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B,CAAC;AAEF,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiEjF;AAiBD;;;GAGG;AACH,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,KAAK,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAqBvD;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CASjF;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAKxF"}
1
+ {"version":3,"file":"validate-project.d.ts","sourceRoot":"","sources":["../src/validate-project.ts"],"names":[],"mappings":"AAOA,OAAO,EAAoD,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAUpG,MAAM,MAAM,eAAe,GAAG;IAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B,CAAC;AA+EF,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA8CjF;AAiBD;;;GAGG;AACH,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,KAAK,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAqBvD;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CASjF;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAKxF"}
@@ -6,8 +6,78 @@ import { normalizeCommentrayIndex } from "./index-normalize.js";
6
6
  import { assertValidIndex } from "./metadata.js";
7
7
  import { migrateIndex } from "./migrate.js";
8
8
  import { coerceIndexSchemaVersion, CURRENT_SCHEMA_VERSION } from "./model.js";
9
- import { defaultMetadataIndexPath } from "./paths.js";
9
+ import { defaultMetadataIndexPath, normalizeRepoRelativePath } from "./paths.js";
10
10
  import { validateIndexMarkerSemantics, validateMarkerBoundariesInSource, } from "./marker-validation.js";
11
+ import { loadGitTrackedSourceTextsOutsideIndex } from "./git-relocation-scan.js";
12
+ import { relocationHintMessages } from "./relocation-hints.js";
13
+ import { GitScmProvider } from "./scm/git-scm-provider.js";
14
+ async function collectIssuesForLoadedIndex(repoRoot, index) {
15
+ const issues = [];
16
+ for (const issue of validateIndexMarkerSemantics(index)) {
17
+ issues.push({ level: issue.level, message: issue.message });
18
+ }
19
+ const uniqueSourcesNorm = [
20
+ ...new Set(Object.values(index.byCommentrayPath).map((e) => normalizeRepoRelativePath(e.sourcePath))),
21
+ ];
22
+ const indexedSourceTexts = new Map();
23
+ const missingSourcesNorm = new Set();
24
+ for (const norm of uniqueSourcesNorm) {
25
+ const abs = path.join(repoRoot, ...norm.split("/"));
26
+ try {
27
+ const text = await fs.readFile(abs, "utf8");
28
+ indexedSourceTexts.set(norm, text);
29
+ }
30
+ catch {
31
+ missingSourcesNorm.add(norm);
32
+ const affected = Object.values(index.byCommentrayPath)
33
+ .filter((e) => normalizeRepoRelativePath(e.sourcePath) === norm)
34
+ .map((e) => e.commentrayPath);
35
+ const uniqAffected = [...new Set(affected)].sort((a, b) => a.localeCompare(b));
36
+ issues.push({
37
+ level: "warn",
38
+ message: `Primary source "${norm}" is not readable (deleted, moved, or not checked out). ` +
39
+ `Commentray: ${uniqAffected.join(", ")}. ` +
40
+ `If Git renamed it, try: commentray sync-moved-paths --from HEAD~1 --to HEAD`,
41
+ });
42
+ }
43
+ }
44
+ for (const [norm, text] of indexedSourceTexts) {
45
+ for (const issue of validateMarkerBoundariesInSource(text, norm)) {
46
+ issues.push({ level: issue.level, message: issue.message });
47
+ }
48
+ }
49
+ if (missingSourcesNorm.size === 0)
50
+ return issues;
51
+ let gitRenames;
52
+ try {
53
+ const scm = new GitScmProvider();
54
+ if (scm.listPathRenamesBetweenTreeishes) {
55
+ gitRenames = await scm.listPathRenamesBetweenTreeishes(repoRoot, "HEAD~1", "HEAD");
56
+ }
57
+ }
58
+ catch {
59
+ /* no Git or shallow history — hints still run without renames */
60
+ }
61
+ let textsForRelocationHints = indexedSourceTexts;
62
+ try {
63
+ const extra = await loadGitTrackedSourceTextsOutsideIndex(repoRoot, new Set(indexedSourceTexts.keys()));
64
+ if (extra.size > 0) {
65
+ textsForRelocationHints = new Map([...extra, ...indexedSourceTexts]);
66
+ }
67
+ }
68
+ catch {
69
+ /* not a git checkout or ls-files failed — use indexed primaries only */
70
+ }
71
+ for (const hint of relocationHintMessages({
72
+ index,
73
+ missingSourcePathsNorm: missingSourcesNorm,
74
+ gitRenames,
75
+ indexedSourceTextsByPath: textsForRelocationHints,
76
+ })) {
77
+ issues.push({ level: "warn", message: hint });
78
+ }
79
+ return issues;
80
+ }
11
81
  export async function validateProject(repoRoot) {
12
82
  const issues = [];
13
83
  let config;
@@ -48,28 +118,7 @@ export async function validateProject(repoRoot) {
48
118
  });
49
119
  }
50
120
  if (index) {
51
- for (const issue of validateIndexMarkerSemantics(index)) {
52
- issues.push({ level: issue.level, message: issue.message });
53
- }
54
- const seenSources = new Set();
55
- for (const entry of Object.values(index.byCommentrayPath)) {
56
- if (seenSources.has(entry.sourcePath))
57
- continue;
58
- seenSources.add(entry.sourcePath);
59
- const abs = path.join(repoRoot, ...entry.sourcePath.split("/"));
60
- try {
61
- const text = await fs.readFile(abs, "utf8");
62
- for (const issue of validateMarkerBoundariesInSource(text, entry.sourcePath)) {
63
- issues.push({ level: issue.level, message: issue.message });
64
- }
65
- }
66
- catch {
67
- issues.push({
68
- level: "warn",
69
- message: `Could not read "${entry.sourcePath}" to validate Commentray source markers.`,
70
- });
71
- }
72
- }
121
+ issues.push(...(await collectIssuesForLoadedIndex(repoRoot, index)));
73
122
  }
74
123
  pushRelativeGithubLinkConfigWarnings(config, issues);
75
124
  return { issues };
@@ -1 +1 @@
1
- {"version":3,"file":"validate-project.js","sourceRoot":"","sources":["../src/validate-project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validate-project.js","sourceRoot":"","sources":["../src/validate-project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Lists every `*.md` path relative to `sourceAbs`, POSIX separators, skipping `.default`.
3
+ */
4
+ export declare function collectMdRelPathsUnderSourceAbs(sourceAbs: string): Promise<string[]>;
5
+ //# sourceMappingURL=walk-commentray-source-md.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walk-commentray-source-md.d.ts","sourceRoot":"","sources":["../src/walk-commentray-source-md.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAsB,+BAA+B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAuB1F"}
@@ -0,0 +1,33 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ /**
4
+ * Lists every `*.md` path relative to `sourceAbs`, POSIX separators, skipping `.default`.
5
+ */
6
+ export async function collectMdRelPathsUnderSourceAbs(sourceAbs) {
7
+ const out = [];
8
+ async function walk(relDir) {
9
+ const absDir = path.join(sourceAbs, relDir);
10
+ let ents;
11
+ try {
12
+ ents = await fs.readdir(absDir, { withFileTypes: true });
13
+ }
14
+ catch {
15
+ return;
16
+ }
17
+ for (const e of ents) {
18
+ if (e.name === ".default")
19
+ continue;
20
+ const childRel = relDir ? `${relDir}/${e.name}` : e.name;
21
+ const posixRel = childRel.replaceAll("\\", "/");
22
+ if (e.isDirectory()) {
23
+ await walk(posixRel);
24
+ }
25
+ else if (e.isFile() && e.name.endsWith(".md")) {
26
+ out.push(posixRel);
27
+ }
28
+ }
29
+ }
30
+ await walk("");
31
+ return out;
32
+ }
33
+ //# sourceMappingURL=walk-commentray-source-md.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walk-commentray-source-md.js","sourceRoot":"","sources":["../src/walk-commentray-source-md.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,+BAA+B,CAAC,SAAiB;IACrE,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,UAAU,IAAI,CAAC,MAAc;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC5C,IAAI,IAAI,CAAC;QACT,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU;gBAAE,SAAS;YACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACzD,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAChD,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBACpB,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvB,CAAC;iBAAM,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChD,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,GAAG,CAAC;AACb,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@commentray/core",
3
- "version": "0.0.4",
3
+ "version": "0.0.5",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },