docrev 0.8.1 → 0.9.0

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 (307) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/.gitattributes +1 -0
  3. package/PLAN-tables-and-postprocess.md +850 -0
  4. package/README.md +33 -0
  5. package/bin/rev.js +12 -131
  6. package/bin/rev.ts +145 -0
  7. package/dist/bin/rev.d.ts +9 -0
  8. package/dist/bin/rev.d.ts.map +1 -0
  9. package/dist/bin/rev.js +118 -0
  10. package/dist/bin/rev.js.map +1 -0
  11. package/dist/lib/annotations.d.ts +91 -0
  12. package/dist/lib/annotations.d.ts.map +1 -0
  13. package/dist/lib/annotations.js +554 -0
  14. package/dist/lib/annotations.js.map +1 -0
  15. package/dist/lib/build.d.ts +171 -0
  16. package/dist/lib/build.d.ts.map +1 -0
  17. package/dist/lib/build.js +755 -0
  18. package/dist/lib/build.js.map +1 -0
  19. package/dist/lib/citations.d.ts +34 -0
  20. package/dist/lib/citations.d.ts.map +1 -0
  21. package/dist/lib/citations.js +140 -0
  22. package/dist/lib/citations.js.map +1 -0
  23. package/dist/lib/commands/build.d.ts +13 -0
  24. package/dist/lib/commands/build.d.ts.map +1 -0
  25. package/dist/lib/commands/build.js +678 -0
  26. package/dist/lib/commands/build.js.map +1 -0
  27. package/dist/lib/commands/citations.d.ts +11 -0
  28. package/dist/lib/commands/citations.d.ts.map +1 -0
  29. package/dist/lib/commands/citations.js +428 -0
  30. package/dist/lib/commands/citations.js.map +1 -0
  31. package/dist/lib/commands/comments.d.ts +11 -0
  32. package/dist/lib/commands/comments.d.ts.map +1 -0
  33. package/dist/lib/commands/comments.js +883 -0
  34. package/dist/lib/commands/comments.js.map +1 -0
  35. package/dist/lib/commands/context.d.ts +35 -0
  36. package/dist/lib/commands/context.d.ts.map +1 -0
  37. package/dist/lib/commands/context.js +59 -0
  38. package/dist/lib/commands/context.js.map +1 -0
  39. package/dist/lib/commands/core.d.ts +11 -0
  40. package/dist/lib/commands/core.d.ts.map +1 -0
  41. package/dist/lib/commands/core.js +246 -0
  42. package/dist/lib/commands/core.js.map +1 -0
  43. package/dist/lib/commands/doi.d.ts +11 -0
  44. package/dist/lib/commands/doi.d.ts.map +1 -0
  45. package/dist/lib/commands/doi.js +373 -0
  46. package/dist/lib/commands/doi.js.map +1 -0
  47. package/dist/lib/commands/history.d.ts +11 -0
  48. package/dist/lib/commands/history.d.ts.map +1 -0
  49. package/dist/lib/commands/history.js +245 -0
  50. package/dist/lib/commands/history.js.map +1 -0
  51. package/dist/lib/commands/index.d.ts +28 -0
  52. package/dist/lib/commands/index.d.ts.map +1 -0
  53. package/dist/lib/commands/index.js +35 -0
  54. package/dist/lib/commands/index.js.map +1 -0
  55. package/dist/lib/commands/init.d.ts +11 -0
  56. package/dist/lib/commands/init.d.ts.map +1 -0
  57. package/dist/lib/commands/init.js +209 -0
  58. package/dist/lib/commands/init.js.map +1 -0
  59. package/dist/lib/commands/response.d.ts +11 -0
  60. package/dist/lib/commands/response.d.ts.map +1 -0
  61. package/dist/lib/commands/response.js +317 -0
  62. package/dist/lib/commands/response.js.map +1 -0
  63. package/dist/lib/commands/sections.d.ts +11 -0
  64. package/dist/lib/commands/sections.d.ts.map +1 -0
  65. package/dist/lib/commands/sections.js +1071 -0
  66. package/dist/lib/commands/sections.js.map +1 -0
  67. package/dist/lib/commands/utilities.d.ts +19 -0
  68. package/dist/lib/commands/utilities.d.ts.map +1 -0
  69. package/dist/lib/commands/utilities.js +2009 -0
  70. package/dist/lib/commands/utilities.js.map +1 -0
  71. package/dist/lib/comment-realign.d.ts +50 -0
  72. package/dist/lib/comment-realign.d.ts.map +1 -0
  73. package/dist/lib/comment-realign.js +372 -0
  74. package/dist/lib/comment-realign.js.map +1 -0
  75. package/dist/lib/config.d.ts +41 -0
  76. package/dist/lib/config.d.ts.map +1 -0
  77. package/dist/lib/config.js +76 -0
  78. package/dist/lib/config.js.map +1 -0
  79. package/dist/lib/crossref.d.ts +108 -0
  80. package/dist/lib/crossref.d.ts.map +1 -0
  81. package/dist/lib/crossref.js +597 -0
  82. package/dist/lib/crossref.js.map +1 -0
  83. package/dist/lib/dependencies.d.ts +30 -0
  84. package/dist/lib/dependencies.d.ts.map +1 -0
  85. package/dist/lib/dependencies.js +95 -0
  86. package/dist/lib/dependencies.js.map +1 -0
  87. package/dist/lib/doi-cache.d.ts +29 -0
  88. package/dist/lib/doi-cache.d.ts.map +1 -0
  89. package/dist/lib/doi-cache.js +104 -0
  90. package/dist/lib/doi-cache.js.map +1 -0
  91. package/dist/lib/doi.d.ts +65 -0
  92. package/dist/lib/doi.d.ts.map +1 -0
  93. package/dist/lib/doi.js +710 -0
  94. package/dist/lib/doi.js.map +1 -0
  95. package/dist/lib/equations.d.ts +61 -0
  96. package/dist/lib/equations.d.ts.map +1 -0
  97. package/dist/lib/equations.js +445 -0
  98. package/dist/lib/equations.js.map +1 -0
  99. package/dist/lib/errors.d.ts +60 -0
  100. package/dist/lib/errors.d.ts.map +1 -0
  101. package/dist/lib/errors.js +303 -0
  102. package/dist/lib/errors.js.map +1 -0
  103. package/dist/lib/format.d.ts +104 -0
  104. package/dist/lib/format.d.ts.map +1 -0
  105. package/dist/lib/format.js +416 -0
  106. package/dist/lib/format.js.map +1 -0
  107. package/dist/lib/git.d.ts +88 -0
  108. package/dist/lib/git.d.ts.map +1 -0
  109. package/dist/lib/git.js +304 -0
  110. package/dist/lib/git.js.map +1 -0
  111. package/dist/lib/grammar.d.ts +62 -0
  112. package/dist/lib/grammar.d.ts.map +1 -0
  113. package/dist/lib/grammar.js +244 -0
  114. package/dist/lib/grammar.js.map +1 -0
  115. package/dist/lib/image-registry.d.ts +68 -0
  116. package/dist/lib/image-registry.d.ts.map +1 -0
  117. package/dist/lib/image-registry.js +112 -0
  118. package/dist/lib/image-registry.js.map +1 -0
  119. package/dist/lib/import.d.ts +184 -0
  120. package/dist/lib/import.d.ts.map +1 -0
  121. package/dist/lib/import.js +1581 -0
  122. package/dist/lib/import.js.map +1 -0
  123. package/dist/lib/journals.d.ts +55 -0
  124. package/dist/lib/journals.d.ts.map +1 -0
  125. package/dist/lib/journals.js +417 -0
  126. package/dist/lib/journals.js.map +1 -0
  127. package/dist/lib/merge.d.ts +138 -0
  128. package/dist/lib/merge.d.ts.map +1 -0
  129. package/dist/lib/merge.js +603 -0
  130. package/dist/lib/merge.js.map +1 -0
  131. package/dist/lib/orcid.d.ts +36 -0
  132. package/dist/lib/orcid.d.ts.map +1 -0
  133. package/dist/lib/orcid.js +117 -0
  134. package/dist/lib/orcid.js.map +1 -0
  135. package/dist/lib/pdf-comments.d.ts +95 -0
  136. package/dist/lib/pdf-comments.d.ts.map +1 -0
  137. package/dist/lib/pdf-comments.js +192 -0
  138. package/dist/lib/pdf-comments.js.map +1 -0
  139. package/dist/lib/pdf-import.d.ts +118 -0
  140. package/dist/lib/pdf-import.d.ts.map +1 -0
  141. package/dist/lib/pdf-import.js +397 -0
  142. package/dist/lib/pdf-import.js.map +1 -0
  143. package/dist/lib/plugins.d.ts +76 -0
  144. package/dist/lib/plugins.d.ts.map +1 -0
  145. package/dist/lib/plugins.js +235 -0
  146. package/dist/lib/plugins.js.map +1 -0
  147. package/dist/lib/postprocess.d.ts +42 -0
  148. package/dist/lib/postprocess.d.ts.map +1 -0
  149. package/dist/lib/postprocess.js +138 -0
  150. package/dist/lib/postprocess.js.map +1 -0
  151. package/dist/lib/pptx-template.d.ts +59 -0
  152. package/dist/lib/pptx-template.d.ts.map +1 -0
  153. package/dist/lib/pptx-template.js +613 -0
  154. package/dist/lib/pptx-template.js.map +1 -0
  155. package/dist/lib/pptx-themes.d.ts +80 -0
  156. package/dist/lib/pptx-themes.d.ts.map +1 -0
  157. package/dist/lib/pptx-themes.js +818 -0
  158. package/dist/lib/pptx-themes.js.map +1 -0
  159. package/dist/lib/protect-restore.d.ts +137 -0
  160. package/dist/lib/protect-restore.d.ts.map +1 -0
  161. package/dist/lib/protect-restore.js +394 -0
  162. package/dist/lib/protect-restore.js.map +1 -0
  163. package/dist/lib/rate-limiter.d.ts +27 -0
  164. package/dist/lib/rate-limiter.d.ts.map +1 -0
  165. package/dist/lib/rate-limiter.js +79 -0
  166. package/dist/lib/rate-limiter.js.map +1 -0
  167. package/dist/lib/response.d.ts +41 -0
  168. package/dist/lib/response.d.ts.map +1 -0
  169. package/dist/lib/response.js +150 -0
  170. package/dist/lib/response.js.map +1 -0
  171. package/dist/lib/review.d.ts +35 -0
  172. package/dist/lib/review.d.ts.map +1 -0
  173. package/dist/lib/review.js +263 -0
  174. package/dist/lib/review.js.map +1 -0
  175. package/dist/lib/schema.d.ts +66 -0
  176. package/dist/lib/schema.d.ts.map +1 -0
  177. package/dist/lib/schema.js +339 -0
  178. package/dist/lib/schema.js.map +1 -0
  179. package/dist/lib/scientific-words.d.ts +6 -0
  180. package/dist/lib/scientific-words.d.ts.map +1 -0
  181. package/dist/lib/scientific-words.js +66 -0
  182. package/dist/lib/scientific-words.js.map +1 -0
  183. package/dist/lib/sections.d.ts +40 -0
  184. package/dist/lib/sections.d.ts.map +1 -0
  185. package/dist/lib/sections.js +288 -0
  186. package/dist/lib/sections.js.map +1 -0
  187. package/dist/lib/slides.d.ts +86 -0
  188. package/dist/lib/slides.d.ts.map +1 -0
  189. package/dist/lib/slides.js +676 -0
  190. package/dist/lib/slides.js.map +1 -0
  191. package/dist/lib/spelling.d.ts +76 -0
  192. package/dist/lib/spelling.d.ts.map +1 -0
  193. package/dist/lib/spelling.js +272 -0
  194. package/dist/lib/spelling.js.map +1 -0
  195. package/dist/lib/templates.d.ts +30 -0
  196. package/dist/lib/templates.d.ts.map +1 -0
  197. package/dist/lib/templates.js +504 -0
  198. package/dist/lib/templates.js.map +1 -0
  199. package/dist/lib/themes.d.ts +85 -0
  200. package/dist/lib/themes.d.ts.map +1 -0
  201. package/dist/lib/themes.js +652 -0
  202. package/dist/lib/themes.js.map +1 -0
  203. package/dist/lib/trackchanges.d.ts +51 -0
  204. package/dist/lib/trackchanges.d.ts.map +1 -0
  205. package/dist/lib/trackchanges.js +202 -0
  206. package/dist/lib/trackchanges.js.map +1 -0
  207. package/dist/lib/tui.d.ts +76 -0
  208. package/dist/lib/tui.d.ts.map +1 -0
  209. package/dist/lib/tui.js +377 -0
  210. package/dist/lib/tui.js.map +1 -0
  211. package/dist/lib/types.d.ts +447 -0
  212. package/dist/lib/types.d.ts.map +1 -0
  213. package/dist/lib/types.js +6 -0
  214. package/dist/lib/types.js.map +1 -0
  215. package/dist/lib/undo.d.ts +57 -0
  216. package/dist/lib/undo.d.ts.map +1 -0
  217. package/dist/lib/undo.js +185 -0
  218. package/dist/lib/undo.js.map +1 -0
  219. package/dist/lib/utils.d.ts +16 -0
  220. package/dist/lib/utils.d.ts.map +1 -0
  221. package/dist/lib/utils.js +40 -0
  222. package/dist/lib/utils.js.map +1 -0
  223. package/dist/lib/variables.d.ts +42 -0
  224. package/dist/lib/variables.d.ts.map +1 -0
  225. package/dist/lib/variables.js +141 -0
  226. package/dist/lib/variables.js.map +1 -0
  227. package/dist/lib/word.d.ts +80 -0
  228. package/dist/lib/word.d.ts.map +1 -0
  229. package/dist/lib/word.js +360 -0
  230. package/dist/lib/word.js.map +1 -0
  231. package/dist/lib/wordcomments.d.ts +51 -0
  232. package/dist/lib/wordcomments.d.ts.map +1 -0
  233. package/dist/lib/wordcomments.js +587 -0
  234. package/dist/lib/wordcomments.js.map +1 -0
  235. package/eslint.config.js +27 -0
  236. package/lib/annotations.ts +622 -0
  237. package/lib/apply-buildup-colors.py +88 -0
  238. package/lib/build.ts +1013 -0
  239. package/lib/{citations.js → citations.ts} +38 -27
  240. package/lib/commands/{build.js → build.ts} +80 -27
  241. package/lib/commands/{citations.js → citations.ts} +36 -18
  242. package/lib/commands/{comments.js → comments.ts} +187 -54
  243. package/lib/commands/{context.js → context.ts} +18 -8
  244. package/lib/commands/{core.js → core.ts} +34 -20
  245. package/lib/commands/{doi.js → doi.ts} +32 -16
  246. package/lib/commands/{history.js → history.ts} +25 -12
  247. package/lib/commands/{index.js → index.ts} +9 -5
  248. package/lib/commands/{init.js → init.ts} +20 -8
  249. package/lib/commands/{response.js → response.ts} +47 -20
  250. package/lib/commands/{sections.js → sections.ts} +273 -68
  251. package/lib/commands/{utilities.js → utilities.ts} +338 -158
  252. package/lib/{comment-realign.js → comment-realign.ts} +117 -45
  253. package/lib/config.ts +84 -0
  254. package/lib/{crossref.js → crossref.ts} +213 -138
  255. package/lib/dependencies.ts +106 -0
  256. package/lib/doi-cache.ts +115 -0
  257. package/lib/{doi.js → doi.ts} +115 -281
  258. package/lib/{equations.js → equations.ts} +60 -64
  259. package/lib/{errors.js → errors.ts} +56 -48
  260. package/lib/{format.js → format.ts} +137 -63
  261. package/lib/{git.js → git.ts} +66 -63
  262. package/lib/{grammar.js → grammar.ts} +45 -32
  263. package/lib/image-registry.ts +180 -0
  264. package/lib/import.ts +2060 -0
  265. package/lib/journals.ts +505 -0
  266. package/lib/{merge.js → merge.ts} +185 -135
  267. package/lib/{orcid.js → orcid.ts} +17 -22
  268. package/lib/{pdf-comments.js → pdf-comments.ts} +76 -18
  269. package/lib/{pdf-import.js → pdf-import.ts} +148 -70
  270. package/lib/{plugins.js → plugins.ts} +82 -39
  271. package/lib/postprocess.ts +188 -0
  272. package/lib/pptx-color-filter.lua +37 -0
  273. package/lib/pptx-template.ts +625 -0
  274. package/lib/pptx-themes/academic.pptx +0 -0
  275. package/lib/pptx-themes/corporate.pptx +0 -0
  276. package/lib/pptx-themes/dark.pptx +0 -0
  277. package/lib/pptx-themes/default.pptx +0 -0
  278. package/lib/pptx-themes/minimal.pptx +0 -0
  279. package/lib/pptx-themes/plant.pptx +0 -0
  280. package/lib/pptx-themes.ts +896 -0
  281. package/lib/protect-restore.ts +516 -0
  282. package/lib/rate-limiter.ts +94 -0
  283. package/lib/{response.js → response.ts} +36 -21
  284. package/lib/{review.js → review.ts} +53 -43
  285. package/lib/{schema.js → schema.ts} +70 -25
  286. package/lib/{sections.js → sections.ts} +71 -76
  287. package/lib/slides.ts +793 -0
  288. package/lib/{spelling.js → spelling.ts} +43 -59
  289. package/lib/{templates.js → templates.ts} +20 -17
  290. package/lib/themes.ts +742 -0
  291. package/lib/{trackchanges.js → trackchanges.ts} +52 -23
  292. package/lib/types.ts +509 -0
  293. package/lib/{undo.js → undo.ts} +75 -52
  294. package/lib/utils.ts +41 -0
  295. package/lib/{variables.js → variables.ts} +60 -54
  296. package/lib/word.ts +428 -0
  297. package/lib/{wordcomments.js → wordcomments.ts} +94 -40
  298. package/package.json +15 -5
  299. package/skill/REFERENCE.md +67 -0
  300. package/tsconfig.json +26 -0
  301. package/lib/annotations.js +0 -414
  302. package/lib/build.js +0 -639
  303. package/lib/config.js +0 -79
  304. package/lib/import.js +0 -1145
  305. package/lib/journals.js +0 -629
  306. package/lib/word.js +0 -225
  307. /package/lib/{scientific-words.js → scientific-words.ts} +0 -0
package/README.md CHANGED
@@ -215,6 +215,39 @@ Configure your name for comment replies:
215
215
  rev config user "Your Name"
216
216
  ```
217
217
 
218
+ ### Table Formatting
219
+
220
+ For PDF output, configure columns that should not wrap:
221
+
222
+ ```yaml
223
+ tables:
224
+ nowrap:
225
+ - Prior # column headers to keep on one line
226
+ - "$\\widehat{R}$"
227
+ ```
228
+
229
+ Distribution notation in nowrap columns is auto-converted to LaTeX math:
230
+ `Normal(0, 0.5)` → `$\mathcal{N}(0, 0.5)$`
231
+
232
+ ### Postprocess Scripts
233
+
234
+ Run custom scripts after output generation:
235
+
236
+ ```yaml
237
+ postprocess:
238
+ pdf: ./scripts/fix-tables.py # runs after PDF
239
+ docx: ./scripts/add-meta.js # runs after DOCX
240
+ all: ./scripts/notify.sh # runs after any format
241
+ ```
242
+
243
+ Scripts receive environment variables: `OUTPUT_FILE`, `OUTPUT_FORMAT`, `PROJECT_DIR`, `CONFIG_PATH`.
244
+
245
+ Use `--verbose` to see script output:
246
+
247
+ ```bash
248
+ rev build pdf --verbose
249
+ ```
250
+
218
251
  ## Annotation Syntax
219
252
 
220
253
  Track changes from Word appear as [CriticMarkup](http://criticmarkup.com/):
package/bin/rev.js CHANGED
@@ -1,138 +1,19 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- /**
4
- * rev - Revision workflow for Word Markdown round-trips
5
- *
6
- * Handles track changes and comments when collaborating on academic papers.
7
- * Preserves reviewer feedback through the Markdown editing workflow.
8
- */
3
+ // Wrapper to run the TypeScript entry point via tsx
4
+ // This allows `rev` command to work after npm link / npm install
9
5
 
10
- import { program } from 'commander';
11
- import chalk from 'chalk';
12
- import * as fs from 'fs';
6
+ import { spawnSync } from 'child_process';
7
+ import { fileURLToPath } from 'url';
8
+ import { dirname, join } from 'path';
13
9
 
14
- // Import refactored command modules
15
- import {
16
- registerAllCommands,
17
- setQuietMode,
18
- setJsonMode,
19
- } from '../lib/commands/index.js';
10
+ const __dirname = dirname(fileURLToPath(import.meta.url));
11
+ const tsEntry = join(__dirname, 'rev.ts');
20
12
 
21
- // Global flags
22
- let quietMode = false;
23
- let jsonMode = false;
24
-
25
- // Levenshtein distance for command suggestions
26
- function levenshtein(a, b) {
27
- const matrix = Array(b.length + 1).fill(null).map(() => Array(a.length + 1).fill(null));
28
- for (let i = 0; i <= a.length; i++) matrix[0][i] = i;
29
- for (let j = 0; j <= b.length; j++) matrix[j][0] = j;
30
- for (let j = 1; j <= b.length; j++) {
31
- for (let i = 1; i <= a.length; i++) {
32
- const cost = a[i - 1] === b[j - 1] ? 0 : 1;
33
- matrix[j][i] = Math.min(
34
- matrix[j][i - 1] + 1,
35
- matrix[j - 1][i] + 1,
36
- matrix[j - 1][i - 1] + cost
37
- );
38
- }
39
- }
40
- return matrix[b.length][a.length];
41
- }
42
-
43
- // Find similar commands for typo suggestions
44
- function suggestCommand(input, commands) {
45
- const suggestions = commands
46
- .map(cmd => ({ cmd, dist: levenshtein(input.toLowerCase(), cmd.toLowerCase()) }))
47
- .filter(({ dist }) => dist <= 3)
48
- .sort((a, b) => a.dist - b.dist)
49
- .slice(0, 3)
50
- .map(({ cmd }) => cmd);
51
- return suggestions;
52
- }
53
-
54
- // Read version from package.json
55
- const pkgPath = new URL('../package.json', import.meta.url);
56
- const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
57
-
58
- program
59
- .name('rev')
60
- .description('Revision workflow for Word ↔ Markdown round-trips')
61
- .version(`${pkg.version}\nNode ${process.version} | ${process.platform} ${process.arch}`, '-V, --version', 'Output version information')
62
- .configureOutput({
63
- outputError: (str, write) => write(chalk.red(str)),
64
- })
65
- .showHelpAfterError(chalk.dim('(use --help for usage information)'))
66
- .option('--no-color', 'Disable colored output')
67
- .option('-q, --quiet', 'Suppress non-essential output')
68
- .option('--json', 'Output in JSON format (for scripting)')
69
- .hook('preAction', (thisCommand) => {
70
- const opts = thisCommand.opts();
71
- if (opts.color === false) {
72
- chalk.level = 0;
73
- }
74
- if (opts.quiet) {
75
- quietMode = true;
76
- setQuietMode(true);
77
- }
78
- if (opts.json) {
79
- jsonMode = true;
80
- setJsonMode(true);
81
- chalk.level = 0; // Disable colors in JSON mode
82
- }
83
- });
84
-
85
- // Register all command modules
86
- // Commands organized by module:
87
- // core.js: review, strip, status
88
- // comments.js: comments, resolve, next, prev, first, last, todo, accept, reject, reply
89
- // init.js: init, new, config
90
- // sections.js: import, extract, split, sync, merge
91
- // build.js: refs, migrate, install, doctor, build
92
- // response.js: response, validate, profiles, anonymize
93
- // citations.js: citations, figures, equations, pdf-comments
94
- // doi.js: doi, orcid
95
- // history.js: diff, history, contributors
96
- // utilities.js: help, completions, word-count, stats, search, backup, archive,
97
- // export, preview, watch, lint, grammar, annotate, apply, comment,
98
- // clean, check, open, spelling, upgrade, batch, install-cli-skill
99
- registerAllCommands(program, pkg);
100
-
101
- // Get all command names for typo suggestions
102
- const allCommands = program.commands.map(cmd => cmd.name());
103
- const allAliases = program.commands.flatMap(cmd => cmd.aliases());
104
- const allCommandNames = [...allCommands, ...allAliases];
105
-
106
- // Handle unknown commands with suggestions
107
- program.on('command:*', (operands) => {
108
- const unknown = operands[0];
109
- console.error(chalk.red(`Unknown command: ${unknown}`));
110
-
111
- const suggestions = suggestCommand(unknown, allCommandNames);
112
- if (suggestions.length > 0) {
113
- console.error();
114
- console.error(chalk.yellow('Did you mean?'));
115
- for (const s of suggestions) {
116
- console.error(chalk.cyan(` rev ${s}`));
117
- }
118
- }
119
- console.error();
120
- console.error(chalk.dim('Run "rev help" for available commands.'));
121
- process.exit(1);
13
+ // Run tsx with the TypeScript entry point
14
+ const result = spawnSync('npx', ['tsx', tsEntry, ...process.argv.slice(2)], {
15
+ stdio: 'inherit',
16
+ shell: true
122
17
  });
123
18
 
124
- // Default to status when no command given
125
- const args = process.argv.slice(2);
126
- const globalOpts = ['--no-color', '-q', '--quiet', '--json', '-V', '--version', '-h', '--help'];
127
- const hasOnlyGlobalOpts = args.every(arg => globalOpts.includes(arg) || arg.startsWith('--no-') || arg.startsWith('-'));
128
- const hasCommand = args.some(arg => !arg.startsWith('-') && !globalOpts.includes(arg));
129
-
130
- if (args.length === 0 || (hasOnlyGlobalOpts && !hasCommand && !args.includes('-h') && !args.includes('--help') && !args.includes('-V') && !args.includes('--version'))) {
131
- // Insert 'status' after any global options
132
- const insertPos = process.argv.findIndex((arg, i) => i >= 2 && !arg.startsWith('-'));
133
- if (insertPos === -1) {
134
- process.argv.push('status');
135
- }
136
- }
137
-
138
- program.parse();
19
+ process.exit(result.status ?? 0);
package/bin/rev.ts ADDED
@@ -0,0 +1,145 @@
1
+ #!/usr/bin/env tsx
2
+
3
+ /**
4
+ * rev - Revision workflow for Word ↔ Markdown round-trips
5
+ *
6
+ * Handles track changes and comments when collaborating on academic papers.
7
+ * Preserves reviewer feedback through the Markdown editing workflow.
8
+ */
9
+
10
+ import { program, Command } from 'commander';
11
+ import chalk from 'chalk';
12
+ import * as fs from 'fs';
13
+
14
+ // Import refactored command modules
15
+ import {
16
+ registerAllCommands,
17
+ setQuietMode,
18
+ setJsonMode,
19
+ } from '../lib/commands/index.js';
20
+
21
+ // Global flags
22
+ let quietMode = false;
23
+ let jsonMode = false;
24
+
25
+ // Levenshtein distance for command suggestions
26
+ function levenshtein(a: string, b: string): number {
27
+ const matrix: number[][] = Array(b.length + 1).fill(null).map(() => Array(a.length + 1).fill(0));
28
+ for (let i = 0; i <= a.length; i++) matrix[0]![i] = i;
29
+ for (let j = 0; j <= b.length; j++) matrix[j]![0] = j;
30
+ for (let j = 1; j <= b.length; j++) {
31
+ for (let i = 1; i <= a.length; i++) {
32
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
33
+ matrix[j]![i] = Math.min(
34
+ matrix[j]![i - 1]! + 1,
35
+ matrix[j - 1]![i]! + 1,
36
+ matrix[j - 1]![i - 1]! + cost
37
+ );
38
+ }
39
+ }
40
+ return matrix[b.length]![a.length]!;
41
+ }
42
+
43
+ // Find similar commands for typo suggestions
44
+ function suggestCommand(input: string, commands: string[]): string[] {
45
+ const suggestions = commands
46
+ .map(cmd => ({ cmd, dist: levenshtein(input.toLowerCase(), cmd.toLowerCase()) }))
47
+ .filter(({ dist }) => dist <= 3)
48
+ .sort((a, b) => a.dist - b.dist)
49
+ .slice(0, 3)
50
+ .map(({ cmd }) => cmd);
51
+ return suggestions;
52
+ }
53
+
54
+ interface PackageJson {
55
+ version: string;
56
+ name?: string;
57
+ description?: string;
58
+ [key: string]: unknown;
59
+ }
60
+
61
+ // Read version from package.json
62
+ const pkgPath = new URL('../package.json', import.meta.url);
63
+ const pkg: PackageJson = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
64
+
65
+ program
66
+ .name('rev')
67
+ .description('Revision workflow for Word ↔ Markdown round-trips')
68
+ .version(`${pkg.version}\nNode ${process.version} | ${process.platform} ${process.arch}`, '-V, --version', 'Output version information')
69
+ .configureOutput({
70
+ outputError: (str: string, write: (str: string) => void) => write(chalk.red(str)),
71
+ })
72
+ .showHelpAfterError(chalk.dim('(use --help for usage information)'))
73
+ .option('--no-color', 'Disable colored output')
74
+ .option('-q, --quiet', 'Suppress non-essential output')
75
+ .option('--json', 'Output in JSON format (for scripting)')
76
+ .hook('preAction', (thisCommand: Command) => {
77
+ const opts = thisCommand.opts<{ color?: boolean; quiet?: boolean; json?: boolean }>();
78
+ if (opts.color === false) {
79
+ chalk.level = 0;
80
+ }
81
+ if (opts.quiet) {
82
+ quietMode = true;
83
+ setQuietMode(true);
84
+ }
85
+ if (opts.json) {
86
+ jsonMode = true;
87
+ setJsonMode(true);
88
+ chalk.level = 0; // Disable colors in JSON mode
89
+ }
90
+ });
91
+
92
+ // Register all command modules
93
+ // Commands organized by module:
94
+ // core.js: review, strip, status
95
+ // comments.js: comments, resolve, next, prev, first, last, todo, accept, reject, reply
96
+ // init.js: init, new, config
97
+ // sections.js: import, extract, split, sync, merge
98
+ // build.js: refs, migrate, install, doctor, build
99
+ // response.js: response, validate, profiles, anonymize
100
+ // citations.js: citations, figures, equations, pdf-comments
101
+ // doi.js: doi, orcid
102
+ // history.js: diff, history, contributors
103
+ // utilities.js: help, completions, word-count, stats, search, backup, archive,
104
+ // export, preview, watch, lint, grammar, annotate, apply, comment,
105
+ // clean, check, open, spelling, upgrade, batch, install-cli-skill
106
+ registerAllCommands(program, pkg);
107
+
108
+ // Get all command names for typo suggestions
109
+ const allCommands = program.commands.map(cmd => cmd.name());
110
+ const allAliases = program.commands.flatMap(cmd => cmd.aliases());
111
+ const allCommandNames = [...allCommands, ...allAliases];
112
+
113
+ // Handle unknown commands with suggestions
114
+ program.on('command:*', (operands: string[]) => {
115
+ const unknown = operands[0];
116
+ console.error(chalk.red(`Unknown command: ${unknown}`));
117
+
118
+ const suggestions = suggestCommand(unknown!, allCommandNames);
119
+ if (suggestions.length > 0) {
120
+ console.error();
121
+ console.error(chalk.yellow('Did you mean?'));
122
+ for (const s of suggestions) {
123
+ console.error(chalk.cyan(` rev ${s}`));
124
+ }
125
+ }
126
+ console.error();
127
+ console.error(chalk.dim('Run "rev help" for available commands.'));
128
+ process.exit(1);
129
+ });
130
+
131
+ // Default to status when no command given
132
+ const args = process.argv.slice(2);
133
+ const globalOpts = ['--no-color', '-q', '--quiet', '--json', '-V', '--version', '-h', '--help'];
134
+ const hasOnlyGlobalOpts = args.every(arg => globalOpts.includes(arg) || arg.startsWith('--no-') || arg.startsWith('-'));
135
+ const hasCommand = args.some(arg => !arg.startsWith('-') && !globalOpts.includes(arg));
136
+
137
+ if (args.length === 0 || (hasOnlyGlobalOpts && !hasCommand && !args.includes('-h') && !args.includes('--help') && !args.includes('-V') && !args.includes('--version'))) {
138
+ // Insert 'status' after any global options
139
+ const insertPos = process.argv.findIndex((arg, i) => i >= 2 && !arg.startsWith('-'));
140
+ if (insertPos === -1) {
141
+ process.argv.push('status');
142
+ }
143
+ }
144
+
145
+ program.parse();
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * rev - Revision workflow for Word ↔ Markdown round-trips
4
+ *
5
+ * Handles track changes and comments when collaborating on academic papers.
6
+ * Preserves reviewer feedback through the Markdown editing workflow.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=rev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rev.d.ts","sourceRoot":"","sources":["../../bin/rev.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
@@ -0,0 +1,118 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * rev - Revision workflow for Word ↔ Markdown round-trips
4
+ *
5
+ * Handles track changes and comments when collaborating on academic papers.
6
+ * Preserves reviewer feedback through the Markdown editing workflow.
7
+ */
8
+ import { program } from 'commander';
9
+ import chalk from 'chalk';
10
+ import * as fs from 'fs';
11
+ // Import refactored command modules
12
+ import { registerAllCommands, setQuietMode, setJsonMode, } from '../lib/commands/index.js';
13
+ // Global flags
14
+ let quietMode = false;
15
+ let jsonMode = false;
16
+ // Levenshtein distance for command suggestions
17
+ function levenshtein(a, b) {
18
+ const matrix = Array(b.length + 1).fill(null).map(() => Array(a.length + 1).fill(0));
19
+ for (let i = 0; i <= a.length; i++)
20
+ matrix[0][i] = i;
21
+ for (let j = 0; j <= b.length; j++)
22
+ matrix[j][0] = j;
23
+ for (let j = 1; j <= b.length; j++) {
24
+ for (let i = 1; i <= a.length; i++) {
25
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
26
+ matrix[j][i] = Math.min(matrix[j][i - 1] + 1, matrix[j - 1][i] + 1, matrix[j - 1][i - 1] + cost);
27
+ }
28
+ }
29
+ return matrix[b.length][a.length];
30
+ }
31
+ // Find similar commands for typo suggestions
32
+ function suggestCommand(input, commands) {
33
+ const suggestions = commands
34
+ .map(cmd => ({ cmd, dist: levenshtein(input.toLowerCase(), cmd.toLowerCase()) }))
35
+ .filter(({ dist }) => dist <= 3)
36
+ .sort((a, b) => a.dist - b.dist)
37
+ .slice(0, 3)
38
+ .map(({ cmd }) => cmd);
39
+ return suggestions;
40
+ }
41
+ // Read version from package.json
42
+ const pkgPath = new URL('../package.json', import.meta.url);
43
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
44
+ program
45
+ .name('rev')
46
+ .description('Revision workflow for Word ↔ Markdown round-trips')
47
+ .version(`${pkg.version}\nNode ${process.version} | ${process.platform} ${process.arch}`, '-V, --version', 'Output version information')
48
+ .configureOutput({
49
+ outputError: (str, write) => write(chalk.red(str)),
50
+ })
51
+ .showHelpAfterError(chalk.dim('(use --help for usage information)'))
52
+ .option('--no-color', 'Disable colored output')
53
+ .option('-q, --quiet', 'Suppress non-essential output')
54
+ .option('--json', 'Output in JSON format (for scripting)')
55
+ .hook('preAction', (thisCommand) => {
56
+ const opts = thisCommand.opts();
57
+ if (opts.color === false) {
58
+ chalk.level = 0;
59
+ }
60
+ if (opts.quiet) {
61
+ quietMode = true;
62
+ setQuietMode(true);
63
+ }
64
+ if (opts.json) {
65
+ jsonMode = true;
66
+ setJsonMode(true);
67
+ chalk.level = 0; // Disable colors in JSON mode
68
+ }
69
+ });
70
+ // Register all command modules
71
+ // Commands organized by module:
72
+ // core.js: review, strip, status
73
+ // comments.js: comments, resolve, next, prev, first, last, todo, accept, reject, reply
74
+ // init.js: init, new, config
75
+ // sections.js: import, extract, split, sync, merge
76
+ // build.js: refs, migrate, install, doctor, build
77
+ // response.js: response, validate, profiles, anonymize
78
+ // citations.js: citations, figures, equations, pdf-comments
79
+ // doi.js: doi, orcid
80
+ // history.js: diff, history, contributors
81
+ // utilities.js: help, completions, word-count, stats, search, backup, archive,
82
+ // export, preview, watch, lint, grammar, annotate, apply, comment,
83
+ // clean, check, open, spelling, upgrade, batch, install-cli-skill
84
+ registerAllCommands(program, pkg);
85
+ // Get all command names for typo suggestions
86
+ const allCommands = program.commands.map(cmd => cmd.name());
87
+ const allAliases = program.commands.flatMap(cmd => cmd.aliases());
88
+ const allCommandNames = [...allCommands, ...allAliases];
89
+ // Handle unknown commands with suggestions
90
+ program.on('command:*', (operands) => {
91
+ const unknown = operands[0];
92
+ console.error(chalk.red(`Unknown command: ${unknown}`));
93
+ const suggestions = suggestCommand(unknown, allCommandNames);
94
+ if (suggestions.length > 0) {
95
+ console.error();
96
+ console.error(chalk.yellow('Did you mean?'));
97
+ for (const s of suggestions) {
98
+ console.error(chalk.cyan(` rev ${s}`));
99
+ }
100
+ }
101
+ console.error();
102
+ console.error(chalk.dim('Run "rev help" for available commands.'));
103
+ process.exit(1);
104
+ });
105
+ // Default to status when no command given
106
+ const args = process.argv.slice(2);
107
+ const globalOpts = ['--no-color', '-q', '--quiet', '--json', '-V', '--version', '-h', '--help'];
108
+ const hasOnlyGlobalOpts = args.every(arg => globalOpts.includes(arg) || arg.startsWith('--no-') || arg.startsWith('-'));
109
+ const hasCommand = args.some(arg => !arg.startsWith('-') && !globalOpts.includes(arg));
110
+ if (args.length === 0 || (hasOnlyGlobalOpts && !hasCommand && !args.includes('-h') && !args.includes('--help') && !args.includes('-V') && !args.includes('--version'))) {
111
+ // Insert 'status' after any global options
112
+ const insertPos = process.argv.findIndex((arg, i) => i >= 2 && !arg.startsWith('-'));
113
+ if (insertPos === -1) {
114
+ process.argv.push('status');
115
+ }
116
+ }
117
+ program.parse();
118
+ //# sourceMappingURL=rev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rev.js","sourceRoot":"","sources":["../../bin/rev.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * CriticMarkup annotation parsing and manipulation
3
+ *
4
+ * Syntax:
5
+ * {++inserted text++} - Insertions
6
+ * {--deleted text--} - Deletions
7
+ * {~~old~>new~~} - Substitutions
8
+ * {>>Author: comment<<} - Comments
9
+ * {==text==} - Highlights
10
+ */
11
+ import type { Annotation, AnnotationCounts, StripOptions, CommentFilterOptions } from './types.js';
12
+ /**
13
+ * Parse all annotations from text
14
+ * @param text - Markdown text containing CriticMarkup annotations
15
+ * @returns Array of parsed annotations sorted by position
16
+ * @throws TypeError If text is not a string
17
+ */
18
+ export declare function parseAnnotations(text: string): Annotation[];
19
+ /**
20
+ * Strip annotations from text, applying changes
21
+ * Handles nested annotations by iterating until stable
22
+ * @param text - Markdown text with CriticMarkup annotations
23
+ * @param options - Strip options
24
+ * @returns Clean text with annotations applied/removed
25
+ * @throws TypeError If text is not a string
26
+ */
27
+ export declare function stripAnnotations(text: string, options?: StripOptions): string;
28
+ /**
29
+ * Collapse multiple spaces to single space, preserving table formatting
30
+ * Useful for cleaning up messy Word imports
31
+ * @param text - Text to normalize
32
+ * @returns Text with multiple spaces collapsed to single spaces
33
+ * @throws TypeError If text is not a string
34
+ */
35
+ export declare function stripToSingleSpace(text: string): string;
36
+ /**
37
+ * Check if text contains any CriticMarkup annotations
38
+ * @param text - Text to check
39
+ * @returns True if text contains any annotations
40
+ * @throws TypeError If text is not a string
41
+ */
42
+ export declare function hasAnnotations(text: string): boolean;
43
+ /**
44
+ * Apply a decision to a single annotation (accept or reject)
45
+ * @param text - Document text containing the annotation
46
+ * @param annotation - Annotation object from parseAnnotations()
47
+ * @param accept - True to accept the change, false to reject
48
+ * @returns Updated text with the decision applied
49
+ * @throws TypeError If text is not a string or annotation is invalid
50
+ */
51
+ export declare function applyDecision(text: string, annotation: Annotation, accept: boolean): string;
52
+ /**
53
+ * Get track changes only (no comments)
54
+ * @param text - Markdown text with CriticMarkup annotations
55
+ * @returns Array of insert/delete/substitute annotations
56
+ * @throws TypeError If text is not a string
57
+ */
58
+ export declare function getTrackChanges(text: string): Annotation[];
59
+ /**
60
+ * Get comments only
61
+ * @param text - Markdown text with CriticMarkup annotations
62
+ * @param options - Filter options
63
+ * @returns Array of comment annotations
64
+ * @throws TypeError If text is not a string
65
+ */
66
+ export declare function getComments(text: string, options?: CommentFilterOptions): Annotation[];
67
+ /**
68
+ * Mark a comment as resolved or pending
69
+ * @param text - Document text containing the comment
70
+ * @param comment - Comment annotation object from getComments()
71
+ * @param resolved - True to mark resolved, false to mark pending
72
+ * @returns Updated text with status marker applied
73
+ * @throws TypeError If text is not a string or comment is invalid
74
+ */
75
+ export declare function setCommentStatus(text: string, comment: Annotation, resolved: boolean): string;
76
+ /**
77
+ * Count annotations by type
78
+ * @param text - Markdown text with CriticMarkup annotations
79
+ * @returns Counts by annotation type
80
+ * @throws TypeError If text is not a string
81
+ */
82
+ export declare function countAnnotations(text: string): AnnotationCounts;
83
+ /**
84
+ * Clean up orphaned/malformed CriticMarkup markers
85
+ * This can happen when track changes span across comment boundaries
86
+ * @param text - Document text with potentially malformed markers
87
+ * @returns Cleaned text with orphaned markers removed
88
+ * @throws TypeError If text is not a string
89
+ */
90
+ export declare function cleanupOrphanedMarkers(text: string): string;
91
+ //# sourceMappingURL=annotations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../../lib/annotations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAmHnG;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CA6G3D;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,MAAM,CAuEjF;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAqDvD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAUpD;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAiD3F;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAG1D;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,UAAU,EAAE,CAyB1F;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,CAmB7F;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAwB/D;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA6C3D"}