docrev 0.9.11 → 0.9.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +9 -9
- package/.gitattributes +1 -1
- package/CHANGELOG.md +149 -149
- package/PLAN-tables-and-postprocess.md +850 -850
- package/README.md +391 -391
- package/bin/rev.js +11 -11
- package/bin/rev.ts +145 -145
- package/completions/rev.bash +127 -127
- package/completions/rev.ps1 +210 -210
- package/completions/rev.zsh +207 -207
- package/dev_notes/stress2/build_adversarial.ts +186 -186
- package/dev_notes/stress2/drift_matcher.ts +62 -62
- package/dev_notes/stress2/probe_anchors.ts +35 -35
- package/dev_notes/stress2/project/discussion.before.md +3 -3
- package/dev_notes/stress2/project/discussion.md +3 -3
- package/dev_notes/stress2/project/methods.before.md +20 -20
- package/dev_notes/stress2/project/methods.md +20 -20
- package/dev_notes/stress2/project/rev.yaml +5 -5
- package/dev_notes/stress2/project/sections.yaml +4 -4
- package/dev_notes/stress2/sections.yaml +5 -5
- package/dev_notes/stress2/trace_placement.ts +50 -50
- package/dev_notes/stresstest_boundaries.ts +27 -27
- package/dev_notes/stresstest_drift_apply.ts +43 -43
- package/dev_notes/stresstest_drift_compare.ts +43 -43
- package/dev_notes/stresstest_drift_v2.ts +54 -54
- package/dev_notes/stresstest_inspect.ts +54 -54
- package/dev_notes/stresstest_pstyle.ts +55 -55
- package/dev_notes/stresstest_section_debug.ts +23 -23
- package/dev_notes/stresstest_split.ts +70 -70
- package/dev_notes/stresstest_trace.ts +19 -19
- package/dev_notes/stresstest_verify_no_overwrite.ts +40 -40
- package/dist/lib/build.d.ts +50 -1
- package/dist/lib/build.d.ts.map +1 -1
- package/dist/lib/build.js +80 -30
- package/dist/lib/build.js.map +1 -1
- package/dist/lib/commands/build.d.ts.map +1 -1
- package/dist/lib/commands/build.js +38 -5
- package/dist/lib/commands/build.js.map +1 -1
- package/dist/lib/commands/utilities.js +164 -164
- package/dist/lib/commands/word-tools.js +8 -8
- package/dist/lib/grammar.js +3 -3
- package/dist/lib/import.d.ts.map +1 -1
- package/dist/lib/import.js +146 -24
- package/dist/lib/import.js.map +1 -1
- package/dist/lib/pdf-comments.js +44 -44
- package/dist/lib/plugins.js +57 -57
- package/dist/lib/pptx-themes.js +115 -115
- package/dist/lib/spelling.js +2 -2
- package/dist/lib/templates.js +387 -387
- package/dist/lib/themes.js +51 -51
- package/dist/lib/types.d.ts +20 -0
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/word-extraction.d.ts +6 -0
- package/dist/lib/word-extraction.d.ts.map +1 -1
- package/dist/lib/word-extraction.js +46 -3
- package/dist/lib/word-extraction.js.map +1 -1
- package/dist/lib/wordcomments.d.ts.map +1 -1
- package/dist/lib/wordcomments.js +23 -5
- package/dist/lib/wordcomments.js.map +1 -1
- package/eslint.config.js +27 -27
- package/lib/anchor-match.ts +276 -276
- package/lib/annotations.ts +644 -644
- package/lib/build.ts +1300 -1227
- package/lib/citations.ts +160 -160
- package/lib/commands/build.ts +833 -801
- package/lib/commands/citations.ts +515 -515
- package/lib/commands/comments.ts +1050 -1050
- package/lib/commands/context.ts +174 -174
- package/lib/commands/core.ts +309 -309
- package/lib/commands/doi.ts +435 -435
- package/lib/commands/file-ops.ts +372 -372
- package/lib/commands/history.ts +320 -320
- package/lib/commands/index.ts +87 -87
- package/lib/commands/init.ts +259 -259
- package/lib/commands/merge-resolve.ts +378 -378
- package/lib/commands/preview.ts +178 -178
- package/lib/commands/project-info.ts +244 -244
- package/lib/commands/quality.ts +517 -517
- package/lib/commands/response.ts +454 -454
- package/lib/commands/section-boundaries.ts +82 -82
- package/lib/commands/sections.ts +451 -451
- package/lib/commands/sync.ts +706 -706
- package/lib/commands/text-ops.ts +449 -449
- package/lib/commands/utilities.ts +448 -448
- package/lib/commands/verify-anchors.ts +272 -272
- package/lib/commands/word-tools.ts +340 -340
- package/lib/comment-realign.ts +517 -517
- package/lib/config.ts +84 -84
- package/lib/crossref.ts +781 -781
- package/lib/csl.ts +191 -191
- package/lib/dependencies.ts +98 -98
- package/lib/diff-engine.ts +465 -465
- package/lib/doi-cache.ts +115 -115
- package/lib/doi.ts +897 -897
- package/lib/equations.ts +506 -506
- package/lib/errors.ts +346 -346
- package/lib/format.ts +541 -541
- package/lib/git.ts +326 -326
- package/lib/grammar.ts +303 -303
- package/lib/image-registry.ts +180 -180
- package/lib/import.ts +911 -792
- package/lib/journals.ts +543 -543
- package/lib/merge.ts +633 -633
- package/lib/orcid.ts +144 -144
- package/lib/pdf-comments.ts +263 -263
- package/lib/pdf-import.ts +524 -524
- package/lib/plugins.ts +362 -362
- package/lib/postprocess.ts +188 -188
- package/lib/pptx-color-filter.lua +37 -37
- package/lib/pptx-template.ts +469 -469
- package/lib/pptx-themes.ts +483 -483
- package/lib/protect-restore.ts +520 -520
- package/lib/rate-limiter.ts +94 -94
- package/lib/response.ts +197 -197
- package/lib/restore-references.ts +240 -240
- package/lib/review.ts +327 -327
- package/lib/schema.ts +417 -417
- package/lib/scientific-words.ts +73 -73
- package/lib/sections.ts +335 -335
- package/lib/slides.ts +756 -756
- package/lib/spelling.ts +334 -334
- package/lib/templates.ts +526 -526
- package/lib/themes.ts +742 -742
- package/lib/trackchanges.ts +247 -247
- package/lib/tui.ts +450 -450
- package/lib/types.ts +550 -530
- package/lib/undo.ts +250 -250
- package/lib/utils.ts +69 -69
- package/lib/variables.ts +179 -179
- package/lib/word-extraction.ts +806 -759
- package/lib/word.ts +643 -643
- package/lib/wordcomments.ts +817 -798
- package/package.json +137 -137
- package/scripts/postbuild.js +28 -28
- package/skill/REFERENCE.md +431 -431
- package/skill/SKILL.md +258 -258
- package/tsconfig.json +26 -26
- package/types/index.d.ts +525 -525
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
{
|
|
2
|
-
"permissions": {
|
|
3
|
-
"allow": [
|
|
4
|
-
"Skill(code-quality)"
|
|
5
|
-
],
|
|
6
|
-
"deny": [],
|
|
7
|
-
"ask": []
|
|
8
|
-
}
|
|
9
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"permissions": {
|
|
3
|
+
"allow": [
|
|
4
|
+
"Skill(code-quality)"
|
|
5
|
+
],
|
|
6
|
+
"deny": [],
|
|
7
|
+
"ask": []
|
|
8
|
+
}
|
|
9
|
+
}
|
package/.gitattributes
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
dist/** linguist-generated
|
|
1
|
+
dist/** linguist-generated
|
package/CHANGELOG.md
CHANGED
|
@@ -1,149 +1,149 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
All notable changes to docrev will be documented in this file.
|
|
4
|
-
|
|
5
|
-
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
-
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
-
|
|
8
|
-
## [0.9.11] - 2026-04-30
|
|
9
|
-
|
|
10
|
-
### Fixed
|
|
11
|
-
- **Single-section comment placement.** `computeSectionBoundaries` left the last section's `end` at `Number.MAX_SAFE_INTEGER`, which collapsed the proportional-position math in `insertCommentsIntoMarkdown` to ~0. Every comment whose anchor wasn't in the first 200 chars of the markdown stacked at position 0. Now caps the last boundary's `end` at `fullDocText.length`, passed in from sync and verify-anchors.
|
|
12
|
-
- **Re-sync duplicated comments.** `sync --comments-only` re-inserted every comment on each invocation, producing `{>>R1<<}{>>R1<<}{>>R1<<}…` over time. `insertCommentsIntoMarkdown` now scans ±200 chars around the target for an identical `{>>author: text<<}` block and skips insertion when found.
|
|
13
|
-
- **Threading content destruction.** `prepareMarkdownWithMarkers`'s whitespace-consumption loops captured `charBefore` once outside the loop, so a single leading space caused `removeStart` to walk to position 0 and `slice()` to delete every preceding paragraph. Replaced with a one-char check.
|
|
14
|
-
- **Multi-run anchor injection.** Pandoc splits a single anchor across multiple `<w:r>` blocks whenever it applies styling mid-anchor — smart-quote substitution, `*italic*`, `` `code` ``, `**bold**` all trigger this. The single-run scan in `injectCommentsAtMarkers` grabbed the start marker's `<w:t>`, looked for the end marker inside it, found nothing, and silently skipped the comment. New multi-run path splits the start run at the start marker, keeps middle runs verbatim, splits the end run at the end marker, and rebuilds with `commentRangeStart`/`commentRangeEnd` around the styled anchor portions.
|
|
15
|
-
- **Nested-bracket anchors.** `prepareMarkdownWithMarkers` used `\[([^\]]+)\]\{\.mark\}` for the trailing anchor group, so any inner `]` (e.g. `[[0..9]]{.mark}`, `[*italic*]{.mark}`) terminated the match prematurely. Replaced with a manual balanced-bracket walker that handles arbitrary nesting depth and verifies a `{.mark}` suffix.
|
|
16
|
-
- **Orphan-`[` over-stripping.** `stripAnnotations`'s orphan cleanup used `\[(?![^\[\]]*\])`, treating any inner `[` as a barrier and stripping the outer `[` of nested forms. Loosened to `\[(?![^\]\n]*\])`: an `[` is orphan only when no `]` follows before end of line.
|
|
17
|
-
|
|
18
|
-
### Changed
|
|
19
|
-
- `sync --comments-only` summary distinguishes `placed` / `already present` / `unmatched` instead of subtracting before/after counts. Re-syncs now report "6 already present (skipped to avoid duplication)" instead of misreporting them as fully placed or fully unmatched. New `outStats` channel from `insertCommentsIntoMarkdown`.
|
|
20
|
-
|
|
21
|
-
## [0.9.10] - 2026-04-30
|
|
22
|
-
|
|
23
|
-
### Fixed
|
|
24
|
-
- `stripAnnotations` stripped `[anchor]{.mark}` spans even when `keepComments=true`, leaving the dual-build marker generator with no anchor text and collapsing every multi-word anchor to a single fallback word in the rebuilt docx. Now preserves anchor spans that belong to retained `{>>...<<}` comments.
|
|
25
|
-
- Comments authored at the very start of a Word section landed before the markdown file's `# Heading` line and rendered in the previous section. Added `pushPastSectionHeading` so position-0 comments advance to the first body paragraph of the section they were authored in.
|
|
26
|
-
- Empty-anchor comments fell through to proportional placement even when before/after context uniquely identified the position, landing mid-word or splitting unrelated phrases. Context match now runs first; proportional placement is the fallback.
|
|
27
|
-
- When an anchor appeared multiple times in the search window (repeated phrasing, formulaic prose), `insertCommentsIntoMarkdown` always picked the first occurrence. Now picks the occurrence closest to the docx-derived insert position.
|
|
28
|
-
|
|
29
|
-
## [0.9.7] - 2026-04-29
|
|
30
|
-
|
|
31
|
-
### Added
|
|
32
|
-
- `rev sync --comments-only` — import only Word comments at fuzzy-matched anchors, leaving prose byte-identical. Use when the markdown was revised between sending the docx out for review and receiving it back; applying track changes from a stale draft would clobber newer edits.
|
|
33
|
-
- `rev verify-anchors <docx>` — drift report classifying every comment as `clean` / `drift` / `context-only` / `ambiguous` / `unmatched` against the current section markdown. Pair with `--comments-only` to plan placement before sync. Supports `--json` for scripting.
|
|
34
|
-
- `extractHeadings()` in `word-extraction.ts` — read heading paragraphs directly from `<w:pStyle>` styles, returning text + level + position in the same coordinate system as comment anchors.
|
|
35
|
-
- Shared `lib/commands/section-boundaries.ts` — single source of truth that maps `sections.yaml` to docx text positions, used by both sync and verify-anchors.
|
|
36
|
-
- Shared `lib/anchor-match.ts` — pure anchor-matching primitives (`findAnchorInText`, `stripCriticMarkup`, `classifyStrategy`) so sync (insertion) and verify-anchors (drift reporting) use the same fallback strategies.
|
|
37
|
-
- New tests: `test/anchor-match.test.js` (11 cases covering each fallback strategy and the quality classifier).
|
|
38
|
-
|
|
39
|
-
### Fixed
|
|
40
|
-
- **Section detection mistook prose for headings.** The old keyword finder scanned the concatenated body text and would match "results across countries" as the Results heading or skip the real Methods heading because the structured-abstract label `Methods:` lost its colon during text-run concatenation. Replaced with paragraph-style-based heading extraction, so boundaries now reflect actual heading paragraphs. Affects the new commands; the existing sync flow already used pandoc-derived headings and was unaffected.
|
|
41
|
-
- `stripCriticMarkup` regex used `[^<]*` and silently failed on comments containing `<` characters (e.g. `pre-industrial trade (<1825)`). Switched to non-greedy `[\s\S]*?`.
|
|
42
|
-
- `insertCommentsIntoMarkdown` always prepended a leading space when there was no anchor, accumulating multiple spaces when several comments shared a position 0 anchor. Removed the heuristic; comments insert at exact position so prose stays byte-identical except for the inserted blocks.
|
|
43
|
-
- `verify-anchors` crashed with a stack trace when given a non-docx file (e.g. an `.md` path). Now reports a friendly error.
|
|
44
|
-
|
|
45
|
-
### Changed
|
|
46
|
-
- New flag is `--comments-only` (positive form). The originally proposed `--no-overwrite` was dropped because Commander assigns `--no-X` to `options.x === false` rather than `options.noX === true`, which made the flag silently ignored.
|
|
47
|
-
- `insertCommentsIntoMarkdown` now accepts `wrapAnchor?: boolean` (default `true`). When `false`, comment blocks are inserted next to the anchor without `[anchor]{.mark}` wrapping. `--comments-only` uses this so multiple comments sharing an anchor (e.g. 6 reviewers commenting on the same word) no longer produce nested broken CriticMarkup.
|
|
48
|
-
|
|
49
|
-
## [0.7.1] - 2025-01-02
|
|
50
|
-
|
|
51
|
-
### Added
|
|
52
|
-
- Writing Markdown guide in docs (tables, equations, citations, cross-refs)
|
|
53
|
-
- Grid table syntax documentation for merged cells
|
|
54
|
-
|
|
55
|
-
### Changed
|
|
56
|
-
- README restructured for better scannability (490 → 290 lines)
|
|
57
|
-
- Install section moved up for faster onboarding
|
|
58
|
-
- Added Highlights section with quick feature overview
|
|
59
|
-
- Condensed overlapping sections
|
|
60
|
-
|
|
61
|
-
## [0.7.0] - 2025-01-02
|
|
62
|
-
|
|
63
|
-
### Added
|
|
64
|
-
- API rate limiting with exponential backoff for Crossref/DataCite/doi.org APIs
|
|
65
|
-
- Windows support in CI matrix
|
|
66
|
-
- Architecture documentation for contributors (`ARCHITECTURE.md`)
|
|
67
|
-
- Exclusion patterns for cross-reference false positives (e.g., "Table of Contents")
|
|
68
|
-
- Timeout support for PDF extraction (30s default)
|
|
69
|
-
|
|
70
|
-
### Changed
|
|
71
|
-
- Consolidated YAML dependencies (removed `js-yaml`, using `yaml` package only)
|
|
72
|
-
- Improved annotation false positive detection (code blocks, URLs, LaTeX patterns)
|
|
73
|
-
- Enhanced error messages for Word import and PDF extraction
|
|
74
|
-
- Updated User-Agent strings for API requests
|
|
75
|
-
- Improved README with problem statement and quick example
|
|
76
|
-
|
|
77
|
-
### Fixed
|
|
78
|
-
- CI lint step now checks all command files separately
|
|
79
|
-
- Windows temp directory paths in tests
|
|
80
|
-
|
|
81
|
-
## [0.3.2] - 2024-12-29
|
|
82
|
-
|
|
83
|
-
### Added
|
|
84
|
-
- Full TypeScript type definitions (`types/index.d.ts`)
|
|
85
|
-
- GitHub Actions CI workflow (Node 18/20/22)
|
|
86
|
-
- ESM subpath exports for all library modules
|
|
87
|
-
- CLI integration tests (26 tests)
|
|
88
|
-
- Comprehensive test coverage: 419 tests across 18 modules
|
|
89
|
-
|
|
90
|
-
### Fixed
|
|
91
|
-
- DOI skip detection: `% no-doi` comments now correctly apply only to the next entry
|
|
92
|
-
|
|
93
|
-
### Changed
|
|
94
|
-
- Added `engines` field requiring Node.js >=18.0.0
|
|
95
|
-
- Updated README with badges (npm, CI, Node.js, License)
|
|
96
|
-
|
|
97
|
-
## [0.3.1] - 2024-12-28
|
|
98
|
-
|
|
99
|
-
### Fixed
|
|
100
|
-
- Equation extraction test assertions
|
|
101
|
-
- Minor bug fixes
|
|
102
|
-
|
|
103
|
-
## [0.3.0] - 2024-12-27
|
|
104
|
-
|
|
105
|
-
### Added
|
|
106
|
-
- DOI validation via Crossref and DataCite APIs (`rev doi check`)
|
|
107
|
-
- DOI lookup for missing entries (`rev doi lookup`)
|
|
108
|
-
- DOI fetch and add commands (`rev doi fetch`, `rev doi add`)
|
|
109
|
-
- Citation validation against bibliography (`rev citations`)
|
|
110
|
-
- LaTeX equation extraction (`rev equations list`)
|
|
111
|
-
- Word equation import OMML → LaTeX (`rev equations from-word`)
|
|
112
|
-
- Response letter generation (`rev response`)
|
|
113
|
-
- Journal validation profiles (`rev validate --journal`)
|
|
114
|
-
- Advanced figure/table reference patterns (Figs. 1-3, Fig. 1a-c)
|
|
115
|
-
|
|
116
|
-
### Changed
|
|
117
|
-
- Improved cross-reference pattern detection
|
|
118
|
-
- Enhanced Word import with better section splitting
|
|
119
|
-
|
|
120
|
-
## [0.2.1] - 2024-12-26
|
|
121
|
-
|
|
122
|
-
### Added
|
|
123
|
-
- Table of contents option (`rev build --toc`)
|
|
124
|
-
- CSV export for comments (`rev comments --export`)
|
|
125
|
-
- Anonymize command for blind review (`rev anonymize`)
|
|
126
|
-
- Formatting utilities (tables, boxes, spinners)
|
|
127
|
-
|
|
128
|
-
## [0.2.0] - 2024-12-25
|
|
129
|
-
|
|
130
|
-
### Added
|
|
131
|
-
- Integrated build system (`rev build pdf/docx/tex`)
|
|
132
|
-
- Comment reply functionality (`rev reply`)
|
|
133
|
-
- Word document bootstrap (`rev import` creates project from .docx)
|
|
134
|
-
- Section-aware import (`rev sections`)
|
|
135
|
-
- Cross-reference migration (`rev migrate`)
|
|
136
|
-
|
|
137
|
-
### Changed
|
|
138
|
-
- Renamed project to docrev
|
|
139
|
-
- Published to npm
|
|
140
|
-
|
|
141
|
-
## [0.1.0] - 2024-12-24
|
|
142
|
-
|
|
143
|
-
### Added
|
|
144
|
-
- Initial release
|
|
145
|
-
- CriticMarkup annotation parsing
|
|
146
|
-
- Word ↔ Markdown round-trips
|
|
147
|
-
- Interactive review TUI (`rev review`)
|
|
148
|
-
- Comment management (`rev comments`, `rev resolve`)
|
|
149
|
-
- Project templates (`rev new`)
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to docrev will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [0.9.11] - 2026-04-30
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
- **Single-section comment placement.** `computeSectionBoundaries` left the last section's `end` at `Number.MAX_SAFE_INTEGER`, which collapsed the proportional-position math in `insertCommentsIntoMarkdown` to ~0. Every comment whose anchor wasn't in the first 200 chars of the markdown stacked at position 0. Now caps the last boundary's `end` at `fullDocText.length`, passed in from sync and verify-anchors.
|
|
12
|
+
- **Re-sync duplicated comments.** `sync --comments-only` re-inserted every comment on each invocation, producing `{>>R1<<}{>>R1<<}{>>R1<<}…` over time. `insertCommentsIntoMarkdown` now scans ±200 chars around the target for an identical `{>>author: text<<}` block and skips insertion when found.
|
|
13
|
+
- **Threading content destruction.** `prepareMarkdownWithMarkers`'s whitespace-consumption loops captured `charBefore` once outside the loop, so a single leading space caused `removeStart` to walk to position 0 and `slice()` to delete every preceding paragraph. Replaced with a one-char check.
|
|
14
|
+
- **Multi-run anchor injection.** Pandoc splits a single anchor across multiple `<w:r>` blocks whenever it applies styling mid-anchor — smart-quote substitution, `*italic*`, `` `code` ``, `**bold**` all trigger this. The single-run scan in `injectCommentsAtMarkers` grabbed the start marker's `<w:t>`, looked for the end marker inside it, found nothing, and silently skipped the comment. New multi-run path splits the start run at the start marker, keeps middle runs verbatim, splits the end run at the end marker, and rebuilds with `commentRangeStart`/`commentRangeEnd` around the styled anchor portions.
|
|
15
|
+
- **Nested-bracket anchors.** `prepareMarkdownWithMarkers` used `\[([^\]]+)\]\{\.mark\}` for the trailing anchor group, so any inner `]` (e.g. `[[0..9]]{.mark}`, `[*italic*]{.mark}`) terminated the match prematurely. Replaced with a manual balanced-bracket walker that handles arbitrary nesting depth and verifies a `{.mark}` suffix.
|
|
16
|
+
- **Orphan-`[` over-stripping.** `stripAnnotations`'s orphan cleanup used `\[(?![^\[\]]*\])`, treating any inner `[` as a barrier and stripping the outer `[` of nested forms. Loosened to `\[(?![^\]\n]*\])`: an `[` is orphan only when no `]` follows before end of line.
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
- `sync --comments-only` summary distinguishes `placed` / `already present` / `unmatched` instead of subtracting before/after counts. Re-syncs now report "6 already present (skipped to avoid duplication)" instead of misreporting them as fully placed or fully unmatched. New `outStats` channel from `insertCommentsIntoMarkdown`.
|
|
20
|
+
|
|
21
|
+
## [0.9.10] - 2026-04-30
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
- `stripAnnotations` stripped `[anchor]{.mark}` spans even when `keepComments=true`, leaving the dual-build marker generator with no anchor text and collapsing every multi-word anchor to a single fallback word in the rebuilt docx. Now preserves anchor spans that belong to retained `{>>...<<}` comments.
|
|
25
|
+
- Comments authored at the very start of a Word section landed before the markdown file's `# Heading` line and rendered in the previous section. Added `pushPastSectionHeading` so position-0 comments advance to the first body paragraph of the section they were authored in.
|
|
26
|
+
- Empty-anchor comments fell through to proportional placement even when before/after context uniquely identified the position, landing mid-word or splitting unrelated phrases. Context match now runs first; proportional placement is the fallback.
|
|
27
|
+
- When an anchor appeared multiple times in the search window (repeated phrasing, formulaic prose), `insertCommentsIntoMarkdown` always picked the first occurrence. Now picks the occurrence closest to the docx-derived insert position.
|
|
28
|
+
|
|
29
|
+
## [0.9.7] - 2026-04-29
|
|
30
|
+
|
|
31
|
+
### Added
|
|
32
|
+
- `rev sync --comments-only` — import only Word comments at fuzzy-matched anchors, leaving prose byte-identical. Use when the markdown was revised between sending the docx out for review and receiving it back; applying track changes from a stale draft would clobber newer edits.
|
|
33
|
+
- `rev verify-anchors <docx>` — drift report classifying every comment as `clean` / `drift` / `context-only` / `ambiguous` / `unmatched` against the current section markdown. Pair with `--comments-only` to plan placement before sync. Supports `--json` for scripting.
|
|
34
|
+
- `extractHeadings()` in `word-extraction.ts` — read heading paragraphs directly from `<w:pStyle>` styles, returning text + level + position in the same coordinate system as comment anchors.
|
|
35
|
+
- Shared `lib/commands/section-boundaries.ts` — single source of truth that maps `sections.yaml` to docx text positions, used by both sync and verify-anchors.
|
|
36
|
+
- Shared `lib/anchor-match.ts` — pure anchor-matching primitives (`findAnchorInText`, `stripCriticMarkup`, `classifyStrategy`) so sync (insertion) and verify-anchors (drift reporting) use the same fallback strategies.
|
|
37
|
+
- New tests: `test/anchor-match.test.js` (11 cases covering each fallback strategy and the quality classifier).
|
|
38
|
+
|
|
39
|
+
### Fixed
|
|
40
|
+
- **Section detection mistook prose for headings.** The old keyword finder scanned the concatenated body text and would match "results across countries" as the Results heading or skip the real Methods heading because the structured-abstract label `Methods:` lost its colon during text-run concatenation. Replaced with paragraph-style-based heading extraction, so boundaries now reflect actual heading paragraphs. Affects the new commands; the existing sync flow already used pandoc-derived headings and was unaffected.
|
|
41
|
+
- `stripCriticMarkup` regex used `[^<]*` and silently failed on comments containing `<` characters (e.g. `pre-industrial trade (<1825)`). Switched to non-greedy `[\s\S]*?`.
|
|
42
|
+
- `insertCommentsIntoMarkdown` always prepended a leading space when there was no anchor, accumulating multiple spaces when several comments shared a position 0 anchor. Removed the heuristic; comments insert at exact position so prose stays byte-identical except for the inserted blocks.
|
|
43
|
+
- `verify-anchors` crashed with a stack trace when given a non-docx file (e.g. an `.md` path). Now reports a friendly error.
|
|
44
|
+
|
|
45
|
+
### Changed
|
|
46
|
+
- New flag is `--comments-only` (positive form). The originally proposed `--no-overwrite` was dropped because Commander assigns `--no-X` to `options.x === false` rather than `options.noX === true`, which made the flag silently ignored.
|
|
47
|
+
- `insertCommentsIntoMarkdown` now accepts `wrapAnchor?: boolean` (default `true`). When `false`, comment blocks are inserted next to the anchor without `[anchor]{.mark}` wrapping. `--comments-only` uses this so multiple comments sharing an anchor (e.g. 6 reviewers commenting on the same word) no longer produce nested broken CriticMarkup.
|
|
48
|
+
|
|
49
|
+
## [0.7.1] - 2025-01-02
|
|
50
|
+
|
|
51
|
+
### Added
|
|
52
|
+
- Writing Markdown guide in docs (tables, equations, citations, cross-refs)
|
|
53
|
+
- Grid table syntax documentation for merged cells
|
|
54
|
+
|
|
55
|
+
### Changed
|
|
56
|
+
- README restructured for better scannability (490 → 290 lines)
|
|
57
|
+
- Install section moved up for faster onboarding
|
|
58
|
+
- Added Highlights section with quick feature overview
|
|
59
|
+
- Condensed overlapping sections
|
|
60
|
+
|
|
61
|
+
## [0.7.0] - 2025-01-02
|
|
62
|
+
|
|
63
|
+
### Added
|
|
64
|
+
- API rate limiting with exponential backoff for Crossref/DataCite/doi.org APIs
|
|
65
|
+
- Windows support in CI matrix
|
|
66
|
+
- Architecture documentation for contributors (`ARCHITECTURE.md`)
|
|
67
|
+
- Exclusion patterns for cross-reference false positives (e.g., "Table of Contents")
|
|
68
|
+
- Timeout support for PDF extraction (30s default)
|
|
69
|
+
|
|
70
|
+
### Changed
|
|
71
|
+
- Consolidated YAML dependencies (removed `js-yaml`, using `yaml` package only)
|
|
72
|
+
- Improved annotation false positive detection (code blocks, URLs, LaTeX patterns)
|
|
73
|
+
- Enhanced error messages for Word import and PDF extraction
|
|
74
|
+
- Updated User-Agent strings for API requests
|
|
75
|
+
- Improved README with problem statement and quick example
|
|
76
|
+
|
|
77
|
+
### Fixed
|
|
78
|
+
- CI lint step now checks all command files separately
|
|
79
|
+
- Windows temp directory paths in tests
|
|
80
|
+
|
|
81
|
+
## [0.3.2] - 2024-12-29
|
|
82
|
+
|
|
83
|
+
### Added
|
|
84
|
+
- Full TypeScript type definitions (`types/index.d.ts`)
|
|
85
|
+
- GitHub Actions CI workflow (Node 18/20/22)
|
|
86
|
+
- ESM subpath exports for all library modules
|
|
87
|
+
- CLI integration tests (26 tests)
|
|
88
|
+
- Comprehensive test coverage: 419 tests across 18 modules
|
|
89
|
+
|
|
90
|
+
### Fixed
|
|
91
|
+
- DOI skip detection: `% no-doi` comments now correctly apply only to the next entry
|
|
92
|
+
|
|
93
|
+
### Changed
|
|
94
|
+
- Added `engines` field requiring Node.js >=18.0.0
|
|
95
|
+
- Updated README with badges (npm, CI, Node.js, License)
|
|
96
|
+
|
|
97
|
+
## [0.3.1] - 2024-12-28
|
|
98
|
+
|
|
99
|
+
### Fixed
|
|
100
|
+
- Equation extraction test assertions
|
|
101
|
+
- Minor bug fixes
|
|
102
|
+
|
|
103
|
+
## [0.3.0] - 2024-12-27
|
|
104
|
+
|
|
105
|
+
### Added
|
|
106
|
+
- DOI validation via Crossref and DataCite APIs (`rev doi check`)
|
|
107
|
+
- DOI lookup for missing entries (`rev doi lookup`)
|
|
108
|
+
- DOI fetch and add commands (`rev doi fetch`, `rev doi add`)
|
|
109
|
+
- Citation validation against bibliography (`rev citations`)
|
|
110
|
+
- LaTeX equation extraction (`rev equations list`)
|
|
111
|
+
- Word equation import OMML → LaTeX (`rev equations from-word`)
|
|
112
|
+
- Response letter generation (`rev response`)
|
|
113
|
+
- Journal validation profiles (`rev validate --journal`)
|
|
114
|
+
- Advanced figure/table reference patterns (Figs. 1-3, Fig. 1a-c)
|
|
115
|
+
|
|
116
|
+
### Changed
|
|
117
|
+
- Improved cross-reference pattern detection
|
|
118
|
+
- Enhanced Word import with better section splitting
|
|
119
|
+
|
|
120
|
+
## [0.2.1] - 2024-12-26
|
|
121
|
+
|
|
122
|
+
### Added
|
|
123
|
+
- Table of contents option (`rev build --toc`)
|
|
124
|
+
- CSV export for comments (`rev comments --export`)
|
|
125
|
+
- Anonymize command for blind review (`rev anonymize`)
|
|
126
|
+
- Formatting utilities (tables, boxes, spinners)
|
|
127
|
+
|
|
128
|
+
## [0.2.0] - 2024-12-25
|
|
129
|
+
|
|
130
|
+
### Added
|
|
131
|
+
- Integrated build system (`rev build pdf/docx/tex`)
|
|
132
|
+
- Comment reply functionality (`rev reply`)
|
|
133
|
+
- Word document bootstrap (`rev import` creates project from .docx)
|
|
134
|
+
- Section-aware import (`rev sections`)
|
|
135
|
+
- Cross-reference migration (`rev migrate`)
|
|
136
|
+
|
|
137
|
+
### Changed
|
|
138
|
+
- Renamed project to docrev
|
|
139
|
+
- Published to npm
|
|
140
|
+
|
|
141
|
+
## [0.1.0] - 2024-12-24
|
|
142
|
+
|
|
143
|
+
### Added
|
|
144
|
+
- Initial release
|
|
145
|
+
- CriticMarkup annotation parsing
|
|
146
|
+
- Word ↔ Markdown round-trips
|
|
147
|
+
- Interactive review TUI (`rev review`)
|
|
148
|
+
- Comment management (`rev comments`, `rev resolve`)
|
|
149
|
+
- Project templates (`rev new`)
|