@commentray/core 0.0.1 → 0.0.4

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 (97) hide show
  1. package/dist/anchors.d.ts +6 -0
  2. package/dist/anchors.d.ts.map +1 -1
  3. package/dist/anchors.js +11 -0
  4. package/dist/anchors.js.map +1 -1
  5. package/dist/angles-toml.d.ts +18 -0
  6. package/dist/angles-toml.d.ts.map +1 -0
  7. package/dist/angles-toml.js +62 -0
  8. package/dist/angles-toml.js.map +1 -0
  9. package/dist/angles.d.ts +6 -0
  10. package/dist/angles.d.ts.map +1 -0
  11. package/dist/angles.js +14 -0
  12. package/dist/angles.js.map +1 -0
  13. package/dist/block-scroll-pickers.d.ts +22 -0
  14. package/dist/block-scroll-pickers.d.ts.map +1 -0
  15. package/dist/block-scroll-pickers.js +41 -0
  16. package/dist/block-scroll-pickers.js.map +1 -0
  17. package/dist/block-snippet.d.ts +13 -0
  18. package/dist/block-snippet.d.ts.map +1 -0
  19. package/dist/block-snippet.js +30 -0
  20. package/dist/block-snippet.js.map +1 -0
  21. package/dist/blocks.d.ts +66 -0
  22. package/dist/blocks.d.ts.map +1 -0
  23. package/dist/blocks.js +101 -0
  24. package/dist/blocks.js.map +1 -0
  25. package/dist/commentray-index-renames.d.ts +21 -0
  26. package/dist/commentray-index-renames.d.ts.map +1 -0
  27. package/dist/commentray-index-renames.js +85 -0
  28. package/dist/commentray-index-renames.js.map +1 -0
  29. package/dist/commentray-path-resolution.d.ts +20 -0
  30. package/dist/commentray-path-resolution.d.ts.map +1 -0
  31. package/dist/commentray-path-resolution.js +38 -0
  32. package/dist/commentray-path-resolution.js.map +1 -0
  33. package/dist/config.d.ts +48 -0
  34. package/dist/config.d.ts.map +1 -1
  35. package/dist/config.js +72 -6
  36. package/dist/config.js.map +1 -1
  37. package/dist/github-url.d.ts +14 -0
  38. package/dist/github-url.d.ts.map +1 -0
  39. package/dist/github-url.js +25 -0
  40. package/dist/github-url.js.map +1 -0
  41. package/dist/index-normalize.d.ts +10 -0
  42. package/dist/index-normalize.d.ts.map +1 -0
  43. package/dist/index-normalize.js +60 -0
  44. package/dist/index-normalize.js.map +1 -0
  45. package/dist/index-schema-messages.d.ts +6 -0
  46. package/dist/index-schema-messages.d.ts.map +1 -0
  47. package/dist/index-schema-messages.js +26 -0
  48. package/dist/index-schema-messages.js.map +1 -0
  49. package/dist/index.d.ts +25 -6
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +16 -4
  52. package/dist/index.js.map +1 -1
  53. package/dist/marker-ids.d.ts +19 -0
  54. package/dist/marker-ids.d.ts.map +1 -0
  55. package/dist/marker-ids.js +38 -0
  56. package/dist/marker-ids.js.map +1 -0
  57. package/dist/marker-validation.d.ts +22 -0
  58. package/dist/marker-validation.d.ts.map +1 -0
  59. package/dist/marker-validation.js +138 -0
  60. package/dist/marker-validation.js.map +1 -0
  61. package/dist/metadata.d.ts.map +1 -1
  62. package/dist/metadata.js +84 -29
  63. package/dist/metadata.js.map +1 -1
  64. package/dist/migrate.d.ts.map +1 -1
  65. package/dist/migrate.js +52 -14
  66. package/dist/migrate.js.map +1 -1
  67. package/dist/model.d.ts +24 -2
  68. package/dist/model.d.ts.map +1 -1
  69. package/dist/model.js +17 -1
  70. package/dist/model.js.map +1 -1
  71. package/dist/paths.d.ts +18 -2
  72. package/dist/paths.d.ts.map +1 -1
  73. package/dist/paths.js +34 -3
  74. package/dist/paths.js.map +1 -1
  75. package/dist/region-marker-convert.d.ts +27 -0
  76. package/dist/region-marker-convert.d.ts.map +1 -0
  77. package/dist/region-marker-convert.js +78 -0
  78. package/dist/region-marker-convert.js.map +1 -0
  79. package/dist/scm/git-scm-provider.d.ts +7 -1
  80. package/dist/scm/git-scm-provider.d.ts.map +1 -1
  81. package/dist/scm/git-scm-provider.js +42 -0
  82. package/dist/scm/git-scm-provider.js.map +1 -1
  83. package/dist/scm/scm-provider.d.ts +10 -0
  84. package/dist/scm/scm-provider.d.ts.map +1 -1
  85. package/dist/scroll-sync.d.ts +12 -0
  86. package/dist/scroll-sync.d.ts.map +1 -0
  87. package/dist/scroll-sync.js +59 -0
  88. package/dist/scroll-sync.js.map +1 -0
  89. package/dist/source-markers.d.ts +28 -0
  90. package/dist/source-markers.d.ts.map +1 -0
  91. package/dist/source-markers.js +241 -0
  92. package/dist/source-markers.js.map +1 -0
  93. package/dist/validate-project.d.ts +15 -1
  94. package/dist/validate-project.d.ts.map +1 -1
  95. package/dist/validate-project.js +87 -14
  96. package/dist/validate-project.js.map +1 -1
  97. package/package.json +6 -2
package/dist/paths.js CHANGED
@@ -1,4 +1,6 @@
1
+ import fs from "node:fs";
1
2
  import path from "node:path";
3
+ import { assertValidAngleId } from "./angles.js";
2
4
  /**
3
5
  * Normalize a repo-relative path to POSIX separators and reject anything that
4
6
  * would escape the repository root when joined with it.
@@ -23,10 +25,39 @@ export function normalizeRepoRelativePath(relativePath) {
23
25
  }
24
26
  return segments.join("/");
25
27
  }
26
- /** Commentray Markdown path for a repo-relative source file. */
27
- export function commentrayMarkdownPath(sourceRepoRelativePath) {
28
+ /** Commentray Markdown path for a repo-relative source file (implicit default angle, flat layout). */
29
+ export function commentrayMarkdownPath(sourceRepoRelativePath, storageDir = ".commentray") {
28
30
  const normalized = normalizeRepoRelativePath(sourceRepoRelativePath);
29
- return path.posix.join(".commentray", "source", `${normalized}.md`);
31
+ const root = normalizeRepoRelativePath(storageDir.replaceAll("\\", "/"));
32
+ return path.posix.join(root, "source", `${normalized}.md`);
33
+ }
34
+ /**
35
+ * Repo-relative path to the **Angles sentinel**: if this path exists as a file or directory under
36
+ * the storage root, the repository opts into per-source **Angles** layout (see `docs/spec/storage.md`).
37
+ * When absent, the flat `{storage}/source/{P}.md` layout is the only supported shape.
38
+ */
39
+ export function commentrayAnglesSentinelPath(storageDir = ".commentray") {
40
+ const root = normalizeRepoRelativePath(storageDir.replaceAll("\\", "/"));
41
+ return path.posix.join(root, "source", ".default");
42
+ }
43
+ /**
44
+ * Returns true when the repository opts into **Angles** layout: `{storage}/source/.default` exists
45
+ * (file or directory). When false, only the flat `{storage}/source/{P}.md` mapping applies.
46
+ */
47
+ export function commentrayAnglesLayoutEnabled(repoRoot, storageDir = ".commentray") {
48
+ const sentinel = commentrayAnglesSentinelPath(storageDir);
49
+ const absolute = path.join(repoRoot, ...sentinel.split("/"));
50
+ return fs.existsSync(absolute);
51
+ }
52
+ /**
53
+ * Repo-relative path to commentray for `sourceRepoRelativePath` at a named **Angle** (multi-angle layout).
54
+ * Example: `README.md` + `architecture` → `.commentray/source/README.md/architecture.md` (with default storage dir).
55
+ */
56
+ export function commentrayMarkdownPathForAngle(sourceRepoRelativePath, angleId, storageDir = ".commentray") {
57
+ const normalized = normalizeRepoRelativePath(sourceRepoRelativePath);
58
+ const sid = assertValidAngleId(angleId);
59
+ const root = normalizeRepoRelativePath(storageDir.replaceAll("\\", "/"));
60
+ return path.posix.join(root, "source", normalized, `${sid}.md`);
30
61
  }
31
62
  /** Default metadata index location (repo-relative). */
32
63
  export function defaultMetadataIndexPath() {
package/dist/paths.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,yBAAyB,CAAC,YAAoB;IAC5D,MAAM,KAAK,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACjD,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,mDAAmD,YAAY,GAAG,CAAC,CAAC;IACtF,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IAC1E,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,iCAAiC,YAAY,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,sBAAsB,CAAC,sBAA8B;IACnE,MAAM,UAAU,GAAG,yBAAyB,CAAC,sBAAsB,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,GAAG,UAAU,KAAK,CAAC,CAAC;AACtE,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,wBAAwB;IACtC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;AAClE,CAAC"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /** One paired Commentray delimiter span in source (0-based line indices). */
2
+ export type CommentrayMarkerPair = {
3
+ id: string;
4
+ /** Line index of the opening delimiter. */
5
+ startLine0: number;
6
+ /** Line index of the closing delimiter. */
7
+ endLine0: number;
8
+ };
9
+ /** Leading tabs/spaces on a line (used when rewriting markers). */
10
+ export declare function leadingIndentOfLine(line: string): string;
11
+ /**
12
+ * Finds well-formed start/end pairs in source order. Unmatched starts (same id
13
+ * opened twice without an end) keep the first start; orphan ends are ignored.
14
+ */
15
+ export declare function findCommentrayMarkerPairs(sourceText: string): CommentrayMarkerPair[];
16
+ /**
17
+ * Rewrites every detected Commentray marker pair to the delimiter style for
18
+ * `targetLanguageId` (see {@link commentrayRegionInsertions}). Processes from
19
+ * the bottom of the file upward so line indices stay valid. Preserves inner
20
+ * lines exactly; normalises CRLF to LF in the result.
21
+ */
22
+ export declare function convertCommentraySourceMarkersToLanguage(sourceText: string, targetLanguageId: string): {
23
+ sourceText: string;
24
+ changed: boolean;
25
+ convertedPairs: number;
26
+ };
27
+ //# sourceMappingURL=region-marker-convert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"region-marker-convert.d.ts","sourceRoot":"","sources":["../src/region-marker-convert.ts"],"names":[],"mappings":"AAEA,6EAA6E;AAC7E,MAAM,MAAM,oBAAoB,GAAG;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,mEAAmE;AACnE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAkBpF;AAoBD;;;;;GAKG;AACH,wBAAgB,wCAAwC,CACtD,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,MAAM,GACvB;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAsBlE"}
@@ -0,0 +1,78 @@
1
+ import { commentrayRegionInsertions, parseCommentrayRegionBoundary } from "./source-markers.js";
2
+ /** Leading tabs/spaces on a line (used when rewriting markers). */
3
+ export function leadingIndentOfLine(line) {
4
+ const m = /^[\t ]*/.exec(line);
5
+ return m ? m[0] : "";
6
+ }
7
+ /**
8
+ * Finds well-formed start/end pairs in source order. Unmatched starts (same id
9
+ * opened twice without an end) keep the first start; orphan ends are ignored.
10
+ */
11
+ export function findCommentrayMarkerPairs(sourceText) {
12
+ const lines = sourceText.replaceAll("\r\n", "\n").split("\n");
13
+ const pending = new Map();
14
+ const pairs = [];
15
+ for (let i = 0; i < lines.length; i++) {
16
+ const hit = parseCommentrayRegionBoundary(lines[i]);
17
+ if (!hit)
18
+ continue;
19
+ if (hit.kind === "start") {
20
+ if (!pending.has(hit.id))
21
+ pending.set(hit.id, i);
22
+ continue;
23
+ }
24
+ const start0 = pending.get(hit.id);
25
+ if (start0 === undefined)
26
+ continue;
27
+ if (i <= start0)
28
+ continue;
29
+ pairs.push({ id: hit.id, startLine0: start0, endLine0: i });
30
+ pending.delete(hit.id);
31
+ }
32
+ return pairs;
33
+ }
34
+ function replaceOnePair(lines, pair, targetLanguageId) {
35
+ if (pair.endLine0 <= pair.startLine0)
36
+ return null;
37
+ const indent = leadingIndentOfLine(lines[pair.startLine0] ?? "");
38
+ const { start, end } = commentrayRegionInsertions(targetLanguageId, pair.id, indent);
39
+ const innerLines = lines.slice(pair.startLine0 + 1, pair.endLine0);
40
+ const inner = innerLines.join("\n");
41
+ const combined = innerLines.length === 0 ? `${start.replace(/\n$/, "")}${end}` : `${start}${inner}${end}`;
42
+ const inserted = combined.split("\n");
43
+ const before = lines.slice(0, pair.startLine0);
44
+ const after = lines.slice(pair.endLine0 + 1);
45
+ return [...before, ...inserted, ...after];
46
+ }
47
+ /**
48
+ * Rewrites every detected Commentray marker pair to the delimiter style for
49
+ * `targetLanguageId` (see {@link commentrayRegionInsertions}). Processes from
50
+ * the bottom of the file upward so line indices stay valid. Preserves inner
51
+ * lines exactly; normalises CRLF to LF in the result.
52
+ */
53
+ export function convertCommentraySourceMarkersToLanguage(sourceText, targetLanguageId) {
54
+ const normalised = sourceText.replaceAll("\r\n", "\n");
55
+ const pairs = findCommentrayMarkerPairs(normalised);
56
+ if (pairs.length === 0) {
57
+ return { sourceText: normalised, changed: normalised !== sourceText, convertedPairs: 0 };
58
+ }
59
+ let lines = normalised.split("\n");
60
+ let converted = 0;
61
+ for (const pair of [...pairs].sort((a, b) => b.startLine0 - a.startLine0)) {
62
+ const snapshot = lines.join("\n");
63
+ const next = replaceOnePair(lines, pair, targetLanguageId);
64
+ if (next === null)
65
+ continue;
66
+ const nextStr = next.join("\n");
67
+ if (nextStr !== snapshot)
68
+ converted++;
69
+ lines = next;
70
+ }
71
+ const out = lines.join("\n");
72
+ return {
73
+ sourceText: out,
74
+ changed: out !== normalised,
75
+ convertedPairs: converted,
76
+ };
77
+ }
78
+ //# sourceMappingURL=region-marker-convert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"region-marker-convert.js","sourceRoot":"","sources":["../src/region-marker-convert.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,12 @@
1
- import type { ScmProvider } from "./scm-provider.js";
1
+ import type { ScmPathRename, ScmProvider } from "./scm-provider.js";
2
+ /**
3
+ * Parses `git diff --name-status` output for `R` (rename) lines. Tab-separated
4
+ * `R086\told/path\tnew/path` (score optional).
5
+ */
6
+ export declare function parseGitRenameLines(stdout: string): ScmPathRename[];
2
7
  export declare class GitScmProvider implements ScmProvider {
3
8
  getBlobIdAtHead(repoRoot: string, repoRelativePath: string): Promise<string | null>;
4
9
  isAncestor(repoRoot: string, possibleAncestor: string, commit: string): Promise<boolean>;
10
+ listPathRenamesBetweenTreeishes(repoRoot: string, fromTreeish: string, toTreeish: string): Promise<ScmPathRename[]>;
5
11
  }
6
12
  //# sourceMappingURL=git-scm-provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"git-scm-provider.d.ts","sourceRoot":"","sources":["../../src/scm/git-scm-provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA0BrD,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;CAW/F"}
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,4 +1,5 @@
1
1
  import { spawn } from "node:child_process";
2
+ import { normalizeRepoRelativePath } from "../paths.js";
2
3
  function runGit(repoRoot, args) {
3
4
  return new Promise((resolve, reject) => {
4
5
  const child = spawn("git", args, {
@@ -19,6 +20,34 @@ function runGit(repoRoot, args) {
19
20
  });
20
21
  });
21
22
  }
23
+ /**
24
+ * Parses `git diff --name-status` output for `R` (rename) lines. Tab-separated
25
+ * `R086\told/path\tnew/path` (score optional).
26
+ */
27
+ export function parseGitRenameLines(stdout) {
28
+ const out = [];
29
+ for (const line of stdout.split("\n")) {
30
+ const t = line.trim();
31
+ if (!t)
32
+ continue;
33
+ const parts = t.split("\t");
34
+ if (parts.length < 3)
35
+ continue;
36
+ const status = parts[0] ?? "";
37
+ if (!status.startsWith("R"))
38
+ continue;
39
+ try {
40
+ out.push({
41
+ from: normalizeRepoRelativePath(parts[1] ?? ""),
42
+ to: normalizeRepoRelativePath(parts[2] ?? ""),
43
+ });
44
+ }
45
+ catch {
46
+ continue;
47
+ }
48
+ }
49
+ return out;
50
+ }
22
51
  export class GitScmProvider {
23
52
  async getBlobIdAtHead(repoRoot, repoRelativePath) {
24
53
  const posixPath = repoRelativePath.replaceAll("\\", "/").replace(/^\/+/, "");
@@ -46,5 +75,18 @@ export class GitScmProvider {
46
75
  return false;
47
76
  throw new Error(`git merge-base failed (${code}): ${stderr.trim()}`);
48
77
  }
78
+ async listPathRenamesBetweenTreeishes(repoRoot, fromTreeish, toTreeish) {
79
+ const { code, stdout, stderr } = await runGit(repoRoot, [
80
+ "diff",
81
+ "--name-status",
82
+ "-M30%",
83
+ fromTreeish,
84
+ toTreeish,
85
+ ]);
86
+ if (code !== 0) {
87
+ throw new Error(`git diff --name-status failed (${code}): ${stderr.trim() || stdout.trim()}`);
88
+ }
89
+ return parseGitRenameLines(stdout);
90
+ }
49
91
  }
50
92
  //# sourceMappingURL=git-scm-provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"git-scm-provider.js","sourceRoot":"","sources":["../../src/scm/git-scm-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG3C,SAAS,MAAM,CACb,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;AAED,MAAM,OAAO,cAAc;IACzB,KAAK,CAAC,eAAe,CAAC,QAAgB,EAAE,gBAAwB;QAC9D,MAAM,SAAS,GAAG,gBAAgB,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC7E,MAAM,IAAI,GAAG,QAAQ,SAAS,EAAE,CAAC;QACjC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;QAC7E,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,IACE,gCAAgC,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC7C,+BAA+B,CAAC,IAAI,CAAC,MAAM,CAAC,EAC5C,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,gBAAwB,EAAE,MAAc;QACzE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE;YAC9C,YAAY;YACZ,eAAe;YACf,gBAAgB;YAChB,MAAM;SACP,CAAC,CAAC;QACH,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5B,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACvE,CAAC;CACF"}
1
+ {"version":3,"file":"git-scm-provider.js","sourceRoot":"","sources":["../../src/scm/git-scm-provider.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,18 @@
1
+ /** A path Git detected as renamed between two tree-ish objects (`git diff --name-status -M`). */
2
+ export type ScmPathRename = {
3
+ from: string;
4
+ to: string;
5
+ };
1
6
  /** Pluggable SCM integration; Git is the default implementation. */
2
7
  export type ScmProvider = {
3
8
  /** Object id for file at HEAD (Git blob), or null if unknown/untracked. */
4
9
  getBlobIdAtHead(repoRoot: string, repoRelativePath: string): Promise<string | null>;
5
10
  /** True if `possibleAncestor` is an ancestor of `commit` (inclusive). */
6
11
  isAncestor(repoRoot: string, possibleAncestor: string, commit: string): Promise<boolean>;
12
+ /**
13
+ * Optional: list file renames Git detected between `fromTreeish` and `toTreeish`
14
+ * (same semantics as `git diff --name-status -M30% fromTreeish toTreeish`).
15
+ */
16
+ listPathRenamesBetweenTreeishes?: (repoRoot: string, fromTreeish: string, toTreeish: string) => Promise<ScmPathRename[]>;
7
17
  };
8
18
  //# sourceMappingURL=scm-provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scm-provider.d.ts","sourceRoot":"","sources":["../../src/scm/scm-provider.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,MAAM,MAAM,WAAW,GAAG;IACxB,2EAA2E;IAC3E,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACpF,yEAAyE;IACzE,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1F,CAAC"}
1
+ {"version":3,"file":"scm-provider.d.ts","sourceRoot":"","sources":["../../src/scm/scm-provider.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD,oEAAoE;AACpE,MAAM,MAAM,WAAW,GAAG;IACxB,2EAA2E;IAC3E,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACpF,yEAAyE;IACzE,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzF;;;OAGG;IACH,+BAA+B,CAAC,EAAE,CAChC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,KACd,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;CAC/B,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { BlockScrollLink } from "./block-scroll-pickers.js";
2
+ import type { CommentrayIndex } from "./model.js";
3
+ export type { BlockScrollLink } from "./block-scroll-pickers.js";
4
+ export { pickCommentrayLineForSourceScroll, pickSourceLine0ForCommentrayScroll, } from "./block-scroll-pickers.js";
5
+ /**
6
+ * Correlate index blocks with `<!-- commentray:block id=… -->` markers in
7
+ * commentray. Supports legacy `lines:` anchors and `marker:` anchors (the
8
+ * latter needs `sourceText` to resolve marker comments in the primary file).
9
+ * Sorted by `sourceStart`.
10
+ */
11
+ export declare function buildBlockScrollLinks(index: CommentrayIndex | null | undefined, sourceRelative: string, commentrayPath: string, commentrayMarkdown: string, sourceText?: string): BlockScrollLink[];
12
+ //# sourceMappingURL=scroll-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scroll-sync.d.ts","sourceRoot":"","sources":["../src/scroll-sync.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,YAAY,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EACL,iCAAiC,EACjC,kCAAkC,GACnC,MAAM,2BAA2B,CAAC;AAcnC;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EACzC,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,kBAAkB,EAAE,MAAM,EAC1B,UAAU,CAAC,EAAE,MAAM,GAClB,eAAe,EAAE,CAgCnB"}
@@ -0,0 +1,59 @@
1
+ import { parseAnchor } from "./anchors.js";
2
+ import { MARKER_ID_BODY } from "./marker-ids.js";
3
+ import { sourceLineRangeForMarkerId } from "./source-markers.js";
4
+ export { pickCommentrayLineForSourceScroll, pickSourceLine0ForCommentrayScroll, } from "./block-scroll-pickers.js";
5
+ const BLOCK_MARKER_RE = new RegExp(`<!-- commentray:block id=(${MARKER_ID_BODY}) -->`);
6
+ function markerLineByIdFromMarkdown(markdown) {
7
+ const map = new Map();
8
+ const lines = markdown.split("\n");
9
+ for (let i = 0; i < lines.length; i++) {
10
+ const match = BLOCK_MARKER_RE.exec(lines[i]);
11
+ if (match)
12
+ map.set(match[1], i);
13
+ }
14
+ return map;
15
+ }
16
+ /**
17
+ * Correlate index blocks with `<!-- commentray:block id=… -->` markers in
18
+ * commentray. Supports legacy `lines:` anchors and `marker:` anchors (the
19
+ * latter needs `sourceText` to resolve marker comments in the primary file).
20
+ * Sorted by `sourceStart`.
21
+ */
22
+ export function buildBlockScrollLinks(index, sourceRelative, commentrayPath, commentrayMarkdown, sourceText) {
23
+ const entry = index?.byCommentrayPath[commentrayPath];
24
+ if (!entry || entry.sourcePath !== sourceRelative || entry.blocks.length === 0)
25
+ return [];
26
+ const markerLineById = markerLineByIdFromMarkdown(commentrayMarkdown);
27
+ const links = [];
28
+ for (const block of entry.blocks) {
29
+ const anchor = parseAnchor(block.anchor);
30
+ const commentrayLine = markerLineById.get(block.id);
31
+ if (commentrayLine === undefined)
32
+ continue;
33
+ if (anchor.kind === "lines") {
34
+ links.push({
35
+ id: block.id,
36
+ commentrayLine,
37
+ sourceStart: anchor.range.start,
38
+ sourceEnd: anchor.range.end,
39
+ });
40
+ continue;
41
+ }
42
+ if (anchor.kind === "marker") {
43
+ if (sourceText === undefined)
44
+ continue;
45
+ const range = sourceLineRangeForMarkerId(sourceText, anchor.id);
46
+ if (range === null)
47
+ continue;
48
+ links.push({
49
+ id: block.id,
50
+ commentrayLine,
51
+ sourceStart: range.start,
52
+ sourceEnd: range.end,
53
+ });
54
+ }
55
+ }
56
+ links.sort((a, b) => a.sourceStart - b.sourceStart);
57
+ return links;
58
+ }
59
+ //# sourceMappingURL=scroll-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scroll-sync.js","sourceRoot":"","sources":["../src/scroll-sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAGjE,OAAO,EACL,iCAAiC,EACjC,kCAAkC,GACnC,MAAM,2BAA2B,CAAC;AAEnC,MAAM,eAAe,GAAG,IAAI,MAAM,CAAC,6BAA6B,cAAc,OAAO,CAAC,CAAC;AAEvF,SAAS,0BAA0B,CAAC,QAAgB;IAClD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,KAAK;YAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAyC,EACzC,cAAsB,EACtB,cAAsB,EACtB,kBAA0B,EAC1B,UAAmB;IAEnB,MAAM,KAAK,GAAG,KAAK,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;IACtD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,KAAK,cAAc,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC1F,MAAM,cAAc,GAAG,0BAA0B,CAAC,kBAAkB,CAAC,CAAC;IACtE,MAAM,KAAK,GAAsB,EAAE,CAAC;IACpC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,cAAc,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpD,IAAI,cAAc,KAAK,SAAS;YAAE,SAAS;QAC3C,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC;gBACT,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,cAAc;gBACd,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK;gBAC/B,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG;aAC5B,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,IAAI,UAAU,KAAK,SAAS;gBAAE,SAAS;YACvC,MAAM,KAAK,GAAG,0BAA0B,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;YAChE,IAAI,KAAK,KAAK,IAAI;gBAAE,SAAS;YAC7B,KAAK,CAAC,IAAI,CAAC;gBACT,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,cAAc;gBACd,WAAW,EAAE,KAAK,CAAC,KAAK;gBACxB,SAAS,EAAE,KAAK,CAAC,GAAG;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;IACpD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Line comment leader for **generic** `commentray:start` / `end` markers
3
+ * (`// …`, `# …`, etc.). Not used for `#region` family languages.
4
+ */
5
+ export declare function lineCommentLeaderForLanguage(languageId: string): string;
6
+ /**
7
+ * Insertion fragments for wrapping the selection (apply **end** first, then
8
+ * **start**, so stable offsets). Pass the same indentation string Region Marker
9
+ * uses (leading whitespace of the first selected line).
10
+ */
11
+ export declare function commentrayRegionInsertions(languageId: string, markerId: string, indent?: string): {
12
+ start: string;
13
+ end: string;
14
+ };
15
+ export type RegionBoundaryKind = "start" | "end";
16
+ /** Detect a Commentray region, generic marker, or legacy marker line; id is lower-case. */
17
+ export declare function parseCommentrayRegionBoundary(line: string): {
18
+ kind: RegionBoundaryKind;
19
+ id: string;
20
+ } | null;
21
+ /**
22
+ * 1-based inclusive source lines **between** paired region / generic / legacy marker lines.
23
+ */
24
+ export declare function sourceLineRangeForMarkerId(sourceText: string, markerId: string): {
25
+ start: number;
26
+ end: number;
27
+ } | null;
28
+ //# sourceMappingURL=source-markers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-markers.d.ts","sourceRoot":"","sources":["../src/source-markers.ts"],"names":[],"mappings":"AAyGA;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAMvE;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,SAAK,GACV;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAuDhC;AAED,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,KAAK,CAAC;AAEjD,2FAA2F;AAC3F,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,MAAM,GACX;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA8CjD;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf;IACD,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb,GAAG,IAAI,CAgBP"}