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,304 @@
1
+ /**
2
+ * Git integration utilities
3
+ * Compare sections against git history
4
+ */
5
+ import { execSync } from 'child_process';
6
+ import * as fs from 'fs';
7
+ import { diffWords } from 'diff';
8
+ /**
9
+ * Check if current directory is a git repository
10
+ */
11
+ export function isGitRepo() {
12
+ try {
13
+ execSync('git rev-parse --is-inside-work-tree', { stdio: 'pipe' });
14
+ return true;
15
+ }
16
+ catch {
17
+ return false;
18
+ }
19
+ }
20
+ /**
21
+ * Get the current git branch
22
+ */
23
+ export function getCurrentBranch() {
24
+ try {
25
+ return execSync('git rev-parse --abbrev-ref HEAD', { stdio: 'pipe' })
26
+ .toString()
27
+ .trim();
28
+ }
29
+ catch {
30
+ return null;
31
+ }
32
+ }
33
+ /**
34
+ * Get the default branch (main or master)
35
+ */
36
+ export function getDefaultBranch() {
37
+ try {
38
+ // Try to get the remote default branch
39
+ const remote = execSync('git remote show origin', { stdio: 'pipe' })
40
+ .toString();
41
+ const match = remote.match(/HEAD branch:\s*(\S+)/);
42
+ if (match?.[1])
43
+ return match[1];
44
+ }
45
+ catch {
46
+ // Fall through
47
+ }
48
+ // Check if main or master exists
49
+ try {
50
+ execSync('git rev-parse --verify main', { stdio: 'pipe' });
51
+ return 'main';
52
+ }
53
+ catch {
54
+ try {
55
+ execSync('git rev-parse --verify master', { stdio: 'pipe' });
56
+ return 'master';
57
+ }
58
+ catch {
59
+ return 'main'; // Default fallback
60
+ }
61
+ }
62
+ }
63
+ /**
64
+ * Get file content from a specific git ref
65
+ * @param filePath - Path to file
66
+ * @param ref - Git reference (branch, tag, commit)
67
+ */
68
+ export function getFileAtRef(filePath, ref) {
69
+ try {
70
+ return execSync(`git show ${ref}:${filePath}`, { stdio: 'pipe' }).toString();
71
+ }
72
+ catch {
73
+ return null; // File doesn't exist at that ref
74
+ }
75
+ }
76
+ /**
77
+ * Get list of changed files between refs
78
+ * @param fromRef - Starting reference
79
+ * @param toRef - Ending reference (default: HEAD)
80
+ */
81
+ export function getChangedFiles(fromRef, toRef = 'HEAD') {
82
+ try {
83
+ const output = execSync(`git diff --name-status ${fromRef}..${toRef}`, { stdio: 'pipe' })
84
+ .toString()
85
+ .trim();
86
+ if (!output)
87
+ return [];
88
+ return output.split('\n').map(line => {
89
+ const parts = line.split('\t');
90
+ const status = parts[0];
91
+ const file = parts[1] ?? '';
92
+ return {
93
+ file,
94
+ status: (status === 'A' ? 'added' : status === 'D' ? 'deleted' : 'modified'),
95
+ };
96
+ });
97
+ }
98
+ catch {
99
+ return [];
100
+ }
101
+ }
102
+ /**
103
+ * Get commit history for a file
104
+ * @param filePath - Path to file
105
+ * @param limit - Maximum number of commits to return
106
+ */
107
+ export function getFileHistory(filePath, limit = 10) {
108
+ try {
109
+ const output = execSync(`git log --format="%h|%ci|%s" -n ${limit} -- "${filePath}"`, { stdio: 'pipe' }).toString().trim();
110
+ if (!output)
111
+ return [];
112
+ return output.split('\n').map(line => {
113
+ const parts = line.split('|');
114
+ return {
115
+ hash: parts[0] ?? '',
116
+ date: parts[1] ?? '',
117
+ message: parts[2] ?? '',
118
+ author: ''
119
+ };
120
+ });
121
+ }
122
+ catch {
123
+ return [];
124
+ }
125
+ }
126
+ /**
127
+ * Compare file content between two refs
128
+ * @param filePath - Path to file
129
+ * @param fromRef - Starting reference
130
+ * @param toRef - Ending reference (default: HEAD)
131
+ */
132
+ export function compareFileVersions(filePath, fromRef, toRef = 'HEAD') {
133
+ const oldContent = getFileAtRef(filePath, fromRef) || '';
134
+ const newContent = toRef === 'HEAD'
135
+ ? fs.existsSync(filePath) ? fs.readFileSync(filePath, 'utf-8') : ''
136
+ : getFileAtRef(filePath, toRef) || '';
137
+ const diffs = diffWords(oldContent, newContent);
138
+ let added = 0;
139
+ let removed = 0;
140
+ const changes = [];
141
+ for (const part of diffs) {
142
+ if (part.added) {
143
+ added += part.value.split(/\s+/).filter(w => w).length;
144
+ changes.push({ added: true, value: part.value });
145
+ }
146
+ else if (part.removed) {
147
+ removed += part.value.split(/\s+/).filter(w => w).length;
148
+ changes.push({ removed: true, value: part.value });
149
+ }
150
+ }
151
+ return { added, removed, changes };
152
+ }
153
+ /**
154
+ * Get word count difference between refs
155
+ * @param files - Array of file paths
156
+ * @param fromRef - Starting reference
157
+ * @param toRef - Ending reference (default: HEAD)
158
+ */
159
+ export function getWordCountDiff(files, fromRef, toRef = 'HEAD') {
160
+ let totalAdded = 0;
161
+ let totalRemoved = 0;
162
+ const byFile = {};
163
+ for (const file of files) {
164
+ const { added, removed } = compareFileVersions(file, fromRef, toRef);
165
+ totalAdded += added;
166
+ totalRemoved += removed;
167
+ byFile[file] = { added, removed };
168
+ }
169
+ return {
170
+ total: { added: totalAdded, removed: totalRemoved },
171
+ byFile,
172
+ };
173
+ }
174
+ /**
175
+ * Get recent commits
176
+ * @param limit - Maximum number of commits to return
177
+ */
178
+ export function getRecentCommits(limit = 10) {
179
+ try {
180
+ const output = execSync(`git log --format="%h|%ci|%an|%s" -n ${limit}`, { stdio: 'pipe' }).toString().trim();
181
+ if (!output)
182
+ return [];
183
+ return output.split('\n').map(line => {
184
+ const parts = line.split('|');
185
+ return {
186
+ hash: parts[0] ?? '',
187
+ date: parts[1] ?? '',
188
+ author: parts[2] ?? '',
189
+ message: parts[3] ?? ''
190
+ };
191
+ });
192
+ }
193
+ catch {
194
+ return [];
195
+ }
196
+ }
197
+ /**
198
+ * Check if there are uncommitted changes
199
+ */
200
+ export function hasUncommittedChanges() {
201
+ try {
202
+ const output = execSync('git status --porcelain', { stdio: 'pipe' }).toString();
203
+ return output.trim().length > 0;
204
+ }
205
+ catch {
206
+ return false;
207
+ }
208
+ }
209
+ /**
210
+ * Get tags
211
+ */
212
+ export function getTags() {
213
+ try {
214
+ return execSync('git tag --sort=-creatordate', { stdio: 'pipe' })
215
+ .toString()
216
+ .trim()
217
+ .split('\n')
218
+ .filter(t => t);
219
+ }
220
+ catch {
221
+ return [];
222
+ }
223
+ }
224
+ /**
225
+ * Get blame information for a file
226
+ * Returns author and commit info for each line
227
+ * @param filePath - Path to file
228
+ */
229
+ export function getFileBlame(filePath) {
230
+ try {
231
+ const output = execSync(`git blame --line-porcelain "${filePath}"`, { stdio: 'pipe', maxBuffer: 10 * 1024 * 1024 }).toString();
232
+ const lines = output.split('\n');
233
+ const result = [];
234
+ let current = {};
235
+ let lineNumber = 0;
236
+ for (const line of lines) {
237
+ if (/^[0-9a-f]{40}/.test(line)) {
238
+ // New blame entry: hash original-line final-line [count]
239
+ const parts = line.split(' ');
240
+ current.hash = parts[0]?.slice(0, 7) ?? '';
241
+ lineNumber = parseInt(parts[2] ?? '0', 10);
242
+ }
243
+ else if (line.startsWith('author ')) {
244
+ current.author = line.slice(7);
245
+ }
246
+ else if (line.startsWith('author-time ')) {
247
+ const timestamp = parseInt(line.slice(12), 10);
248
+ current.date = new Date(timestamp * 1000).toISOString().slice(0, 10);
249
+ }
250
+ else if (line.startsWith('\t')) {
251
+ // Actual content line (prefixed with tab)
252
+ current.content = line.slice(1);
253
+ current.line = lineNumber;
254
+ result.push(current);
255
+ current = {};
256
+ }
257
+ }
258
+ return result;
259
+ }
260
+ catch {
261
+ return [];
262
+ }
263
+ }
264
+ /**
265
+ * Get author statistics for a file
266
+ * @param filePath - Path to file
267
+ */
268
+ export function getAuthorStats(filePath) {
269
+ const blame = getFileBlame(filePath);
270
+ if (blame.length === 0)
271
+ return {};
272
+ const counts = {};
273
+ for (const entry of blame) {
274
+ counts[entry.author] = (counts[entry.author] || 0) + 1;
275
+ }
276
+ const total = blame.length;
277
+ const stats = {};
278
+ for (const [author, lines] of Object.entries(counts)) {
279
+ stats[author] = {
280
+ lines,
281
+ percentage: Math.round((lines / total) * 100),
282
+ };
283
+ }
284
+ return stats;
285
+ }
286
+ /**
287
+ * Get contributors across multiple files
288
+ * @param files - Array of file paths
289
+ */
290
+ export function getContributors(files) {
291
+ const contributors = {};
292
+ for (const file of files) {
293
+ const stats = getAuthorStats(file);
294
+ for (const [author, data] of Object.entries(stats)) {
295
+ if (!contributors[author]) {
296
+ contributors[author] = { lines: 0, files: 0 };
297
+ }
298
+ contributors[author].lines += data.lines;
299
+ contributors[author].files += 1;
300
+ }
301
+ }
302
+ return contributors;
303
+ }
304
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../lib/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Grammar checker module with custom dictionary support
3
+ *
4
+ * Features:
5
+ * - Common grammar/style issues detection
6
+ * - Custom dictionary for project-specific terms
7
+ * - Learn mode to add words to dictionary
8
+ */
9
+ interface GrammarIssue {
10
+ rule: string;
11
+ message: string;
12
+ severity: 'error' | 'warning' | 'info';
13
+ line: number;
14
+ column: number;
15
+ match: string;
16
+ context: string;
17
+ }
18
+ interface GrammarSummary {
19
+ total: number;
20
+ errors: number;
21
+ warnings: number;
22
+ info: number;
23
+ byRule: Record<string, number>;
24
+ }
25
+ interface CheckGrammarOptions {
26
+ scientific?: boolean;
27
+ directory?: string;
28
+ }
29
+ /**
30
+ * Load custom dictionary from file
31
+ */
32
+ export declare function loadDictionary(directory?: string): Set<string>;
33
+ /**
34
+ * Save custom dictionary to file
35
+ */
36
+ export declare function saveDictionary(words: Set<string>, directory?: string): void;
37
+ /**
38
+ * Add word to custom dictionary
39
+ */
40
+ export declare function addToDictionary(word: string, directory?: string): boolean;
41
+ /**
42
+ * Remove word from custom dictionary
43
+ */
44
+ export declare function removeFromDictionary(word: string, directory?: string): boolean;
45
+ /**
46
+ * Check text for grammar/style issues
47
+ */
48
+ export declare function checkGrammar(text: string, options?: CheckGrammarOptions): GrammarIssue[];
49
+ /**
50
+ * Get grammar check summary
51
+ */
52
+ export declare function getGrammarSummary(issues: GrammarIssue[]): GrammarSummary;
53
+ /**
54
+ * List available grammar rules
55
+ */
56
+ export declare function listRules(scientific?: boolean): Array<{
57
+ id: string;
58
+ message: string;
59
+ severity: string;
60
+ }>;
61
+ export {};
62
+ //# sourceMappingURL=grammar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grammar.d.ts","sourceRoot":"","sources":["../../lib/grammar.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAgBH,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,UAAU,mBAAmB;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgGD;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,GAAE,MAAY,GAAG,GAAG,CAAC,MAAM,CAAC,CAiBnE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,SAAS,GAAE,MAAY,GAAG,IAAI,CAUhF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,GAAG,OAAO,CAW9E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,GAAG,OAAO,CAWnF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,YAAY,EAAE,CAuD5F;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,cAAc,CAkBxE;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,UAAU,GAAE,OAAc,GAAG,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAO9G"}
@@ -0,0 +1,244 @@
1
+ /**
2
+ * Grammar checker module with custom dictionary support
3
+ *
4
+ * Features:
5
+ * - Common grammar/style issues detection
6
+ * - Custom dictionary for project-specific terms
7
+ * - Learn mode to add words to dictionary
8
+ */
9
+ import * as fs from 'fs';
10
+ import * as path from 'path';
11
+ // Default dictionary location
12
+ const DEFAULT_DICT_NAME = '.rev-dictionary';
13
+ /**
14
+ * Common grammar/style rules
15
+ */
16
+ const GRAMMAR_RULES = [
17
+ {
18
+ id: 'passive-voice',
19
+ pattern: /\b(is|are|was|were|be|been|being)\s+(being\s+)?\w+ed\b/gi,
20
+ message: 'Possible passive voice',
21
+ severity: 'info',
22
+ },
23
+ {
24
+ id: 'weasel-words',
25
+ pattern: /\b(very|really|quite|extremely|fairly|rather|somewhat|just)\b/gi,
26
+ message: 'Weasel word - consider removing or being more specific',
27
+ severity: 'warning',
28
+ },
29
+ {
30
+ id: 'weak-start',
31
+ pattern: /^\s*(There (is|are|was|were)|It is)\b/gmi,
32
+ message: 'Weak sentence start - consider restructuring',
33
+ severity: 'info',
34
+ },
35
+ {
36
+ id: 'duplicate-words',
37
+ pattern: /\b(\w+)\s+\1\b/gi,
38
+ message: 'Duplicate word',
39
+ severity: 'error',
40
+ },
41
+ {
42
+ id: 'split-infinitive',
43
+ pattern: /\bto\s+(\w+ly)\s+\w+\b/gi,
44
+ message: 'Split infinitive',
45
+ severity: 'info',
46
+ },
47
+ {
48
+ id: 'sentence-length',
49
+ pattern: /[^.!?]*[.!?]/g,
50
+ check: (match) => {
51
+ const words = match.trim().split(/\s+/).length;
52
+ return words > 40;
53
+ },
54
+ message: 'Long sentence (>40 words) - consider breaking up',
55
+ severity: 'warning',
56
+ },
57
+ {
58
+ id: 'cliches',
59
+ pattern: /\b(at the end of the day|in terms of|it goes without saying|needless to say|as a matter of fact|first and foremost|last but not least)\b/gi,
60
+ message: 'Cliche - consider rephrasing',
61
+ severity: 'warning',
62
+ },
63
+ {
64
+ id: 'hedging',
65
+ pattern: /\b(seems to|appears to|tends to|might|may|could possibly|would seem)\b/gi,
66
+ message: 'Hedging language - be more direct if appropriate',
67
+ severity: 'info',
68
+ },
69
+ {
70
+ id: 'redundancy',
71
+ pattern: /\b(basic fundamentals|end result|free gift|future plans|past history|completely unique|absolutely essential|close proximity|each and every|first began|true fact|advance planning|final outcome)\b/gi,
72
+ message: 'Redundant phrase',
73
+ severity: 'warning',
74
+ },
75
+ ];
76
+ /**
77
+ * Scientific writing specific rules
78
+ */
79
+ const SCIENTIFIC_RULES = [
80
+ {
81
+ id: 'first-person',
82
+ pattern: /\b(I|we|my|our)\b/gi,
83
+ message: 'First person pronoun - check if appropriate for your journal',
84
+ severity: 'info',
85
+ },
86
+ {
87
+ id: 'significant',
88
+ pattern: /\bsignificant(ly)?\b(?!\s+(P|p|α|difference|effect|increase|decrease|correlation))/gi,
89
+ message: '"Significant" without statistical context - clarify or use different word',
90
+ severity: 'warning',
91
+ },
92
+ {
93
+ id: 'prove',
94
+ pattern: /\b(prove[ds]?|proof)\b/gi,
95
+ message: 'Avoid "prove" in science - use "demonstrate", "show", "suggest"',
96
+ severity: 'warning',
97
+ },
98
+ {
99
+ id: 'obviously',
100
+ pattern: /\b(obviously|clearly|of course)\b/gi,
101
+ message: 'If obvious, no need to say so; if not obvious, this doesn\'t help',
102
+ severity: 'warning',
103
+ },
104
+ ];
105
+ /**
106
+ * Load custom dictionary from file
107
+ */
108
+ export function loadDictionary(directory = '.') {
109
+ const dictPath = path.join(directory, DEFAULT_DICT_NAME);
110
+ const words = new Set();
111
+ if (fs.existsSync(dictPath)) {
112
+ const content = fs.readFileSync(dictPath, 'utf-8');
113
+ const lines = content.split('\n');
114
+ for (const line of lines) {
115
+ const word = line.trim().toLowerCase();
116
+ if (word && !word.startsWith('#')) {
117
+ words.add(word);
118
+ }
119
+ }
120
+ }
121
+ return words;
122
+ }
123
+ /**
124
+ * Save custom dictionary to file
125
+ */
126
+ export function saveDictionary(words, directory = '.') {
127
+ const dictPath = path.join(directory, DEFAULT_DICT_NAME);
128
+ const header = `# Custom dictionary for docrev
129
+ # Add one word per line
130
+ # Lines starting with # are comments
131
+ `;
132
+ const content = header + [...words].sort().join('\n') + '\n';
133
+ fs.writeFileSync(dictPath, content, 'utf-8');
134
+ }
135
+ /**
136
+ * Add word to custom dictionary
137
+ */
138
+ export function addToDictionary(word, directory = '.') {
139
+ const words = loadDictionary(directory);
140
+ const normalizedWord = word.trim().toLowerCase();
141
+ if (words.has(normalizedWord)) {
142
+ return false;
143
+ }
144
+ words.add(normalizedWord);
145
+ saveDictionary(words, directory);
146
+ return true;
147
+ }
148
+ /**
149
+ * Remove word from custom dictionary
150
+ */
151
+ export function removeFromDictionary(word, directory = '.') {
152
+ const words = loadDictionary(directory);
153
+ const normalizedWord = word.trim().toLowerCase();
154
+ if (!words.has(normalizedWord)) {
155
+ return false;
156
+ }
157
+ words.delete(normalizedWord);
158
+ saveDictionary(words, directory);
159
+ return true;
160
+ }
161
+ /**
162
+ * Check text for grammar/style issues
163
+ */
164
+ export function checkGrammar(text, options = {}) {
165
+ const { scientific = true, directory = '.' } = options;
166
+ const customDict = loadDictionary(directory);
167
+ const issues = [];
168
+ // Get all rules
169
+ const rules = scientific ? [...GRAMMAR_RULES, ...SCIENTIFIC_RULES] : GRAMMAR_RULES;
170
+ // Split into lines for line number tracking
171
+ const lines = text.split('\n');
172
+ for (let lineNum = 0; lineNum < lines.length; lineNum++) {
173
+ const line = lines[lineNum];
174
+ if (!line)
175
+ continue;
176
+ // Skip code blocks and YAML frontmatter
177
+ if (line.trim().startsWith('```') || line.trim().startsWith('---')) {
178
+ continue;
179
+ }
180
+ // Skip lines that are just markdown syntax
181
+ if (/^[#\-*>|]/.test(line.trim()) && line.trim().length < 5) {
182
+ continue;
183
+ }
184
+ for (const rule of rules) {
185
+ const pattern = new RegExp(rule.pattern.source, rule.pattern.flags);
186
+ let match;
187
+ while ((match = pattern.exec(line)) !== null) {
188
+ // Check if rule has additional check function
189
+ if (rule.check && !rule.check(match[0])) {
190
+ continue;
191
+ }
192
+ // Skip if word is in custom dictionary
193
+ const word = match[0].toLowerCase();
194
+ if (customDict.has(word)) {
195
+ continue;
196
+ }
197
+ issues.push({
198
+ rule: rule.id,
199
+ message: rule.message,
200
+ severity: rule.severity,
201
+ line: lineNum + 1,
202
+ column: match.index + 1,
203
+ match: match[0],
204
+ context: line.trim(),
205
+ });
206
+ }
207
+ }
208
+ }
209
+ return issues;
210
+ }
211
+ /**
212
+ * Get grammar check summary
213
+ */
214
+ export function getGrammarSummary(issues) {
215
+ const summary = {
216
+ total: issues.length,
217
+ errors: 0,
218
+ warnings: 0,
219
+ info: 0,
220
+ byRule: {},
221
+ };
222
+ for (const issue of issues) {
223
+ if (issue.severity === 'error')
224
+ summary.errors++;
225
+ else if (issue.severity === 'warning')
226
+ summary.warnings++;
227
+ else
228
+ summary.info++;
229
+ summary.byRule[issue.rule] = (summary.byRule[issue.rule] || 0) + 1;
230
+ }
231
+ return summary;
232
+ }
233
+ /**
234
+ * List available grammar rules
235
+ */
236
+ export function listRules(scientific = true) {
237
+ const rules = scientific ? [...GRAMMAR_RULES, ...SCIENTIFIC_RULES] : GRAMMAR_RULES;
238
+ return rules.map(r => ({
239
+ id: r.id,
240
+ message: r.message,
241
+ severity: r.severity,
242
+ }));
243
+ }
244
+ //# sourceMappingURL=grammar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grammar.js","sourceRoot":"","sources":["../../lib/grammar.ts"],"names":[],"mappings":"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"}