docrev 0.8.1 → 0.8.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/PLAN-tables-and-postprocess.md +850 -0
  3. package/README.md +33 -0
  4. package/bin/rev.js +12 -131
  5. package/bin/rev.ts +145 -0
  6. package/dist/bin/rev.d.ts +9 -0
  7. package/dist/bin/rev.d.ts.map +1 -0
  8. package/dist/bin/rev.js +118 -0
  9. package/dist/bin/rev.js.map +1 -0
  10. package/dist/lib/annotations.d.ts +91 -0
  11. package/dist/lib/annotations.d.ts.map +1 -0
  12. package/dist/lib/annotations.js +554 -0
  13. package/dist/lib/annotations.js.map +1 -0
  14. package/dist/lib/build.d.ts +171 -0
  15. package/dist/lib/build.d.ts.map +1 -0
  16. package/dist/lib/build.js +755 -0
  17. package/dist/lib/build.js.map +1 -0
  18. package/dist/lib/citations.d.ts +34 -0
  19. package/dist/lib/citations.d.ts.map +1 -0
  20. package/dist/lib/citations.js +140 -0
  21. package/dist/lib/citations.js.map +1 -0
  22. package/dist/lib/commands/build.d.ts +13 -0
  23. package/dist/lib/commands/build.d.ts.map +1 -0
  24. package/dist/lib/commands/build.js +678 -0
  25. package/dist/lib/commands/build.js.map +1 -0
  26. package/dist/lib/commands/citations.d.ts +11 -0
  27. package/dist/lib/commands/citations.d.ts.map +1 -0
  28. package/dist/lib/commands/citations.js +428 -0
  29. package/dist/lib/commands/citations.js.map +1 -0
  30. package/dist/lib/commands/comments.d.ts +11 -0
  31. package/dist/lib/commands/comments.d.ts.map +1 -0
  32. package/dist/lib/commands/comments.js +883 -0
  33. package/dist/lib/commands/comments.js.map +1 -0
  34. package/dist/lib/commands/context.d.ts +35 -0
  35. package/dist/lib/commands/context.d.ts.map +1 -0
  36. package/dist/lib/commands/context.js +59 -0
  37. package/dist/lib/commands/context.js.map +1 -0
  38. package/dist/lib/commands/core.d.ts +11 -0
  39. package/dist/lib/commands/core.d.ts.map +1 -0
  40. package/dist/lib/commands/core.js +246 -0
  41. package/dist/lib/commands/core.js.map +1 -0
  42. package/dist/lib/commands/doi.d.ts +11 -0
  43. package/dist/lib/commands/doi.d.ts.map +1 -0
  44. package/dist/lib/commands/doi.js +373 -0
  45. package/dist/lib/commands/doi.js.map +1 -0
  46. package/dist/lib/commands/history.d.ts +11 -0
  47. package/dist/lib/commands/history.d.ts.map +1 -0
  48. package/dist/lib/commands/history.js +245 -0
  49. package/dist/lib/commands/history.js.map +1 -0
  50. package/dist/lib/commands/index.d.ts +28 -0
  51. package/dist/lib/commands/index.d.ts.map +1 -0
  52. package/dist/lib/commands/index.js +35 -0
  53. package/dist/lib/commands/index.js.map +1 -0
  54. package/dist/lib/commands/init.d.ts +11 -0
  55. package/dist/lib/commands/init.d.ts.map +1 -0
  56. package/dist/lib/commands/init.js +209 -0
  57. package/dist/lib/commands/init.js.map +1 -0
  58. package/dist/lib/commands/response.d.ts +11 -0
  59. package/dist/lib/commands/response.d.ts.map +1 -0
  60. package/dist/lib/commands/response.js +317 -0
  61. package/dist/lib/commands/response.js.map +1 -0
  62. package/dist/lib/commands/sections.d.ts +11 -0
  63. package/dist/lib/commands/sections.d.ts.map +1 -0
  64. package/dist/lib/commands/sections.js +1071 -0
  65. package/dist/lib/commands/sections.js.map +1 -0
  66. package/dist/lib/commands/utilities.d.ts +19 -0
  67. package/dist/lib/commands/utilities.d.ts.map +1 -0
  68. package/dist/lib/commands/utilities.js +2009 -0
  69. package/dist/lib/commands/utilities.js.map +1 -0
  70. package/dist/lib/comment-realign.d.ts +50 -0
  71. package/dist/lib/comment-realign.d.ts.map +1 -0
  72. package/dist/lib/comment-realign.js +372 -0
  73. package/dist/lib/comment-realign.js.map +1 -0
  74. package/dist/lib/config.d.ts +41 -0
  75. package/dist/lib/config.d.ts.map +1 -0
  76. package/dist/lib/config.js +76 -0
  77. package/dist/lib/config.js.map +1 -0
  78. package/dist/lib/crossref.d.ts +108 -0
  79. package/dist/lib/crossref.d.ts.map +1 -0
  80. package/dist/lib/crossref.js +597 -0
  81. package/dist/lib/crossref.js.map +1 -0
  82. package/dist/lib/dependencies.d.ts +30 -0
  83. package/dist/lib/dependencies.d.ts.map +1 -0
  84. package/dist/lib/dependencies.js +95 -0
  85. package/dist/lib/dependencies.js.map +1 -0
  86. package/dist/lib/doi-cache.d.ts +29 -0
  87. package/dist/lib/doi-cache.d.ts.map +1 -0
  88. package/dist/lib/doi-cache.js +104 -0
  89. package/dist/lib/doi-cache.js.map +1 -0
  90. package/dist/lib/doi.d.ts +65 -0
  91. package/dist/lib/doi.d.ts.map +1 -0
  92. package/dist/lib/doi.js +710 -0
  93. package/dist/lib/doi.js.map +1 -0
  94. package/dist/lib/equations.d.ts +61 -0
  95. package/dist/lib/equations.d.ts.map +1 -0
  96. package/dist/lib/equations.js +445 -0
  97. package/dist/lib/equations.js.map +1 -0
  98. package/dist/lib/errors.d.ts +60 -0
  99. package/dist/lib/errors.d.ts.map +1 -0
  100. package/dist/lib/errors.js +303 -0
  101. package/dist/lib/errors.js.map +1 -0
  102. package/dist/lib/format.d.ts +104 -0
  103. package/dist/lib/format.d.ts.map +1 -0
  104. package/dist/lib/format.js +416 -0
  105. package/dist/lib/format.js.map +1 -0
  106. package/dist/lib/git.d.ts +88 -0
  107. package/dist/lib/git.d.ts.map +1 -0
  108. package/dist/lib/git.js +304 -0
  109. package/dist/lib/git.js.map +1 -0
  110. package/dist/lib/grammar.d.ts +62 -0
  111. package/dist/lib/grammar.d.ts.map +1 -0
  112. package/dist/lib/grammar.js +244 -0
  113. package/dist/lib/grammar.js.map +1 -0
  114. package/dist/lib/image-registry.d.ts +68 -0
  115. package/dist/lib/image-registry.d.ts.map +1 -0
  116. package/dist/lib/image-registry.js +112 -0
  117. package/dist/lib/image-registry.js.map +1 -0
  118. package/dist/lib/import.d.ts +184 -0
  119. package/dist/lib/import.d.ts.map +1 -0
  120. package/dist/lib/import.js +1581 -0
  121. package/dist/lib/import.js.map +1 -0
  122. package/dist/lib/journals.d.ts +55 -0
  123. package/dist/lib/journals.d.ts.map +1 -0
  124. package/dist/lib/journals.js +417 -0
  125. package/dist/lib/journals.js.map +1 -0
  126. package/dist/lib/merge.d.ts +138 -0
  127. package/dist/lib/merge.d.ts.map +1 -0
  128. package/dist/lib/merge.js +603 -0
  129. package/dist/lib/merge.js.map +1 -0
  130. package/dist/lib/orcid.d.ts +36 -0
  131. package/dist/lib/orcid.d.ts.map +1 -0
  132. package/dist/lib/orcid.js +117 -0
  133. package/dist/lib/orcid.js.map +1 -0
  134. package/dist/lib/pdf-comments.d.ts +95 -0
  135. package/dist/lib/pdf-comments.d.ts.map +1 -0
  136. package/dist/lib/pdf-comments.js +192 -0
  137. package/dist/lib/pdf-comments.js.map +1 -0
  138. package/dist/lib/pdf-import.d.ts +118 -0
  139. package/dist/lib/pdf-import.d.ts.map +1 -0
  140. package/dist/lib/pdf-import.js +397 -0
  141. package/dist/lib/pdf-import.js.map +1 -0
  142. package/dist/lib/plugins.d.ts +76 -0
  143. package/dist/lib/plugins.d.ts.map +1 -0
  144. package/dist/lib/plugins.js +235 -0
  145. package/dist/lib/plugins.js.map +1 -0
  146. package/dist/lib/postprocess.d.ts +42 -0
  147. package/dist/lib/postprocess.d.ts.map +1 -0
  148. package/dist/lib/postprocess.js +138 -0
  149. package/dist/lib/postprocess.js.map +1 -0
  150. package/dist/lib/pptx-template.d.ts +59 -0
  151. package/dist/lib/pptx-template.d.ts.map +1 -0
  152. package/dist/lib/pptx-template.js +613 -0
  153. package/dist/lib/pptx-template.js.map +1 -0
  154. package/dist/lib/pptx-themes.d.ts +80 -0
  155. package/dist/lib/pptx-themes.d.ts.map +1 -0
  156. package/dist/lib/pptx-themes.js +818 -0
  157. package/dist/lib/pptx-themes.js.map +1 -0
  158. package/dist/lib/protect-restore.d.ts +137 -0
  159. package/dist/lib/protect-restore.d.ts.map +1 -0
  160. package/dist/lib/protect-restore.js +394 -0
  161. package/dist/lib/protect-restore.js.map +1 -0
  162. package/dist/lib/rate-limiter.d.ts +27 -0
  163. package/dist/lib/rate-limiter.d.ts.map +1 -0
  164. package/dist/lib/rate-limiter.js +79 -0
  165. package/dist/lib/rate-limiter.js.map +1 -0
  166. package/dist/lib/response.d.ts +41 -0
  167. package/dist/lib/response.d.ts.map +1 -0
  168. package/dist/lib/response.js +150 -0
  169. package/dist/lib/response.js.map +1 -0
  170. package/dist/lib/review.d.ts +35 -0
  171. package/dist/lib/review.d.ts.map +1 -0
  172. package/dist/lib/review.js +263 -0
  173. package/dist/lib/review.js.map +1 -0
  174. package/dist/lib/schema.d.ts +66 -0
  175. package/dist/lib/schema.d.ts.map +1 -0
  176. package/dist/lib/schema.js +339 -0
  177. package/dist/lib/schema.js.map +1 -0
  178. package/dist/lib/scientific-words.d.ts +6 -0
  179. package/dist/lib/scientific-words.d.ts.map +1 -0
  180. package/dist/lib/scientific-words.js +66 -0
  181. package/dist/lib/scientific-words.js.map +1 -0
  182. package/dist/lib/sections.d.ts +40 -0
  183. package/dist/lib/sections.d.ts.map +1 -0
  184. package/dist/lib/sections.js +288 -0
  185. package/dist/lib/sections.js.map +1 -0
  186. package/dist/lib/slides.d.ts +86 -0
  187. package/dist/lib/slides.d.ts.map +1 -0
  188. package/dist/lib/slides.js +676 -0
  189. package/dist/lib/slides.js.map +1 -0
  190. package/dist/lib/spelling.d.ts +76 -0
  191. package/dist/lib/spelling.d.ts.map +1 -0
  192. package/dist/lib/spelling.js +272 -0
  193. package/dist/lib/spelling.js.map +1 -0
  194. package/dist/lib/templates.d.ts +30 -0
  195. package/dist/lib/templates.d.ts.map +1 -0
  196. package/dist/lib/templates.js +504 -0
  197. package/dist/lib/templates.js.map +1 -0
  198. package/dist/lib/themes.d.ts +85 -0
  199. package/dist/lib/themes.d.ts.map +1 -0
  200. package/dist/lib/themes.js +652 -0
  201. package/dist/lib/themes.js.map +1 -0
  202. package/dist/lib/trackchanges.d.ts +51 -0
  203. package/dist/lib/trackchanges.d.ts.map +1 -0
  204. package/dist/lib/trackchanges.js +202 -0
  205. package/dist/lib/trackchanges.js.map +1 -0
  206. package/dist/lib/tui.d.ts +76 -0
  207. package/dist/lib/tui.d.ts.map +1 -0
  208. package/dist/lib/tui.js +377 -0
  209. package/dist/lib/tui.js.map +1 -0
  210. package/dist/lib/types.d.ts +447 -0
  211. package/dist/lib/types.d.ts.map +1 -0
  212. package/dist/lib/types.js +6 -0
  213. package/dist/lib/types.js.map +1 -0
  214. package/dist/lib/undo.d.ts +57 -0
  215. package/dist/lib/undo.d.ts.map +1 -0
  216. package/dist/lib/undo.js +185 -0
  217. package/dist/lib/undo.js.map +1 -0
  218. package/dist/lib/utils.d.ts +16 -0
  219. package/dist/lib/utils.d.ts.map +1 -0
  220. package/dist/lib/utils.js +40 -0
  221. package/dist/lib/utils.js.map +1 -0
  222. package/dist/lib/variables.d.ts +42 -0
  223. package/dist/lib/variables.d.ts.map +1 -0
  224. package/dist/lib/variables.js +141 -0
  225. package/dist/lib/variables.js.map +1 -0
  226. package/dist/lib/word.d.ts +80 -0
  227. package/dist/lib/word.d.ts.map +1 -0
  228. package/dist/lib/word.js +360 -0
  229. package/dist/lib/word.js.map +1 -0
  230. package/dist/lib/wordcomments.d.ts +51 -0
  231. package/dist/lib/wordcomments.d.ts.map +1 -0
  232. package/dist/lib/wordcomments.js +587 -0
  233. package/dist/lib/wordcomments.js.map +1 -0
  234. package/eslint.config.js +27 -0
  235. package/lib/annotations.ts +622 -0
  236. package/lib/apply-buildup-colors.py +88 -0
  237. package/lib/build.ts +1013 -0
  238. package/lib/{citations.js → citations.ts} +38 -27
  239. package/lib/commands/{build.js → build.ts} +80 -27
  240. package/lib/commands/{citations.js → citations.ts} +36 -18
  241. package/lib/commands/{comments.js → comments.ts} +187 -54
  242. package/lib/commands/{context.js → context.ts} +18 -8
  243. package/lib/commands/{core.js → core.ts} +34 -20
  244. package/lib/commands/{doi.js → doi.ts} +32 -16
  245. package/lib/commands/{history.js → history.ts} +25 -12
  246. package/lib/commands/{index.js → index.ts} +9 -5
  247. package/lib/commands/{init.js → init.ts} +20 -8
  248. package/lib/commands/{response.js → response.ts} +47 -20
  249. package/lib/commands/{sections.js → sections.ts} +273 -68
  250. package/lib/commands/{utilities.js → utilities.ts} +338 -158
  251. package/lib/{comment-realign.js → comment-realign.ts} +117 -45
  252. package/lib/config.ts +84 -0
  253. package/lib/{crossref.js → crossref.ts} +213 -138
  254. package/lib/dependencies.ts +106 -0
  255. package/lib/doi-cache.ts +115 -0
  256. package/lib/{doi.js → doi.ts} +115 -281
  257. package/lib/{equations.js → equations.ts} +60 -64
  258. package/lib/{errors.js → errors.ts} +56 -48
  259. package/lib/{format.js → format.ts} +137 -63
  260. package/lib/{git.js → git.ts} +66 -63
  261. package/lib/{grammar.js → grammar.ts} +45 -32
  262. package/lib/image-registry.ts +180 -0
  263. package/lib/import.ts +2060 -0
  264. package/lib/journals.ts +505 -0
  265. package/lib/{merge.js → merge.ts} +185 -135
  266. package/lib/{orcid.js → orcid.ts} +17 -22
  267. package/lib/{pdf-comments.js → pdf-comments.ts} +76 -18
  268. package/lib/{pdf-import.js → pdf-import.ts} +148 -70
  269. package/lib/{plugins.js → plugins.ts} +82 -39
  270. package/lib/postprocess.ts +188 -0
  271. package/lib/pptx-color-filter.lua +37 -0
  272. package/lib/pptx-template.ts +625 -0
  273. package/lib/pptx-themes/academic.pptx +0 -0
  274. package/lib/pptx-themes/corporate.pptx +0 -0
  275. package/lib/pptx-themes/dark.pptx +0 -0
  276. package/lib/pptx-themes/default.pptx +0 -0
  277. package/lib/pptx-themes/minimal.pptx +0 -0
  278. package/lib/pptx-themes/plant.pptx +0 -0
  279. package/lib/pptx-themes.ts +896 -0
  280. package/lib/protect-restore.ts +516 -0
  281. package/lib/rate-limiter.ts +94 -0
  282. package/lib/{response.js → response.ts} +36 -21
  283. package/lib/{review.js → review.ts} +53 -43
  284. package/lib/{schema.js → schema.ts} +70 -25
  285. package/lib/{sections.js → sections.ts} +71 -76
  286. package/lib/slides.ts +793 -0
  287. package/lib/{spelling.js → spelling.ts} +43 -59
  288. package/lib/{templates.js → templates.ts} +20 -17
  289. package/lib/themes.ts +742 -0
  290. package/lib/{trackchanges.js → trackchanges.ts} +52 -23
  291. package/lib/types.ts +509 -0
  292. package/lib/{undo.js → undo.ts} +75 -52
  293. package/lib/utils.ts +41 -0
  294. package/lib/{variables.js → variables.ts} +60 -54
  295. package/lib/word.ts +428 -0
  296. package/lib/{wordcomments.js → wordcomments.ts} +94 -40
  297. package/package.json +15 -5
  298. package/skill/REFERENCE.md +67 -0
  299. package/tsconfig.json +26 -0
  300. package/lib/annotations.js +0 -414
  301. package/lib/build.js +0 -639
  302. package/lib/config.js +0 -79
  303. package/lib/import.js +0 -1145
  304. package/lib/journals.js +0 -629
  305. package/lib/word.js +0 -225
  306. /package/lib/{scientific-words.js → scientific-words.ts} +0 -0
@@ -0,0 +1,603 @@
1
+ /**
2
+ * Multi-reviewer merge utilities
3
+ * Combine feedback from multiple Word documents with conflict detection
4
+ *
5
+ * Supports true three-way merge: base document + multiple reviewer versions
6
+ */
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import { diffWords, diffSentences } from 'diff';
10
+ import { extractFromWord, extractWordComments } from './import.js';
11
+ // =============================================================================
12
+ // Constants
13
+ // =============================================================================
14
+ /** Directory for revision tracking data */
15
+ const REV_DIR = '.rev';
16
+ /** Path to base document for three-way merge */
17
+ const BASE_FILE = '.rev/base.docx';
18
+ /** Path to conflict resolution state */
19
+ const CONFLICTS_FILE = '.rev/conflicts.json';
20
+ /** Minimum word length for similarity calculations */
21
+ const MIN_WORD_LENGTH = 2;
22
+ /** Similarity threshold below which changes are considered conflicts */
23
+ const CONFLICT_SIMILARITY_THRESHOLD = 0.8;
24
+ /** Characters of context for change attribution */
25
+ const CHANGE_CONTEXT_SIZE = 50;
26
+ // =============================================================================
27
+ // Public API
28
+ // =============================================================================
29
+ /**
30
+ * Initialize .rev directory for revision tracking
31
+ * @param projectDir - Project directory path
32
+ * @throws {TypeError} If projectDir is not a string
33
+ */
34
+ export function initRevDir(projectDir) {
35
+ if (typeof projectDir !== 'string') {
36
+ throw new TypeError(`projectDir must be a string, got ${typeof projectDir}`);
37
+ }
38
+ const revDir = path.join(projectDir, REV_DIR);
39
+ if (!fs.existsSync(revDir)) {
40
+ fs.mkdirSync(revDir, { recursive: true });
41
+ }
42
+ }
43
+ /**
44
+ * Store the base document for three-way merge
45
+ * Overwrites any previous base document
46
+ * @param projectDir - Project directory path
47
+ * @param docxPath - Path to the built docx to store as base
48
+ * @throws {TypeError} If arguments are not strings
49
+ * @throws {Error} If docxPath does not exist
50
+ */
51
+ export function storeBaseDocument(projectDir, docxPath) {
52
+ if (typeof projectDir !== 'string') {
53
+ throw new TypeError(`projectDir must be a string, got ${typeof projectDir}`);
54
+ }
55
+ if (typeof docxPath !== 'string') {
56
+ throw new TypeError(`docxPath must be a string, got ${typeof docxPath}`);
57
+ }
58
+ if (!fs.existsSync(docxPath)) {
59
+ throw new Error(`Source document not found: ${docxPath}`);
60
+ }
61
+ initRevDir(projectDir);
62
+ const basePath = path.join(projectDir, BASE_FILE);
63
+ fs.copyFileSync(docxPath, basePath);
64
+ }
65
+ /**
66
+ * Get the base document path if it exists
67
+ * @param projectDir - Project directory path
68
+ * @returns Path to base document or null if not found
69
+ * @throws {TypeError} If projectDir is not a string
70
+ */
71
+ export function getBaseDocument(projectDir) {
72
+ if (typeof projectDir !== 'string') {
73
+ throw new TypeError(`projectDir must be a string, got ${typeof projectDir}`);
74
+ }
75
+ const basePath = path.join(projectDir, BASE_FILE);
76
+ if (fs.existsSync(basePath)) {
77
+ return basePath;
78
+ }
79
+ return null;
80
+ }
81
+ /**
82
+ * Check if base document exists
83
+ * @param projectDir - Project directory path
84
+ * @returns True if base document exists
85
+ * @throws {TypeError} If projectDir is not a string
86
+ */
87
+ export function hasBaseDocument(projectDir) {
88
+ if (typeof projectDir !== 'string') {
89
+ throw new TypeError(`projectDir must be a string, got ${typeof projectDir}`);
90
+ }
91
+ return fs.existsSync(path.join(projectDir, BASE_FILE));
92
+ }
93
+ /**
94
+ * Compute text similarity between two strings using Jaccard-like coefficient
95
+ * @param text1 - First text to compare
96
+ * @param text2 - Second text to compare
97
+ * @returns Similarity score 0-1 (0 = no similarity, 1 = identical)
98
+ */
99
+ export function computeSimilarity(text1, text2) {
100
+ if (typeof text1 !== 'string' || typeof text2 !== 'string') {
101
+ return 0;
102
+ }
103
+ const words1 = new Set(text1.toLowerCase().split(/\s+/).filter(w => w.length > MIN_WORD_LENGTH));
104
+ const words2 = text2.toLowerCase().split(/\s+/).filter(w => w.length > MIN_WORD_LENGTH);
105
+ if (words1.size === 0 || words2.length === 0)
106
+ return 0;
107
+ const common = words2.filter(w => words1.has(w)).length;
108
+ return common / Math.max(words1.size, words2.length);
109
+ }
110
+ /**
111
+ * Check if base document matches reviewer document (similarity check)
112
+ */
113
+ export async function checkBaseMatch(basePath, reviewerPath) {
114
+ try {
115
+ const { text: baseText } = await extractFromWord(basePath);
116
+ const { text: reviewerText } = await extractFromWord(reviewerPath);
117
+ const similarity = computeSimilarity(baseText, reviewerText);
118
+ return { matches: similarity > 0.5, similarity };
119
+ }
120
+ catch {
121
+ return { matches: false, similarity: 0 };
122
+ }
123
+ }
124
+ /**
125
+ * Extract changes from a Word document compared to original
126
+ * Uses sentence-level diffing for better conflict detection
127
+ * @param originalText - Original text (from base document)
128
+ * @param wordText - Text extracted from reviewer's Word doc
129
+ * @param reviewer - Reviewer identifier
130
+ */
131
+ export function extractChanges(originalText, wordText, reviewer) {
132
+ const changes = [];
133
+ // Use sentence-level diff for better granularity
134
+ const diffs = diffSentences(originalText, wordText);
135
+ let originalPos = 0;
136
+ let i = 0;
137
+ while (i < diffs.length) {
138
+ const part = diffs[i];
139
+ if (!part)
140
+ break;
141
+ if (!part.added && !part.removed) {
142
+ // Unchanged
143
+ originalPos += part.value.length;
144
+ i++;
145
+ }
146
+ else if (part.removed && diffs[i + 1]?.added) {
147
+ // Replacement: removed followed by added
148
+ const nextPart = diffs[i + 1];
149
+ if (!nextPart)
150
+ break;
151
+ changes.push({
152
+ reviewer,
153
+ type: 'replace',
154
+ start: originalPos,
155
+ end: originalPos + part.value.length,
156
+ oldText: part.value,
157
+ newText: nextPart.value,
158
+ });
159
+ originalPos += part.value.length;
160
+ i += 2;
161
+ }
162
+ else if (part.removed) {
163
+ // Pure deletion
164
+ changes.push({
165
+ reviewer,
166
+ type: 'delete',
167
+ start: originalPos,
168
+ end: originalPos + part.value.length,
169
+ oldText: part.value,
170
+ newText: '',
171
+ });
172
+ originalPos += part.value.length;
173
+ i++;
174
+ }
175
+ else if (part.added) {
176
+ // Pure insertion
177
+ changes.push({
178
+ reviewer,
179
+ type: 'insert',
180
+ start: originalPos,
181
+ end: originalPos,
182
+ oldText: '',
183
+ newText: part.value,
184
+ });
185
+ i++;
186
+ }
187
+ }
188
+ return changes;
189
+ }
190
+ /**
191
+ * Extract changes using word-level diff (more fine-grained)
192
+ */
193
+ export function extractChangesWordLevel(originalText, wordText, reviewer) {
194
+ const changes = [];
195
+ const diffs = diffWords(originalText, wordText);
196
+ let originalPos = 0;
197
+ let i = 0;
198
+ while (i < diffs.length) {
199
+ const part = diffs[i];
200
+ if (!part)
201
+ break;
202
+ if (!part.added && !part.removed) {
203
+ originalPos += part.value.length;
204
+ i++;
205
+ }
206
+ else if (part.removed && diffs[i + 1]?.added) {
207
+ const nextPart = diffs[i + 1];
208
+ if (!nextPart)
209
+ break;
210
+ changes.push({
211
+ reviewer,
212
+ type: 'replace',
213
+ start: originalPos,
214
+ end: originalPos + part.value.length,
215
+ oldText: part.value,
216
+ newText: nextPart.value,
217
+ });
218
+ originalPos += part.value.length;
219
+ i += 2;
220
+ }
221
+ else if (part.removed) {
222
+ changes.push({
223
+ reviewer,
224
+ type: 'delete',
225
+ start: originalPos,
226
+ end: originalPos + part.value.length,
227
+ oldText: part.value,
228
+ newText: '',
229
+ });
230
+ originalPos += part.value.length;
231
+ i++;
232
+ }
233
+ else if (part.added) {
234
+ changes.push({
235
+ reviewer,
236
+ type: 'insert',
237
+ start: originalPos,
238
+ end: originalPos,
239
+ oldText: '',
240
+ newText: part.value,
241
+ });
242
+ i++;
243
+ }
244
+ }
245
+ return changes;
246
+ }
247
+ /**
248
+ * Check if two changes overlap
249
+ */
250
+ function changesOverlap(a, b) {
251
+ // Insertions at same point conflict
252
+ if (a.type === 'insert' && b.type === 'insert' && a.start === b.start) {
253
+ return a.newText !== b.newText; // Same insertion is not a conflict
254
+ }
255
+ // Check range overlap
256
+ const aStart = a.start;
257
+ const aEnd = a.type === 'insert' ? a.start : a.end;
258
+ const bStart = b.start;
259
+ const bEnd = b.type === 'insert' ? b.start : b.end;
260
+ // Ranges overlap if neither ends before the other starts
261
+ if (aEnd <= bStart || bEnd <= aStart) {
262
+ return false;
263
+ }
264
+ // They overlap - but is it a conflict?
265
+ // Same change from different reviewers is not a conflict
266
+ if (a.type === b.type && a.oldText === b.oldText && a.newText === b.newText) {
267
+ return false;
268
+ }
269
+ return true;
270
+ }
271
+ /**
272
+ * Detect conflicts between changes from multiple reviewers
273
+ * @param allChanges - Array of change arrays, one per reviewer
274
+ */
275
+ export function detectConflicts(allChanges) {
276
+ // Flatten and sort all changes by position
277
+ const flat = allChanges.flat().sort((a, b) => a.start - b.start || a.end - b.end);
278
+ const conflicts = [];
279
+ const nonConflicting = [];
280
+ const usedIndices = new Set();
281
+ let conflictId = 0;
282
+ for (let i = 0; i < flat.length; i++) {
283
+ if (usedIndices.has(i))
284
+ continue;
285
+ const change = flat[i];
286
+ if (!change)
287
+ continue;
288
+ const conflictingChanges = [change];
289
+ // Find all changes that conflict with this one
290
+ for (let j = i + 1; j < flat.length; j++) {
291
+ if (usedIndices.has(j))
292
+ continue;
293
+ const other = flat[j];
294
+ if (!other)
295
+ continue;
296
+ // Stop if we're past the range
297
+ if (other.start > change.end && change.type !== 'insert')
298
+ break;
299
+ if (changesOverlap(change, other)) {
300
+ conflictingChanges.push(other);
301
+ usedIndices.add(j);
302
+ }
303
+ }
304
+ if (conflictingChanges.length > 1) {
305
+ // Multiple reviewers changed the same region
306
+ const start = Math.min(...conflictingChanges.map(c => c?.start ?? 0).filter(s => s !== undefined));
307
+ const end = Math.max(...conflictingChanges.map(c => c?.end ?? 0).filter(e => e !== undefined));
308
+ const firstChange = conflictingChanges[0];
309
+ conflicts.push({
310
+ id: `c${++conflictId}`,
311
+ start,
312
+ end,
313
+ original: firstChange?.oldText || '',
314
+ changes: conflictingChanges.filter((c) => c !== undefined),
315
+ resolved: null,
316
+ });
317
+ usedIndices.add(i);
318
+ }
319
+ else {
320
+ // No conflict
321
+ nonConflicting.push(change);
322
+ usedIndices.add(i);
323
+ }
324
+ }
325
+ // Deduplicate identical non-conflicting changes
326
+ const seen = new Map();
327
+ const dedupedNonConflicting = [];
328
+ for (const change of nonConflicting) {
329
+ const key = `${change.start}:${change.end}:${change.type}:${change.newText}`;
330
+ if (!seen.has(key)) {
331
+ seen.set(key, true);
332
+ dedupedNonConflicting.push(change);
333
+ }
334
+ }
335
+ return { conflicts, nonConflicting: dedupedNonConflicting };
336
+ }
337
+ /**
338
+ * Apply non-conflicting changes to text
339
+ * @param originalText
340
+ * @param changes - Must be sorted by position
341
+ */
342
+ export function applyChanges(originalText, changes) {
343
+ // Sort by position descending to apply from end to start
344
+ const sorted = [...changes].sort((a, b) => b.start - a.start);
345
+ let result = originalText;
346
+ for (const change of sorted) {
347
+ if (change.type === 'insert') {
348
+ result = result.slice(0, change.start) + change.newText + result.slice(change.start);
349
+ }
350
+ else if (change.type === 'delete') {
351
+ result = result.slice(0, change.start) + result.slice(change.end);
352
+ }
353
+ else if (change.type === 'replace') {
354
+ result = result.slice(0, change.start) + change.newText + result.slice(change.end);
355
+ }
356
+ }
357
+ return result;
358
+ }
359
+ /**
360
+ * Apply changes as CriticMarkup annotations
361
+ */
362
+ export function applyChangesAsAnnotations(originalText, changes) {
363
+ const sorted = [...changes].sort((a, b) => b.start - a.start);
364
+ let result = originalText;
365
+ for (const change of sorted) {
366
+ if (change.type === 'insert') {
367
+ const annotation = `{++${change.newText}++}`;
368
+ result = result.slice(0, change.start) + annotation + result.slice(change.start);
369
+ }
370
+ else if (change.type === 'delete') {
371
+ const annotation = `{--${change.oldText}--}`;
372
+ result = result.slice(0, change.start) + annotation + result.slice(change.end);
373
+ }
374
+ else if (change.type === 'replace') {
375
+ const annotation = `{~~${change.oldText}~>${change.newText}~~}`;
376
+ result = result.slice(0, change.start) + annotation + result.slice(change.end);
377
+ }
378
+ }
379
+ return result;
380
+ }
381
+ /**
382
+ * Apply changes as git-style conflict markers
383
+ */
384
+ export function applyConflictMarkers(originalText, conflicts) {
385
+ // Sort by position descending
386
+ const sorted = [...conflicts].sort((a, b) => b.start - a.start);
387
+ let result = originalText;
388
+ for (const conflict of sorted) {
389
+ const markers = [];
390
+ markers.push(`<<<<<<< CONFLICT ${conflict.id}`);
391
+ for (const change of conflict.changes) {
392
+ markers.push(`======= ${change.reviewer}`);
393
+ if (change.type === 'delete') {
394
+ markers.push(`[DELETED: "${change.oldText}"]`);
395
+ }
396
+ else if (change.type === 'insert') {
397
+ markers.push(change.newText);
398
+ }
399
+ else {
400
+ markers.push(change.newText);
401
+ }
402
+ }
403
+ markers.push(`>>>>>>> END ${conflict.id}`);
404
+ const markerText = markers.join('\n');
405
+ result = result.slice(0, conflict.start) + markerText + result.slice(conflict.end);
406
+ }
407
+ return result;
408
+ }
409
+ /**
410
+ * Format a conflict for display
411
+ */
412
+ export function formatConflict(conflict, originalText) {
413
+ const lines = [];
414
+ const context = 50;
415
+ // Show context
416
+ const beforeStart = Math.max(0, conflict.start - context);
417
+ const afterEnd = Math.min(originalText.length, conflict.end + context);
418
+ const before = originalText.slice(beforeStart, conflict.start).trim();
419
+ const original = originalText.slice(conflict.start, conflict.end);
420
+ const after = originalText.slice(conflict.end, afterEnd).trim();
421
+ if (before) {
422
+ lines.push(` ...${before}`);
423
+ }
424
+ lines.push(` [ORIGINAL]: "${original || '(insertion point)'}"`);
425
+ if (after) {
426
+ lines.push(` ${after}...`);
427
+ }
428
+ lines.push('');
429
+ lines.push(' Options:');
430
+ conflict.changes.forEach((change, i) => {
431
+ const label = change.type === 'insert'
432
+ ? `Insert: "${change.newText.slice(0, 60)}${change.newText.length > 60 ? '...' : ''}"`
433
+ : change.type === 'delete'
434
+ ? `Delete: "${change.oldText.slice(0, 60)}${change.oldText.length > 60 ? '...' : ''}"`
435
+ : `Replace → "${change.newText.slice(0, 60)}${change.newText.length > 60 ? '...' : ''}"`;
436
+ lines.push(` ${i + 1}. [${change.reviewer}] ${label}`);
437
+ });
438
+ return lines.join('\n');
439
+ }
440
+ /**
441
+ * Save conflicts to file for later resolution
442
+ */
443
+ export function saveConflicts(projectDir, conflicts, baseDoc) {
444
+ const conflictsPath = path.join(projectDir, CONFLICTS_FILE);
445
+ const data = {
446
+ base: baseDoc,
447
+ merged: new Date().toISOString(),
448
+ conflicts,
449
+ };
450
+ // Ensure directory exists
451
+ const dir = path.dirname(conflictsPath);
452
+ if (!fs.existsSync(dir)) {
453
+ fs.mkdirSync(dir, { recursive: true });
454
+ }
455
+ fs.writeFileSync(conflictsPath, JSON.stringify(data, null, 2));
456
+ }
457
+ /**
458
+ * Load conflicts from file
459
+ */
460
+ export function loadConflicts(projectDir) {
461
+ const conflictsPath = path.join(projectDir, CONFLICTS_FILE);
462
+ if (!fs.existsSync(conflictsPath)) {
463
+ return null;
464
+ }
465
+ return JSON.parse(fs.readFileSync(conflictsPath, 'utf-8'));
466
+ }
467
+ /**
468
+ * Clear conflicts file after resolution
469
+ */
470
+ export function clearConflicts(projectDir) {
471
+ const conflictsPath = path.join(projectDir, CONFLICTS_FILE);
472
+ if (fs.existsSync(conflictsPath)) {
473
+ fs.unlinkSync(conflictsPath);
474
+ }
475
+ }
476
+ /**
477
+ * Merge multiple Word documents using three-way merge
478
+ */
479
+ export async function mergeThreeWay(basePath, reviewerDocs, options = {}) {
480
+ const { diffLevel = 'sentence' } = options;
481
+ if (!fs.existsSync(basePath)) {
482
+ throw new Error(`Base document not found: ${basePath}`);
483
+ }
484
+ // Extract text from base document
485
+ const { text: baseText } = await extractFromWord(basePath);
486
+ // Extract changes from each reviewer relative to base
487
+ const allChanges = [];
488
+ const allComments = [];
489
+ for (const doc of reviewerDocs) {
490
+ if (!fs.existsSync(doc.path)) {
491
+ throw new Error(`Reviewer file not found: ${doc.path}`);
492
+ }
493
+ const { text: wordText } = await extractFromWord(doc.path);
494
+ // Choose diff level
495
+ const changes = diffLevel === 'word'
496
+ ? extractChangesWordLevel(baseText, wordText, doc.name)
497
+ : extractChanges(baseText, wordText, doc.name);
498
+ allChanges.push(changes);
499
+ // Also extract comments
500
+ try {
501
+ const comments = await extractWordComments(doc.path);
502
+ allComments.push(...comments.map(c => ({ ...c, reviewer: doc.name })));
503
+ }
504
+ catch (e) {
505
+ if (process.env.DEBUG) {
506
+ const error = e;
507
+ console.warn(`merge: Failed to extract comments:`, error.message);
508
+ }
509
+ }
510
+ }
511
+ // Detect conflicts
512
+ const { conflicts, nonConflicting } = detectConflicts(allChanges);
513
+ // Apply non-conflicting changes as annotations
514
+ let merged = applyChangesAsAnnotations(baseText, nonConflicting);
515
+ // Add comments with reviewer attribution
516
+ for (const comment of allComments) {
517
+ merged += `\n{>>${comment.reviewer}: ${comment.text}<<}`;
518
+ }
519
+ const stats = {
520
+ reviewers: reviewerDocs.length,
521
+ totalChanges: allChanges.flat().length,
522
+ nonConflicting: nonConflicting.length,
523
+ conflicts: conflicts.length,
524
+ comments: allComments.length,
525
+ };
526
+ return { merged, conflicts, stats, baseText, originalText: baseText };
527
+ }
528
+ /**
529
+ * Merge multiple Word documents against an original markdown file
530
+ * Legacy function - use mergeThreeWay for proper three-way merge
531
+ */
532
+ export async function mergeReviewerDocs(originalPath, reviewerDocs, options = {}) {
533
+ const { autoResolve = false } = options;
534
+ if (!fs.existsSync(originalPath)) {
535
+ throw new Error(`Original file not found: ${originalPath}`);
536
+ }
537
+ const originalText = fs.readFileSync(originalPath, 'utf-8');
538
+ // Extract changes from each reviewer
539
+ const allChanges = [];
540
+ const allComments = [];
541
+ for (const doc of reviewerDocs) {
542
+ if (!fs.existsSync(doc.path)) {
543
+ throw new Error(`Reviewer file not found: ${doc.path}`);
544
+ }
545
+ const { text: wordText } = await extractFromWord(doc.path);
546
+ const changes = extractChanges(originalText, wordText, doc.name);
547
+ allChanges.push(changes);
548
+ // Also extract comments
549
+ try {
550
+ const comments = await extractWordComments(doc.path);
551
+ allComments.push(...comments.map(c => ({ ...c, reviewer: doc.name })));
552
+ }
553
+ catch (e) {
554
+ if (process.env.DEBUG) {
555
+ const error = e;
556
+ console.warn(`merge: Failed to extract comments:`, error.message);
557
+ }
558
+ }
559
+ }
560
+ // Detect conflicts
561
+ const { conflicts, nonConflicting } = detectConflicts(allChanges);
562
+ // Apply non-conflicting changes as annotations
563
+ let merged = applyChangesAsAnnotations(originalText, nonConflicting);
564
+ // Add comments
565
+ for (const comment of allComments) {
566
+ // Append comments at the end for now (position tracking is complex)
567
+ merged += `\n{>>${comment.reviewer}: ${comment.text}<<}`;
568
+ }
569
+ const stats = {
570
+ reviewers: reviewerDocs.length,
571
+ totalChanges: allChanges.flat().length,
572
+ nonConflicting: nonConflicting.length,
573
+ conflicts: conflicts.length,
574
+ comments: allComments.length,
575
+ };
576
+ return { merged, conflicts, stats, originalText };
577
+ }
578
+ /**
579
+ * Resolve a conflict by choosing one option
580
+ * @param conflict
581
+ * @param choice - Index of chosen change (0-based)
582
+ */
583
+ export function resolveConflict(conflict, choice) {
584
+ if (choice < 0 || choice >= conflict.changes.length) {
585
+ throw new Error(`Invalid choice: ${choice}. Must be 0-${conflict.changes.length - 1}`);
586
+ }
587
+ const selectedChange = conflict.changes[choice];
588
+ if (!selectedChange) {
589
+ throw new Error(`Invalid choice: ${choice}. Change not found`);
590
+ }
591
+ conflict.resolved = selectedChange.reviewer;
592
+ return selectedChange;
593
+ }
594
+ /**
595
+ * Get list of unresolved conflicts
596
+ */
597
+ export function getUnresolvedConflicts(projectDir) {
598
+ const data = loadConflicts(projectDir);
599
+ if (!data)
600
+ return [];
601
+ return data.conflicts.filter(c => c.resolved === null);
602
+ }
603
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../lib/merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * ORCID integration for author metadata
3
+ *
4
+ * Fetches author information from ORCID public API
5
+ */
6
+ export interface OrcidProfile {
7
+ orcid: string;
8
+ name: string;
9
+ affiliation: string;
10
+ email: string;
11
+ }
12
+ /**
13
+ * Validate ORCID format (0000-0000-0000-0000)
14
+ */
15
+ export declare function isValidOrcid(orcid: string): boolean;
16
+ /**
17
+ * Clean ORCID input (removes URLs, whitespace)
18
+ */
19
+ export declare function cleanOrcid(input: string): string;
20
+ /**
21
+ * Fetch author info from ORCID public API
22
+ */
23
+ export declare function fetchOrcidProfile(orcid: string): Promise<OrcidProfile>;
24
+ /**
25
+ * Fetch work count from ORCID
26
+ */
27
+ export declare function fetchOrcidWorkCount(orcid: string): Promise<number>;
28
+ /**
29
+ * Format author for YAML
30
+ */
31
+ export declare function formatAuthorYaml(profile: OrcidProfile): string;
32
+ /**
33
+ * Generate ORCID badge markdown
34
+ */
35
+ export declare function getOrcidBadge(orcid: string): string;
36
+ //# sourceMappingURL=orcid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orcid.d.ts","sourceRoot":"","sources":["../../lib/orcid.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUhD;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAuD5E;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBxE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAW9D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGnD"}