@commentray/core 0.0.2 → 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 (83) 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.map +1 -1
  6. package/dist/angles-toml.js.map +1 -1
  7. package/dist/block-scroll-pickers.d.ts +22 -0
  8. package/dist/block-scroll-pickers.d.ts.map +1 -0
  9. package/dist/block-scroll-pickers.js +41 -0
  10. package/dist/block-scroll-pickers.js.map +1 -0
  11. package/dist/block-snippet.d.ts +13 -0
  12. package/dist/block-snippet.d.ts.map +1 -0
  13. package/dist/block-snippet.js +30 -0
  14. package/dist/block-snippet.js.map +1 -0
  15. package/dist/blocks.d.ts.map +1 -1
  16. package/dist/blocks.js +13 -13
  17. package/dist/blocks.js.map +1 -1
  18. package/dist/commentray-index-renames.d.ts +21 -0
  19. package/dist/commentray-index-renames.d.ts.map +1 -0
  20. package/dist/commentray-index-renames.js +85 -0
  21. package/dist/commentray-index-renames.js.map +1 -0
  22. package/dist/commentray-path-resolution.js +1 -1
  23. package/dist/commentray-path-resolution.js.map +1 -1
  24. package/dist/config.d.ts.map +1 -1
  25. package/dist/config.js +6 -4
  26. package/dist/config.js.map +1 -1
  27. package/dist/index-normalize.d.ts +10 -0
  28. package/dist/index-normalize.d.ts.map +1 -0
  29. package/dist/index-normalize.js +60 -0
  30. package/dist/index-normalize.js.map +1 -0
  31. package/dist/index-schema-messages.d.ts +6 -0
  32. package/dist/index-schema-messages.d.ts.map +1 -0
  33. package/dist/index-schema-messages.js +26 -0
  34. package/dist/index-schema-messages.js.map +1 -0
  35. package/dist/index.d.ts +14 -5
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +9 -3
  38. package/dist/index.js.map +1 -1
  39. package/dist/marker-ids.d.ts +19 -0
  40. package/dist/marker-ids.d.ts.map +1 -0
  41. package/dist/marker-ids.js +38 -0
  42. package/dist/marker-ids.js.map +1 -0
  43. package/dist/marker-validation.d.ts +22 -0
  44. package/dist/marker-validation.d.ts.map +1 -0
  45. package/dist/marker-validation.js +138 -0
  46. package/dist/marker-validation.js.map +1 -0
  47. package/dist/metadata.d.ts.map +1 -1
  48. package/dist/metadata.js +54 -25
  49. package/dist/metadata.js.map +1 -1
  50. package/dist/migrate.d.ts.map +1 -1
  51. package/dist/migrate.js +20 -4
  52. package/dist/migrate.js.map +1 -1
  53. package/dist/model.d.ts +13 -26
  54. package/dist/model.d.ts.map +1 -1
  55. package/dist/model.js +16 -0
  56. package/dist/model.js.map +1 -1
  57. package/dist/paths.d.ts +1 -1
  58. package/dist/paths.d.ts.map +1 -1
  59. package/dist/paths.js +3 -2
  60. package/dist/paths.js.map +1 -1
  61. package/dist/region-marker-convert.d.ts +27 -0
  62. package/dist/region-marker-convert.d.ts.map +1 -0
  63. package/dist/region-marker-convert.js +78 -0
  64. package/dist/region-marker-convert.js.map +1 -0
  65. package/dist/scm/git-scm-provider.d.ts +7 -1
  66. package/dist/scm/git-scm-provider.d.ts.map +1 -1
  67. package/dist/scm/git-scm-provider.js +42 -0
  68. package/dist/scm/git-scm-provider.js.map +1 -1
  69. package/dist/scm/scm-provider.d.ts +10 -0
  70. package/dist/scm/scm-provider.d.ts.map +1 -1
  71. package/dist/scroll-sync.d.ts +8 -23
  72. package/dist/scroll-sync.d.ts.map +1 -1
  73. package/dist/scroll-sync.js +31 -52
  74. package/dist/scroll-sync.js.map +1 -1
  75. package/dist/source-markers.d.ts +28 -0
  76. package/dist/source-markers.d.ts.map +1 -0
  77. package/dist/source-markers.js +241 -0
  78. package/dist/source-markers.js.map +1 -0
  79. package/dist/validate-project.d.ts +9 -1
  80. package/dist/validate-project.d.ts.map +1 -1
  81. package/dist/validate-project.js +57 -15
  82. package/dist/validate-project.js.map +1 -1
  83. package/package.json +6 -2
@@ -0,0 +1,26 @@
1
+ import { CURRENT_SCHEMA_VERSION } from "./model.js";
2
+ function formatObservedSchema(raw) {
3
+ if (raw === undefined)
4
+ return "missing";
5
+ if (typeof raw === "number" || typeof raw === "string")
6
+ return String(raw);
7
+ return JSON.stringify(raw);
8
+ }
9
+ /**
10
+ * Recovery steps when `index.json` `schemaVersion` does not match this build’s
11
+ * {@link CURRENT_SCHEMA_VERSION} (shown explicitly so you know which number to target).
12
+ */
13
+ export function describeIndexSchemaRemediation(observedSchema) {
14
+ const obs = formatObservedSchema(observedSchema);
15
+ return (`This install expects "schemaVersion": ${String(CURRENT_SCHEMA_VERSION)} in index.json (bundled @commentray/core). ` +
16
+ `This file has ${obs}. ` +
17
+ `What to do: ` +
18
+ `(1) Upgrade Commentray from the same git revision as the index author — from the repo run \`bash scripts/install-extension.sh\` ` +
19
+ `or \`npm run extension:dogfood\`, then **Developer: Reload Window**. ` +
20
+ `(2) If the index was written by a *newer* CLI, install that newer Commentray, or open the repo with *this* build: ` +
21
+ `readIndex downgrades a newer numeric schema after writing a backup under \`.commentray/metadata/\` ` +
22
+ `named \`index.schema-<old>-backup-<timestamp>.json\`. ` +
23
+ `(3) Last resort after copying \`.commentray/metadata/\` elsewhere: set \`"schemaVersion": ${String(CURRENT_SCHEMA_VERSION)}\` ` +
24
+ `only if the rest of the JSON still matches this version’s validator.`);
25
+ }
26
+ //# sourceMappingURL=index-schema-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-schema-messages.js","sourceRoot":"","sources":["../src/index-schema-messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpD,SAAS,oBAAoB,CAAC,GAAY;IACxC,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3E,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,8BAA8B,CAAC,cAAuB;IACpE,MAAM,GAAG,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAC;IACjD,OAAO,CACL,yCAAyC,MAAM,CAAC,sBAAsB,CAAC,6CAA6C;QACpH,iBAAiB,GAAG,IAAI;QACxB,cAAc;QACd,kIAAkI;QAClI,uEAAuE;QACvE,oHAAoH;QACpH,qGAAqG;QACrG,wDAAwD;QACxD,6FAA6F,MAAM,CAAC,sBAAsB,CAAC,KAAK;QAChI,sEAAsE,CACvE,CAAC;AACJ,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- export type { CommentrayBlock, CommentrayBlockFingerprint, CommentrayIndex, SourceFileIndexEntry, } from "./model.js";
2
- export { CURRENT_SCHEMA_VERSION } from "./model.js";
1
+ export type { CommentrayBlock, CommentrayIndex, SourceFileIndexEntry } from "./model.js";
2
+ 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";
@@ -12,16 +12,25 @@ export type { CommentrayToml, ResolvedAngleDefinition, ResolvedAngles, ResolvedC
12
12
  export { loadCommentrayConfig, mergeCommentrayConfig } from "./config.js";
13
13
  export { githubRepoBlobFileUrl, parseGithubRepoWebUrl } from "./github-url.js";
14
14
  export { assertValidIndex, emptyIndex } from "./metadata.js";
15
+ export { describeIndexSchemaRemediation } from "./index-schema-messages.js";
15
16
  export { migrateIndex } from "./migrate.js";
16
17
  export type { ParsedAnchor } from "./anchors.js";
17
18
  export { formatLineRange, parseAnchor } from "./anchors.js";
18
- export type { ScmProvider } from "./scm/scm-provider.js";
19
- export { GitScmProvider } from "./scm/git-scm-provider.js";
19
+ export type { ScmPathRename, ScmProvider } from "./scm/scm-provider.js";
20
+ export { GitScmProvider, parseGitRenameLines } from "./scm/git-scm-provider.js";
21
+ export { applyPathRenamesToCommentrayIndex, inferAngleIdFromCommentrayPath, } from "./commentray-index-renames.js";
22
+ export type { PathRename } from "./commentray-index-renames.js";
20
23
  export type { BlockDiagnostic } from "./staleness.js";
21
24
  export { diagnoseBlock } from "./staleness.js";
22
25
  export type { ValidationIssue, ValidationResult } from "./validate-project.js";
23
- export { readIndex, validateProject, writeIndex } from "./validate-project.js";
26
+ export { readIndex, refreshIndexMigrationsOnDisk, validateProject, writeIndex, } from "./validate-project.js";
24
27
  export { runCommanderMain } from "./cli-bootstrap.js";
25
28
  export type { BlockScrollLink } from "./scroll-sync.js";
26
29
  export { buildBlockScrollLinks, pickCommentrayLineForSourceScroll, pickSourceLine0ForCommentrayScroll, } from "./scroll-sync.js";
30
+ export { commentrayRegionInsertions, lineCommentLeaderForLanguage, parseCommentrayRegionBoundary, sourceLineRangeForMarkerId, } from "./source-markers.js";
31
+ export type { CommentrayMarkerPair } from "./region-marker-convert.js";
32
+ export { convertCommentraySourceMarkersToLanguage, findCommentrayMarkerPairs, leadingIndentOfLine, } from "./region-marker-convert.js";
33
+ export { MARKER_ID_BODY, assertValidMarkerId, normaliseMarkerSlugOrThrow } from "./marker-ids.js";
34
+ export type { MarkerValidationIssue } from "./marker-validation.js";
35
+ export { validateIndexMarkerSemantics, validateMarkerBoundariesInSource, } from "./marker-validation.js";
27
36
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,0BAA0B,EAC1B,eAAe,EACf,oBAAoB,GACrB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,YAAY,EACV,oBAAoB,EACpB,UAAU,EACV,wBAAwB,EACxB,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,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;AACnG,YAAY,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,6BAA6B,GAC9B,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,8BAA8B,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EACL,6BAA6B,EAC7B,4BAA4B,EAC5B,sBAAsB,EACtB,8BAA8B,EAC9B,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,cAAc,EACd,uBAAuB,EACvB,cAAc,EACd,wBAAwB,EACxB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,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,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC5D,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EACL,qBAAqB,EACrB,iCAAiC,EACjC,kCAAkC,GACnC,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { CURRENT_SCHEMA_VERSION } from "./model.js";
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
4
  export { ensureAnglesSentinelFile, upsertAngleDefinitionInCommentrayToml } from "./angles-toml.js";
@@ -7,11 +7,17 @@ export { commentrayAnglesLayoutEnabled, commentrayAnglesSentinelPath, commentray
7
7
  export { loadCommentrayConfig, mergeCommentrayConfig } from "./config.js";
8
8
  export { githubRepoBlobFileUrl, parseGithubRepoWebUrl } from "./github-url.js";
9
9
  export { assertValidIndex, emptyIndex } from "./metadata.js";
10
+ export { describeIndexSchemaRemediation } from "./index-schema-messages.js";
10
11
  export { migrateIndex } from "./migrate.js";
11
12
  export { formatLineRange, parseAnchor } from "./anchors.js";
12
- export { GitScmProvider } from "./scm/git-scm-provider.js";
13
+ export { GitScmProvider, parseGitRenameLines } from "./scm/git-scm-provider.js";
14
+ export { applyPathRenamesToCommentrayIndex, inferAngleIdFromCommentrayPath, } from "./commentray-index-renames.js";
13
15
  export { diagnoseBlock } from "./staleness.js";
14
- export { readIndex, validateProject, writeIndex } from "./validate-project.js";
16
+ export { readIndex, refreshIndexMigrationsOnDisk, validateProject, writeIndex, } from "./validate-project.js";
15
17
  export { runCommanderMain } from "./cli-bootstrap.js";
16
18
  export { buildBlockScrollLinks, pickCommentrayLineForSourceScroll, pickSourceLine0ForCommentrayScroll, } from "./scroll-sync.js";
19
+ export { commentrayRegionInsertions, lineCommentLeaderForLanguage, parseCommentrayRegionBoundary, sourceLineRangeForMarkerId, } from "./source-markers.js";
20
+ export { convertCommentraySourceMarkersToLanguage, findCommentrayMarkerPairs, leadingIndentOfLine, } from "./region-marker-convert.js";
21
+ export { MARKER_ID_BODY, assertValidMarkerId, normaliseMarkerSlugOrThrow } from "./marker-ids.js";
22
+ export { validateIndexMarkerSemantics, validateMarkerBoundariesInSource, } from "./marker-validation.js";
17
23
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAOpD,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,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EACL,qBAAqB,EACrB,iCAAiC,EACjC,kCAAkC,GACnC,MAAM,kBAAkB,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,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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Marker / block ids used in `marker:<id>` anchors, `markerId` in the index, and
3
+ * `commentray:<id>` / `commentray:start id=<id>` in source. Designed so authors
4
+ * can type **short slugs** (`intro`, `auth-flow`, `todo_1`) while tooling stays strict.
5
+ */
6
+ /** Body: 1–64 chars, ASCII letters, digits, hyphen, underscore; must not be empty after trim. */
7
+ export declare const MARKER_ID_BODY = "[a-z0-9][a-z0-9_-]{0,63}";
8
+ /**
9
+ * Validates and returns the normalised (lower-case) marker id, or throws with a
10
+ * message suitable for CLI / editor output.
11
+ */
12
+ export declare function assertValidMarkerId(raw: string): string;
13
+ /**
14
+ * Turns free-form author input into a valid marker id when possible: lower-case,
15
+ * spaces → hyphens, strips other punctuation. Throws if the result is empty or
16
+ * still invalid — callers may fall back to {@link generateBlockId} from `blocks.js`.
17
+ */
18
+ export declare function normaliseMarkerSlugOrThrow(raw: string): string;
19
+ //# sourceMappingURL=marker-ids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marker-ids.d.ts","sourceRoot":"","sources":["../src/marker-ids.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,iGAAiG;AACjG,eAAO,MAAM,cAAc,6BAA6B,CAAC;AAIzD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CASvD;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAW9D"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Marker / block ids used in `marker:<id>` anchors, `markerId` in the index, and
3
+ * `commentray:<id>` / `commentray:start id=<id>` in source. Designed so authors
4
+ * can type **short slugs** (`intro`, `auth-flow`, `todo_1`) while tooling stays strict.
5
+ */
6
+ /** Body: 1–64 chars, ASCII letters, digits, hyphen, underscore; must not be empty after trim. */
7
+ export const MARKER_ID_BODY = "[a-z0-9][a-z0-9_-]{0,63}";
8
+ const MARKER_ID_RE = new RegExp(`^${MARKER_ID_BODY}$`, "i");
9
+ /**
10
+ * Validates and returns the normalised (lower-case) marker id, or throws with a
11
+ * message suitable for CLI / editor output.
12
+ */
13
+ export function assertValidMarkerId(raw) {
14
+ const id = raw.trim().toLowerCase();
15
+ if (!MARKER_ID_RE.test(id)) {
16
+ throw new Error(`Invalid marker id "${raw}". Use 1–64 characters: a–z, 0–9, hyphen (-), underscore (_); ` +
17
+ `must start with a letter or digit. Examples: intro, auth-flow, block_01, a3f9k2`);
18
+ }
19
+ return id;
20
+ }
21
+ /**
22
+ * Turns free-form author input into a valid marker id when possible: lower-case,
23
+ * spaces → hyphens, strips other punctuation. Throws if the result is empty or
24
+ * still invalid — callers may fall back to {@link generateBlockId} from `blocks.js`.
25
+ */
26
+ export function normaliseMarkerSlugOrThrow(raw) {
27
+ const slug = raw
28
+ .trim()
29
+ .toLowerCase()
30
+ .replace(/\s+/g, "-")
31
+ .replace(/[^a-z0-9_-]+/g, "")
32
+ .replace(/-+/g, "-")
33
+ .replace(/_+/g, "_")
34
+ .replace(/^-+|-+$/g, "")
35
+ .replace(/^_|_$/g, "");
36
+ return assertValidMarkerId(slug);
37
+ }
38
+ //# sourceMappingURL=marker-ids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marker-ids.js","sourceRoot":"","sources":["../src/marker-ids.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,iGAAiG;AACjG,MAAM,CAAC,MAAM,cAAc,GAAG,0BAA0B,CAAC;AAEzD,MAAM,YAAY,GAAG,IAAI,MAAM,CAAC,IAAI,cAAc,GAAG,EAAE,GAAG,CAAC,CAAC;AAE5D;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,sBAAsB,GAAG,gEAAgE;YACvF,iFAAiF,CACpF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,GAAW;IACpD,MAAM,IAAI,GAAG,GAAG;SACb,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;SAC5B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACzB,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { CommentrayIndex } from "./model.js";
2
+ export type MarkerValidationIssue = {
3
+ level: "error" | "warn";
4
+ message: string;
5
+ };
6
+ /**
7
+ * Scans a single source file for Commentray region / marker boundaries and reports:
8
+ * - invalid ids (syntax that matched but fails `assertValidMarkerId` — rare),
9
+ * - duplicate **start** for the same id before its `end`,
10
+ * - orphan **end** lines,
11
+ * - **start** without a matching **end** (unclosed region).
12
+ */
13
+ export declare function validateMarkerBoundariesInSource(sourceText: string, sourcePath: string): MarkerValidationIssue[];
14
+ /**
15
+ * Index-level rules for stable cross-references:
16
+ * - **Error** if the same `(sourcePath, marker id)` is claimed by **different** block `id`s
17
+ * (e.g. two Angle files disagree).
18
+ * - **Warn** if the same marker id string is reused across **different** source files
19
+ * (repo-wide ambiguity for links and search — allowed, but noisy).
20
+ */
21
+ export declare function validateIndexMarkerSemantics(index: CommentrayIndex): MarkerValidationIssue[];
22
+ //# sourceMappingURL=marker-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marker-validation.d.ts","sourceRoot":"","sources":["../src/marker-validation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,MAAM,MAAM,qBAAqB,GAAG;IAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjF;;;;;;GAMG;AACH,wBAAgB,gCAAgC,CAC9C,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,qBAAqB,EAAE,CAkDzB;AAmBD;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,eAAe,GAAG,qBAAqB,EAAE,CAuD5F"}
@@ -0,0 +1,138 @@
1
+ import { parseAnchor } from "./anchors.js";
2
+ import { assertValidMarkerId } from "./marker-ids.js";
3
+ import { parseCommentrayRegionBoundary } from "./source-markers.js";
4
+ /**
5
+ * Scans a single source file for Commentray region / marker boundaries and reports:
6
+ * - invalid ids (syntax that matched but fails `assertValidMarkerId` — rare),
7
+ * - duplicate **start** for the same id before its `end`,
8
+ * - orphan **end** lines,
9
+ * - **start** without a matching **end** (unclosed region).
10
+ */
11
+ export function validateMarkerBoundariesInSource(sourceText, sourcePath) {
12
+ const issues = [];
13
+ const lines = sourceText.replaceAll("\r\n", "\n").split("\n");
14
+ const pendingStartLine = new Map();
15
+ for (let line0 = 0; line0 < lines.length; line0++) {
16
+ const hit = parseCommentrayRegionBoundary(lines[line0] ?? "");
17
+ if (!hit)
18
+ continue;
19
+ try {
20
+ assertValidMarkerId(hit.id);
21
+ }
22
+ catch (e) {
23
+ issues.push({
24
+ level: "error",
25
+ message: `${sourcePath}:${line0 + 1}: ${e instanceof Error ? e.message : String(e)}`,
26
+ });
27
+ continue;
28
+ }
29
+ const loc = `${sourcePath}:${line0 + 1}`;
30
+ if (hit.kind === "start") {
31
+ const priorStart = pendingStartLine.get(hit.id);
32
+ if (priorStart !== undefined) {
33
+ const prev = priorStart + 1;
34
+ issues.push({
35
+ level: "error",
36
+ message: `${loc}: duplicate commentray start for id "${hit.id}" (also opened at line ${prev}). Close the previous region first, or use a unique id per region.`,
37
+ });
38
+ continue;
39
+ }
40
+ pendingStartLine.set(hit.id, line0);
41
+ continue;
42
+ }
43
+ const start0 = pendingStartLine.get(hit.id);
44
+ if (start0 === undefined) {
45
+ issues.push({
46
+ level: "error",
47
+ message: `${loc}: commentray end for id "${hit.id}" has no matching start in this file.`,
48
+ });
49
+ continue;
50
+ }
51
+ pendingStartLine.delete(hit.id);
52
+ }
53
+ for (const [id, line0] of pendingStartLine) {
54
+ issues.push({
55
+ level: "error",
56
+ message: `${sourcePath}:${line0 + 1}: commentray start for id "${id}" has no matching end in this file.`,
57
+ });
58
+ }
59
+ return issues;
60
+ }
61
+ function markerIdFromBlock(block) {
62
+ try {
63
+ const a = parseAnchor(block.anchor);
64
+ if (a.kind === "marker")
65
+ return a.id;
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ if (typeof block.markerId === "string" && block.markerId.trim() !== "") {
71
+ try {
72
+ return assertValidMarkerId(block.markerId);
73
+ }
74
+ catch {
75
+ return null;
76
+ }
77
+ }
78
+ return null;
79
+ }
80
+ /**
81
+ * Index-level rules for stable cross-references:
82
+ * - **Error** if the same `(sourcePath, marker id)` is claimed by **different** block `id`s
83
+ * (e.g. two Angle files disagree).
84
+ * - **Warn** if the same marker id string is reused across **different** source files
85
+ * (repo-wide ambiguity for links and search — allowed, but noisy).
86
+ */
87
+ export function validateIndexMarkerSemantics(index) {
88
+ const issues = [];
89
+ const bySourceAndMarker = new Map();
90
+ const byMarkerRepoWide = new Map();
91
+ for (const [commentrayPath, entry] of Object.entries(index.byCommentrayPath)) {
92
+ for (const block of entry.blocks) {
93
+ const mid = markerIdFromBlock(block);
94
+ if (mid === null)
95
+ continue;
96
+ const key = `${entry.sourcePath}\0${mid}`;
97
+ const loc = {
98
+ sourcePath: entry.sourcePath,
99
+ commentrayPath,
100
+ blockId: block.id,
101
+ };
102
+ const list = bySourceAndMarker.get(key) ?? [];
103
+ list.push(loc);
104
+ bySourceAndMarker.set(key, list);
105
+ const sources = byMarkerRepoWide.get(mid) ?? new Set();
106
+ sources.add(entry.sourcePath);
107
+ byMarkerRepoWide.set(mid, sources);
108
+ }
109
+ }
110
+ for (const [composite, locs] of bySourceAndMarker) {
111
+ if (locs.length < 2)
112
+ continue;
113
+ const sep = composite.indexOf("\0");
114
+ const sourcePath = composite.slice(0, sep);
115
+ const mid = composite.slice(sep + 1);
116
+ const blockIds = new Set(locs.map((l) => l.blockId));
117
+ if (blockIds.size > 1) {
118
+ const detail = locs.map((l) => `${l.blockId} (${l.commentrayPath})`).join(", ");
119
+ issues.push({
120
+ level: "error",
121
+ message: `Marker id "${mid}" for source "${sourcePath}" is indexed with different block ids: ${detail}. ` +
122
+ `One physical region should map to one block id (e.g. align Angle files or deduplicate).`,
123
+ });
124
+ }
125
+ }
126
+ for (const [mid, sources] of byMarkerRepoWide) {
127
+ if (sources.size <= 1)
128
+ continue;
129
+ const paths = [...sources].sort((a, b) => a.localeCompare(b)).join(", ");
130
+ issues.push({
131
+ level: "warn",
132
+ message: `Marker id "${mid}" is reused across different source files (${paths}). ` +
133
+ `That is valid for independent regions, but ambiguous for repo-wide links — consider namespaced ids (e.g. "${mid}--dashboard", "${mid}--api").`,
134
+ });
135
+ }
136
+ return issues;
137
+ }
138
+ //# sourceMappingURL=marker-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marker-validation.js","sourceRoot":"","sources":["../src/marker-validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,EAAE,6BAA6B,EAAE,MAAM,qBAAqB,CAAC;AAIpE;;;;;;GAMG;AACH,MAAM,UAAU,gCAAgC,CAC9C,UAAkB,EAClB,UAAkB;IAElB,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9D,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEnD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAClD,MAAM,GAAG,GAAG,6BAA6B,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,IAAI,CAAC;YACH,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,OAAO;gBACd,OAAO,EAAE,GAAG,UAAU,IAAI,KAAK,GAAG,CAAC,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;aACrF,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,GAAG,UAAU,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC7B,MAAM,IAAI,GAAG,UAAU,GAAG,CAAC,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC;oBACV,KAAK,EAAE,OAAO;oBACd,OAAO,EAAE,GAAG,GAAG,wCAAwC,GAAG,CAAC,EAAE,0BAA0B,IAAI,oEAAoE;iBAChK,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YACD,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACpC,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,OAAO;gBACd,OAAO,EAAE,GAAG,GAAG,4BAA4B,GAAG,CAAC,EAAE,uCAAuC;aACzF,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,gBAAgB,EAAE,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,GAAG,UAAU,IAAI,KAAK,GAAG,CAAC,8BAA8B,EAAE,qCAAqC;SACzG,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,KAA4C;IACrE,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC,EAAE,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACvE,IAAI,CAAC;YACH,OAAO,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,4BAA4B,CAAC,KAAsB;IACjE,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAiB,CAAC;IACnD,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAuB,CAAC;IAExD,KAAK,MAAM,CAAC,cAAc,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC7E,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACrC,IAAI,GAAG,KAAK,IAAI;gBAAE,SAAS;YAC3B,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;YAC1C,MAAM,GAAG,GAAQ;gBACf,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,cAAc;gBACd,OAAO,EAAE,KAAK,CAAC,EAAE;aAClB,CAAC;YACF,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACf,iBAAiB,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAEjC,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC9B,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,iBAAiB,EAAE,CAAC;QAClD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAC9B,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACrD,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChF,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,OAAO;gBACd,OAAO,EACL,cAAc,GAAG,iBAAiB,UAAU,0CAA0C,MAAM,IAAI;oBAChG,yFAAyF;aAC5F,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,gBAAgB,EAAE,CAAC;QAC9C,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC;YAAE,SAAS;QAChC,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzE,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,MAAM;YACb,OAAO,EACL,cAAc,GAAG,8CAA8C,KAAK,KAAK;gBACzE,6GAA6G,GAAG,kBAAkB,GAAG,UAAU;SAClJ,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAA0B,MAAM,YAAY,CAAC;AAE1E,wBAAgB,UAAU,IAAI,eAAe,CAE5C;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAiBhE"}
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,eAAe,EAAoD,MAAM,YAAY,CAAC;AAEpG,wBAAgB,UAAU,IAAI,eAAe,CAE5C;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAwBhE"}
package/dist/metadata.js CHANGED
@@ -1,4 +1,7 @@
1
- import { CURRENT_SCHEMA_VERSION } from "./model.js";
1
+ import { parseAnchor } from "./anchors.js";
2
+ import { describeIndexSchemaRemediation } from "./index-schema-messages.js";
3
+ import { assertValidMarkerId } from "./marker-ids.js";
4
+ import { coerceIndexSchemaVersion, CURRENT_SCHEMA_VERSION } from "./model.js";
2
5
  export function emptyIndex() {
3
6
  return { schemaVersion: CURRENT_SCHEMA_VERSION, byCommentrayPath: {} };
4
7
  }
@@ -7,9 +10,12 @@ export function assertValidIndex(value) {
7
10
  throw new TypeError("index.json must be a JSON object");
8
11
  }
9
12
  const obj = value;
10
- const schemaVersion = obj.schemaVersion;
13
+ const schemaVersion = coerceIndexSchemaVersion(obj.schemaVersion);
14
+ if (schemaVersion === null) {
15
+ throw new TypeError(`index.json schemaVersion must be an integer (got ${String(obj.schemaVersion)})`);
16
+ }
11
17
  if (schemaVersion !== CURRENT_SCHEMA_VERSION) {
12
- throw new Error(`Unsupported schemaVersion: ${String(schemaVersion)}`);
18
+ throw new Error(`index.json schemaVersion mismatch. ${describeIndexSchemaRemediation(obj.schemaVersion)}`);
13
19
  }
14
20
  const byCommentrayPath = obj.byCommentrayPath;
15
21
  if (typeof byCommentrayPath !== "object" || byCommentrayPath === null) {
@@ -18,7 +24,7 @@ export function assertValidIndex(value) {
18
24
  for (const [key, entry] of Object.entries(byCommentrayPath)) {
19
25
  validateCommentrayEntry(key, entry);
20
26
  }
21
- return obj;
27
+ return { ...obj, schemaVersion: CURRENT_SCHEMA_VERSION };
22
28
  }
23
29
  function validateCommentrayEntry(commentrayPathKey, entry) {
24
30
  if (typeof entry !== "object" || entry === null) {
@@ -40,17 +46,35 @@ function validateCommentrayEntry(commentrayPathKey, entry) {
40
46
  for (const block of e.blocks)
41
47
  validateBlock(commentrayPathKey, block);
42
48
  }
43
- function validateBlock(commentrayPathKey, block) {
44
- if (typeof block !== "object" || block === null) {
45
- throw new TypeError(`Invalid block under ${commentrayPathKey}`);
49
+ function parseValidatedMarkerId(commentrayPathKey, raw) {
50
+ try {
51
+ return assertValidMarkerId(raw);
46
52
  }
47
- const b = block;
48
- if (typeof b.id !== "string") {
49
- throw new TypeError(`block.id must be a string under ${commentrayPathKey}`);
53
+ catch (e) {
54
+ throw new TypeError(`block.id invalid under ${commentrayPathKey}: ${e instanceof Error ? e.message : String(e)}`, { cause: e });
50
55
  }
51
- if (typeof b.anchor !== "string") {
52
- throw new TypeError(`block.anchor must be a string under ${commentrayPathKey}`);
56
+ }
57
+ function parseValidatedAnchor(commentrayPathKey, raw) {
58
+ try {
59
+ return parseAnchor(raw);
60
+ }
61
+ catch (e) {
62
+ throw new TypeError(`Invalid block.anchor under ${commentrayPathKey}: ${e instanceof Error ? e.message : String(e)}`, { cause: e });
63
+ }
64
+ }
65
+ function assertBlockMarkerAnchorConsistency(commentrayPathKey, b, bid, parsedAnchor) {
66
+ if (parsedAnchor.kind === "marker" && parsedAnchor.id !== bid) {
67
+ throw new TypeError(`block.id must match marker anchor id (got id=${b.id}, anchor=${b.anchor}) under ${commentrayPathKey}`);
53
68
  }
69
+ if (parsedAnchor.kind === "marker" &&
70
+ b.markerId !== undefined &&
71
+ typeof b.markerId === "string" &&
72
+ b.markerId.trim() !== "" &&
73
+ assertValidMarkerId(b.markerId) !== parsedAnchor.id) {
74
+ throw new TypeError(`block.markerId must match marker anchor id under ${commentrayPathKey} (block ${b.id})`);
75
+ }
76
+ }
77
+ function validateBlockOptionalFields(commentrayPathKey, b) {
54
78
  if (b.lastVerifiedCommit !== undefined && typeof b.lastVerifiedCommit !== "string") {
55
79
  throw new TypeError(`block.lastVerifiedCommit must be a string when present under ${commentrayPathKey}`);
56
80
  }
@@ -60,22 +84,27 @@ function validateBlock(commentrayPathKey, block) {
60
84
  if (b.markerId !== undefined && typeof b.markerId !== "string") {
61
85
  throw new TypeError(`block.markerId must be a string when present under ${commentrayPathKey}`);
62
86
  }
63
- if (b.fingerprint !== undefined)
64
- validateFingerprint(commentrayPathKey, b.fingerprint);
65
- }
66
- function validateFingerprint(commentrayPathKey, fp) {
67
- if (typeof fp !== "object" || fp === null) {
68
- throw new TypeError(`block.fingerprint must be an object under ${commentrayPathKey}`);
87
+ if (b.snippet !== undefined && typeof b.snippet !== "string") {
88
+ throw new TypeError(`block.snippet must be a string when present under ${commentrayPathKey}`);
69
89
  }
70
- const f = fp;
71
- if (typeof f.startLine !== "string") {
72
- throw new TypeError(`block.fingerprint.startLine must be a string under ${commentrayPathKey}`);
90
+ if (b.fingerprint !== undefined) {
91
+ throw new TypeError(`block.fingerprint is no longer supported under ${commentrayPathKey}; re-open the repo to migrate index.json`);
73
92
  }
74
- if (typeof f.endLine !== "string") {
75
- throw new TypeError(`block.fingerprint.endLine must be a string under ${commentrayPathKey}`);
93
+ }
94
+ function validateBlock(commentrayPathKey, block) {
95
+ if (typeof block !== "object" || block === null) {
96
+ throw new TypeError(`Invalid block under ${commentrayPathKey}`);
76
97
  }
77
- if (typeof f.lineCount !== "number" || !Number.isInteger(f.lineCount) || f.lineCount < 1) {
78
- throw new TypeError(`block.fingerprint.lineCount must be a positive integer under ${commentrayPathKey}`);
98
+ const b = block;
99
+ if (typeof b.id !== "string") {
100
+ throw new TypeError(`block.id must be a string under ${commentrayPathKey}`);
101
+ }
102
+ const bid = parseValidatedMarkerId(commentrayPathKey, b.id);
103
+ if (typeof b.anchor !== "string") {
104
+ throw new TypeError(`block.anchor must be a string under ${commentrayPathKey}`);
79
105
  }
106
+ const parsedAnchor = parseValidatedAnchor(commentrayPathKey, b.anchor);
107
+ assertBlockMarkerAnchorConsistency(commentrayPathKey, b, bid, parsedAnchor);
108
+ validateBlockOptionalFields(commentrayPathKey, b);
80
109
  }
81
110
  //# sourceMappingURL=metadata.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EAGrB,MAAM,YAAY,CAAC;AAIpB,uEAAuE;AACvE,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAqCvF"}
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,eAAe,EAIrB,MAAM,YAAY,CAAC;AAIpB,uEAAuE;AACvE,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAuDvF"}
package/dist/migrate.js CHANGED
@@ -1,4 +1,5 @@
1
- import { CURRENT_SCHEMA_VERSION, } from "./model.js";
1
+ import { describeIndexSchemaRemediation } from "./index-schema-messages.js";
2
+ import { coerceIndexSchemaVersion, CURRENT_SCHEMA_VERSION, } from "./model.js";
2
3
  const LEGACY_SCHEMA_VERSION = 2;
3
4
  /** Returns migrated index and whether the file should be rewritten. */
4
5
  export function migrateIndex(raw) {
@@ -9,7 +10,10 @@ export function migrateIndex(raw) {
9
10
  };
10
11
  }
11
12
  const obj = raw;
12
- const version = obj.schemaVersion;
13
+ const version = coerceIndexSchemaVersion(obj.schemaVersion);
14
+ if (version === null && obj.schemaVersion !== undefined) {
15
+ throw new TypeError(`Invalid index schemaVersion: ${String(obj.schemaVersion)}`);
16
+ }
13
17
  if (version === CURRENT_SCHEMA_VERSION) {
14
18
  const index = obj;
15
19
  return { index, changed: false };
@@ -24,7 +28,7 @@ export function migrateIndex(raw) {
24
28
  byCommentrayPath,
25
29
  };
26
30
  const before = JSON.stringify({
27
- schemaVersion: version ?? 0,
31
+ schemaVersion: version === undefined ? 0 : version,
28
32
  bySourceFile: obj.bySourceFile ?? {},
29
33
  byCommentrayPath: obj.byCommentrayPath ?? {},
30
34
  });
@@ -32,7 +36,19 @@ export function migrateIndex(raw) {
32
36
  const changed = before !== after;
33
37
  return { index: next, changed };
34
38
  }
35
- throw new Error(`Cannot migrate from schemaVersion ${String(version)}`);
39
+ if (typeof version === "number" && version > CURRENT_SCHEMA_VERSION) {
40
+ /**
41
+ * Future CLI may bump `schemaVersion` before every consumer updates. Prefer opening
42
+ * the repo over hard failure: keep `byCommentrayPath` as parsed, stamp this build’s
43
+ * schema, and let `assertValidIndex` reject only truly incompatible shapes.
44
+ */
45
+ const byCommentrayPath = toByCommentrayPath(obj);
46
+ return {
47
+ index: { schemaVersion: CURRENT_SCHEMA_VERSION, byCommentrayPath },
48
+ changed: true,
49
+ };
50
+ }
51
+ throw new Error(`Cannot migrate index.json from schemaVersion ${String(obj.schemaVersion)}. ${describeIndexSchemaRemediation(obj.schemaVersion)}`);
36
52
  }
37
53
  function toByCommentrayPath(obj) {
38
54
  if (obj.byCommentrayPath &&
@@ -1 +1 @@
1
- {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"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"}