@roughen/core 0.3.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 (82) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +17 -0
  3. package/dist/baselines.d.ts +55 -0
  4. package/dist/baselines.js +42 -0
  5. package/dist/baselines.js.map +1 -0
  6. package/dist/brief.d.ts +45 -0
  7. package/dist/brief.js +110 -0
  8. package/dist/brief.js.map +1 -0
  9. package/dist/document.d.ts +5 -0
  10. package/dist/document.js +531 -0
  11. package/dist/document.js.map +1 -0
  12. package/dist/editorial.d.ts +53 -0
  13. package/dist/editorial.js +252 -0
  14. package/dist/editorial.js.map +1 -0
  15. package/dist/fixes.d.ts +8 -0
  16. package/dist/fixes.js +53 -0
  17. package/dist/fixes.js.map +1 -0
  18. package/dist/index.d.ts +73 -0
  19. package/dist/index.js +232 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/markdown-links.d.ts +12 -0
  22. package/dist/markdown-links.js +130 -0
  23. package/dist/markdown-links.js.map +1 -0
  24. package/dist/preserve.d.ts +36 -0
  25. package/dist/preserve.js +83 -0
  26. package/dist/preserve.js.map +1 -0
  27. package/dist/protected-tokens.d.ts +7 -0
  28. package/dist/protected-tokens.js +103 -0
  29. package/dist/protected-tokens.js.map +1 -0
  30. package/dist/ranges.d.ts +13 -0
  31. package/dist/ranges.js +35 -0
  32. package/dist/ranges.js.map +1 -0
  33. package/dist/rules.d.ts +12 -0
  34. package/dist/rules.js +336 -0
  35. package/dist/rules.js.map +1 -0
  36. package/dist/sentences.d.ts +3 -0
  37. package/dist/sentences.js +95 -0
  38. package/dist/sentences.js.map +1 -0
  39. package/dist/types.d.ts +140 -0
  40. package/dist/types.js +2 -0
  41. package/dist/types.js.map +1 -0
  42. package/dist-cjs/baselines.d.ts +55 -0
  43. package/dist-cjs/baselines.js +45 -0
  44. package/dist-cjs/baselines.js.map +1 -0
  45. package/dist-cjs/brief.d.ts +45 -0
  46. package/dist-cjs/brief.js +114 -0
  47. package/dist-cjs/brief.js.map +1 -0
  48. package/dist-cjs/document.d.ts +5 -0
  49. package/dist-cjs/document.js +535 -0
  50. package/dist-cjs/document.js.map +1 -0
  51. package/dist-cjs/editorial.d.ts +53 -0
  52. package/dist-cjs/editorial.js +263 -0
  53. package/dist-cjs/editorial.js.map +1 -0
  54. package/dist-cjs/fixes.d.ts +8 -0
  55. package/dist-cjs/fixes.js +57 -0
  56. package/dist-cjs/fixes.js.map +1 -0
  57. package/dist-cjs/index.d.ts +73 -0
  58. package/dist-cjs/index.js +258 -0
  59. package/dist-cjs/index.js.map +1 -0
  60. package/dist-cjs/markdown-links.d.ts +12 -0
  61. package/dist-cjs/markdown-links.js +134 -0
  62. package/dist-cjs/markdown-links.js.map +1 -0
  63. package/dist-cjs/package.json +1 -0
  64. package/dist-cjs/preserve.d.ts +36 -0
  65. package/dist-cjs/preserve.js +87 -0
  66. package/dist-cjs/preserve.js.map +1 -0
  67. package/dist-cjs/protected-tokens.d.ts +7 -0
  68. package/dist-cjs/protected-tokens.js +106 -0
  69. package/dist-cjs/protected-tokens.js.map +1 -0
  70. package/dist-cjs/ranges.d.ts +13 -0
  71. package/dist-cjs/ranges.js +41 -0
  72. package/dist-cjs/ranges.js.map +1 -0
  73. package/dist-cjs/rules.d.ts +12 -0
  74. package/dist-cjs/rules.js +340 -0
  75. package/dist-cjs/rules.js.map +1 -0
  76. package/dist-cjs/sentences.d.ts +3 -0
  77. package/dist-cjs/sentences.js +98 -0
  78. package/dist-cjs/sentences.js.map +1 -0
  79. package/dist-cjs/types.d.ts +140 -0
  80. package/dist-cjs/types.js +3 -0
  81. package/dist-cjs/types.js.map +1 -0
  82. package/package.json +45 -0
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.protectedTokenRanges = protectedTokenRanges;
4
+ // Character classes of the original single expression, with its flags:
5
+ // /(?:[a-z][a-z\d+.-]*:\/\/|www\.)[^\t\r\n <>"“”]+|[\p{L}\p{N}\p{M}\p{Cf} ._%+'’-]+@[\p{L}\p{N}\p{M}\p{Cf} .-]+|(?:\.{0,2}\/|~\/|[A-Za-z]:[\\/]|\\\\)[^\t\r\n <>"“”]+/giu
6
+ // Its greedy runs rescan a long word from every start position. This scanner
7
+ // finds the same leftmost-first matches, measuring each run once.
8
+ const LAYOUT = 1;
9
+ const SCHEME_START = 2;
10
+ const SCHEME = 4;
11
+ const LOCAL = 8;
12
+ const DOMAIN = 16;
13
+ const classes = [
14
+ [LAYOUT, /^[\t\r\n <>"“”]$/iu],
15
+ [SCHEME_START, /^[a-z]$/iu],
16
+ [SCHEME, /^[a-z\d+.-]$/iu],
17
+ [LOCAL, /^[\p{L}\p{N}\p{M}\p{Cf} ._%+'’-]$/iu],
18
+ [DOMAIN, /^[\p{L}\p{N}\p{M}\p{Cf} .-]$/iu],
19
+ ];
20
+ const classify = (char) => classes.reduce((bits, [bit, expression]) => expression.test(char) ? bits | bit : bits, 0);
21
+ const ascii = Array.from({ length: 128 }, (_, code) => classify(String.fromCharCode(code)));
22
+ const pathPrefix = /\.{0,2}\/|~\/|[A-Za-z]:[\\/]|\\\\/iuy;
23
+ const www = /www\./iuy;
24
+ /**
25
+ * Single source of truth for literal URLs, email addresses, and file paths.
26
+ * ASCII layout whitespace ends a token; invisible Unicode inside an identifier
27
+ * remains part of its value and must never be normalized by prose rules.
28
+ */
29
+ function protectedTokenRanges(source) {
30
+ const ranges = [];
31
+ // Code points as the /u flag reads them: a lone surrogate is its own point.
32
+ const width = (at) => {
33
+ const code = source.charCodeAt(at);
34
+ const next = source.charCodeAt(at + 1);
35
+ return code >= 0xD800 && code <= 0xDBFF && next >= 0xDC00 && next <= 0xDFFF ? 2 : 1;
36
+ };
37
+ const seen = new Map();
38
+ const bits = (at) => {
39
+ const code = source.charCodeAt(at);
40
+ if (code < 128)
41
+ return ascii[code];
42
+ const char = source.slice(at, at + width(at));
43
+ let value = seen.get(char);
44
+ if (value === undefined)
45
+ seen.set(char, value = classify(char));
46
+ return value;
47
+ };
48
+ const runEnd = (at, test) => {
49
+ while (at < source.length && test(bits(at)))
50
+ at += width(at);
51
+ return at;
52
+ };
53
+ const sticky = (expression, at) => {
54
+ expression.lastIndex = at;
55
+ return expression.exec(source)?.[0].length ?? 0;
56
+ };
57
+ // An alternative that failed at the start of a run fails at every later start
58
+ // in it: the run, and whatever follows it, is the same.
59
+ let tokenEnd = 0;
60
+ let schemeEnd = 0;
61
+ let localEnd = 0;
62
+ for (let at = 0; at < source.length;) {
63
+ if (at >= tokenEnd) {
64
+ if (bits(at) & LAYOUT) {
65
+ at++;
66
+ continue;
67
+ }
68
+ tokenEnd = runEnd(at, (value) => !(value & LAYOUT));
69
+ }
70
+ let end = 0;
71
+ if (at >= schemeEnd && bits(at) & SCHEME_START) {
72
+ schemeEnd = runEnd(at, (value) => !!(value & SCHEME));
73
+ if (source.startsWith('://', schemeEnd) && schemeEnd + 3 < tokenEnd)
74
+ end = tokenEnd;
75
+ }
76
+ if (!end && (source[at] === 'w' || source[at] === 'W') && sticky(www, at) && at + 4 < tokenEnd)
77
+ end = tokenEnd;
78
+ if (!end && at >= localEnd && bits(at) & LOCAL) {
79
+ localEnd = runEnd(at, (value) => !!(value & LOCAL));
80
+ if (source[localEnd] === '@') {
81
+ const domainEnd = runEnd(localEnd + 1, (value) => !!(value & DOMAIN));
82
+ if (domainEnd > localEnd + 1)
83
+ end = domainEnd;
84
+ }
85
+ }
86
+ if (!end && (/[./~\\]/.test(source[at]) || source[at + 1] === ':')) {
87
+ const prefix = sticky(pathPrefix, at);
88
+ if (prefix && at + prefix < tokenEnd)
89
+ end = tokenEnd;
90
+ }
91
+ if (!end) {
92
+ at += width(at);
93
+ continue;
94
+ }
95
+ // Keep ordinary sentence punctuation outside the literal token. Unicode
96
+ // punctuation is retained because it can be an intentional identifier value.
97
+ let token = end;
98
+ while (token > at && /[.,!?;:)\]}]/.test(source[token - 1]))
99
+ token--;
100
+ if (token > at)
101
+ ranges.push([at, token]);
102
+ at = end;
103
+ }
104
+ return ranges;
105
+ }
106
+ //# sourceMappingURL=protected-tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protected-tokens.js","sourceRoot":"","sources":["../src/protected-tokens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Range } from './types.js';
2
+ /**
3
+ * Single source of truth for range overlap. Half-open intersection: touching
4
+ * ranges do not intersect, and a zero-width range intersects only a range that
5
+ * strictly contains its offset. Used for protection checks.
6
+ */
7
+ export declare function rangesIntersect(a: Range, b: Range): boolean;
8
+ /** Fix selection also rejects a zero-width insertion inside or touching another edit. */
9
+ export declare function fixRangesConflict(a: Range, b: Range): boolean;
10
+ /** Index of the first item whose range ends after `offset`; items are sorted and disjoint. */
11
+ export declare function firstEndingAfter<T>(items: readonly T[], offset: number, range: (item: T) => Range): number;
12
+ /** `rangesIntersect` against any of a sorted, disjoint list, in logarithmic time. */
13
+ export declare function sortedRangesIntersect(sorted: readonly Range[], range: Range): boolean;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rangesIntersect = rangesIntersect;
4
+ exports.fixRangesConflict = fixRangesConflict;
5
+ exports.firstEndingAfter = firstEndingAfter;
6
+ exports.sortedRangesIntersect = sortedRangesIntersect;
7
+ /**
8
+ * Single source of truth for range overlap. Half-open intersection: touching
9
+ * ranges do not intersect, and a zero-width range intersects only a range that
10
+ * strictly contains its offset. Used for protection checks.
11
+ */
12
+ function rangesIntersect(a, b) {
13
+ return a[0] < b[1] && b[0] < a[1];
14
+ }
15
+ /** Fix selection also rejects a zero-width insertion inside or touching another edit. */
16
+ function fixRangesConflict(a, b) {
17
+ if (a[0] === a[1])
18
+ return a[0] >= b[0] && a[0] <= b[1];
19
+ if (b[0] === b[1])
20
+ return b[0] >= a[0] && b[0] <= a[1];
21
+ return rangesIntersect(a, b);
22
+ }
23
+ /** Index of the first item whose range ends after `offset`; items are sorted and disjoint. */
24
+ function firstEndingAfter(items, offset, range) {
25
+ let low = 0;
26
+ let high = items.length;
27
+ while (low < high) {
28
+ const middle = (low + high) >>> 1;
29
+ if (range(items[middle])[1] <= offset)
30
+ low = middle + 1;
31
+ else
32
+ high = middle;
33
+ }
34
+ return low;
35
+ }
36
+ /** `rangesIntersect` against any of a sorted, disjoint list, in logarithmic time. */
37
+ function sortedRangesIntersect(sorted, range) {
38
+ const index = firstEndingAfter(sorted, range[0], (item) => item);
39
+ return index < sorted.length && rangesIntersect(sorted[index], range);
40
+ }
41
+ //# sourceMappingURL=ranges.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ranges.js","sourceRoot":"","sources":["../src/ranges.ts"],"names":[],"mappings":";;AAOA,0CAEC;AAGD,8CAIC;AAGD,4CASC;AAGD,sDAGC;AAhCD;;;;GAIG;AACH,SAAgB,eAAe,CAAC,CAAQ,EAAE,CAAQ;IAChD,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,yFAAyF;AACzF,SAAgB,iBAAiB,CAAC,CAAQ,EAAE,CAAQ;IAClD,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,OAAO,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED,8FAA8F;AAC9F,SAAgB,gBAAgB,CAAI,KAAmB,EAAE,MAAc,EAAE,KAAyB;IAChG,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;IACxB,OAAO,GAAG,GAAG,IAAI,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAE,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM;YAAE,GAAG,GAAG,MAAM,GAAG,CAAC,CAAC;;YACpD,IAAI,GAAG,MAAM,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,qFAAqF;AACrF,SAAgB,qBAAqB,CAAC,MAAwB,EAAE,KAAY;IAC1E,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACjE,OAAO,KAAK,GAAG,MAAM,CAAC,MAAM,IAAI,eAAe,CAAC,MAAM,CAAC,KAAK,CAAE,EAAE,KAAK,CAAC,CAAC;AACzE,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { Rule } from './types.js';
2
+ /** Compiled banned patterns. Global and Unicode-aware always; zero-length matches can't be reported, so they're skipped. */
3
+ export declare function bannedPatternExpressions(config: {
4
+ voice?: {
5
+ bannedPatterns?: {
6
+ pattern: string;
7
+ flags?: string;
8
+ }[];
9
+ };
10
+ }): RegExp[];
11
+ /** All deterministic detection lives in this registry; consumers only call lint. */
12
+ export declare const rules: Rule[];
@@ -0,0 +1,340 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rules = void 0;
4
+ exports.bannedPatternExpressions = bannedPatternExpressions;
5
+ const editorial_js_1 = require("./editorial.js");
6
+ const ranges_js_1 = require("./ranges.js");
7
+ /** Single source of truth for rule protection: never alter quotes or syntax. */
8
+ function isProse(document, range) {
9
+ if ((0, ranges_js_1.sortedRangesIntersect)(document.protectedRanges, range))
10
+ return false;
11
+ // Blocks are sorted and disjoint: the ones intersecting the range are consecutive.
12
+ const { blocks } = document;
13
+ let prose = false;
14
+ for (let i = (0, ranges_js_1.firstEndingAfter)(blocks, range[0], (block) => block.sourceRange); i < blocks.length && blocks[i].sourceRange[0] < range[1]; i++) {
15
+ if (blocks[i].skip)
16
+ return false;
17
+ prose = true;
18
+ }
19
+ return prose;
20
+ }
21
+ function matches(context, expression, describe) {
22
+ const findings = [];
23
+ for (const match of context.document.source.matchAll(expression)) {
24
+ const range = [match.index, match.index + match[0].length];
25
+ if (!isProse(context.document, range))
26
+ continue;
27
+ const finding = describe(match, range);
28
+ if (finding)
29
+ findings.push(finding);
30
+ }
31
+ return findings;
32
+ }
33
+ function replacement(range, text, message, why, fixSafety = 'safe') {
34
+ return { range, message, why, fix: { range, text }, fixSafety, confidence: 1 };
35
+ }
36
+ function characterRule(id, description, expression, replace, why, fixSafety = 'safe') {
37
+ return {
38
+ id,
39
+ severity: 'warn',
40
+ description,
41
+ check(context) {
42
+ return matches(context, expression, (match, range) => replacement(range, replace(match[0]), description, why, fixSafety));
43
+ },
44
+ };
45
+ }
46
+ const zeroWidth = {
47
+ id: 'artifact/zero-width',
48
+ severity: 'warn',
49
+ description: 'Remove invisible spacing residue in Latin prose.',
50
+ check(context) {
51
+ return matches(context, /[\u200B\uFEFF]/gu, (match, range) => {
52
+ const source = context.document.source;
53
+ const before = Array.from(source.slice(Math.max(0, range[0] - 2), range[0])).at(-1) ?? '';
54
+ const after = Array.from(source.slice(range[1], range[1] + 2))[0] ?? '';
55
+ const latinOrSpacing = /^[\p{Script=Latin}\p{Number}\p{Punctuation}\s]?$/u;
56
+ // ZWJ/ZWNJ are intentionally absent: they carry emoji and script meaning.
57
+ // ZWSP is also a legitimate word separator in scripts such as Thai.
58
+ if (!(match[0] === '\uFEFF' && range[0] === 0)
59
+ && !(latinOrSpacing.test(before) && latinOrSpacing.test(after)))
60
+ return;
61
+ return replacement(range, '', 'An invisible spacing character occurs in prose.', 'This character is invisible in Latin prose and can interfere with searching or copying the text.');
62
+ });
63
+ },
64
+ };
65
+ const smartQuotes = {
66
+ id: 'artifact/smart-quotes',
67
+ severity: 'info',
68
+ description: 'Offer straight punctuation outside protected quotations.',
69
+ check(context) {
70
+ if (context.options.style === 'preserve')
71
+ return [];
72
+ return matches(context, /[\u2018\u2019\u201C\u201D]/gu, (match, range) => replacement(range, /[\u2018\u2019]/u.test(match[0]) ? "'" : '"', 'Curly punctuation can be changed to straight punctuation.', 'This is a typography preference, not evidence of authorship. Review the change for the intended destination.', 'careful'));
73
+ },
74
+ };
75
+ const doubleSpace = {
76
+ id: 'artifact/double-space',
77
+ severity: 'warn',
78
+ description: 'Collapse repeated spaces within prose.',
79
+ check(context) {
80
+ const source = context.document.source;
81
+ // Matches arrive in order, so each line's content bounds are measured once.
82
+ let lineStart = 0;
83
+ let lineEnd = -1;
84
+ let firstContent = 0;
85
+ let lastContent = 0;
86
+ return matches(context, / {2,}/gu, (_match, range) => {
87
+ if (range[0] > lineEnd) {
88
+ lineStart = source.lastIndexOf('\n', range[0] - 1) + 1;
89
+ const nextNewline = source.indexOf('\n', range[1]);
90
+ lineEnd = nextNewline < 0 ? source.length : nextNewline;
91
+ firstContent = lineStart;
92
+ while (firstContent < lineEnd && /\s/u.test(source[firstContent]))
93
+ firstContent++;
94
+ lastContent = lineEnd;
95
+ while (lastContent > lineStart && /\s/u.test(source[lastContent - 1]))
96
+ lastContent--;
97
+ }
98
+ // Keep indentation, trailing layout whitespace, and Markdown hard breaks.
99
+ if (firstContent >= range[0] || lastContent <= range[1])
100
+ return;
101
+ if (context.options.allowAfterSentence === true && /[.!?]["'”’)]?$/u.test(source.slice(Math.max(lineStart, range[0] - 2), range[0])))
102
+ return;
103
+ return replacement(range, ' ', 'Repeated spaces occur within a line of prose.', 'A single space separates these words. Leading indentation and line-ending spaces are preserved.');
104
+ });
105
+ },
106
+ };
107
+ const markdownBleed = {
108
+ id: 'artifact/markdown-bleed',
109
+ severity: 'warn',
110
+ description: 'Find emphasis delimiters in plain-text output.',
111
+ check(context) {
112
+ if (context.document.format !== 'text')
113
+ return [];
114
+ // Emphasis spans are short; bounding them keeps unmatched delimiters linear.
115
+ return matches(context, /(\*\*|__)(?=\S)([^\r\n]{0,200}?\S)\1|_([^\s_\r\n](?:[^_\r\n]{0,200}?[^\s_\r\n])?)_/gu, (match, range) => {
116
+ const source = context.document.source;
117
+ const before = source[range[0] - 1] ?? '';
118
+ const after = source[range[1]] ?? '';
119
+ if (/[\p{L}\p{N}_*]/u.test(before) || /[\p{L}\p{N}_*]/u.test(after))
120
+ return;
121
+ return replacement(range, match[2] ?? match[3], 'Markdown emphasis delimiters appear in plain text.', 'These characters appear literally in a plain-text destination. Keep them if the text is explaining Markdown syntax.', 'careful');
122
+ });
123
+ },
124
+ };
125
+ const openerPattern = /^(?:Certainly!|Absolutely!|Great question!|Sure thing!|Sure[!,])(?:[ \t]*\r?\n|[ \t]+)+/iu;
126
+ const artifact = '(?:draft|blog post|article|email|reply|response|rewrite|revised text|revised version)';
127
+ const metaPattern = new RegExp('^(?:(?:Here(?:[\u0027\u2019]s| is)|Below is) (?:a|the|your) ' + artifact
128
+ + '(?: (?:you requested|you asked for|for you))?'
129
+ + '|I(?:[\u0027\u2019]ve| have) drafted the following(?: ' + artifact + ')?(?: for you)?)'
130
+ + ':[ \\t]*(?:\\r?\\n)+[ \\t\\r\\n]*', 'iu');
131
+ function opening(document) {
132
+ const start = /^\s*/u.exec(document.source)[0].length;
133
+ const remainder = document.source.slice(start);
134
+ const opener = openerPattern.exec(remainder)?.[0] ?? '';
135
+ const meta = metaPattern.exec(remainder.slice(opener.length))?.[0] ?? '';
136
+ return { start, opener, meta };
137
+ }
138
+ const preambleOpener = {
139
+ id: 'preamble/opener',
140
+ severity: 'warn',
141
+ description: 'Review assistant-style framing at the beginning of a document.',
142
+ check({ document }) {
143
+ const { start, opener, meta } = opening(document);
144
+ if (!opener)
145
+ return [];
146
+ const range = [start, start + opener.length];
147
+ if (!isProse(document, range) || !document.source.slice(range[1]).trim())
148
+ return [];
149
+ if (meta && isProse(document, [range[1], range[1] + meta.length])) {
150
+ return [replacement(range, '', 'An assistant-style acknowledgment precedes the draft.', 'This acknowledgment introduces an explicitly framed draft rather than contributing to its content.')];
151
+ }
152
+ // "Absolutely! We guarantee it." can be deliberate copy. Never delete it.
153
+ return [{
154
+ range, message: 'Review a possible assistant-style opening.',
155
+ why: 'This phrase is sometimes assistant framing, but it can also express intentional agreement or emphasis.',
156
+ fixSafety: 'manual', confidence: 0.6,
157
+ }];
158
+ },
159
+ };
160
+ const preambleMeta = {
161
+ id: 'preamble/meta',
162
+ severity: 'warn',
163
+ description: 'Remove explicit draft delivery framing at the document start.',
164
+ check({ document }) {
165
+ const { start, opener, meta } = opening(document);
166
+ if (!meta)
167
+ return [];
168
+ const range = [start + opener.length, start + opener.length + meta.length];
169
+ if (!isProse(document, range) || !document.source.slice(range[1]).trim())
170
+ return [];
171
+ return [replacement(range, '', 'A draft delivery label precedes the content.', 'This line describes delivering a draft. Removing the label leaves the draft itself intact.')];
172
+ },
173
+ };
174
+ const preambleCloser = {
175
+ id: 'preamble/closer',
176
+ severity: 'warn',
177
+ description: 'Review assistant framing in a final, separate paragraph.',
178
+ check(context) {
179
+ const { start, opener, meta } = opening(context.document);
180
+ const hasDeliveryFraming = !!meta && isProse(context.document, [start + opener.length, start + opener.length + meta.length]);
181
+ // Require a final standalone paragraph; general customer CTAs are excluded.
182
+ return matches(context, /(?:\r?\n)[ \t]*(?:\r?\n)(?:I hope this helps[.!]|Let me know if you(?:['’]d| would) like (?:me to (?:revise|adjust|expand|shorten|rephrase) (?:this draft|the draft|this text|the text|this response)|any (?:changes|revisions|adjustments))\.?)[ \t\r\n]*$/giu, (match, range) => {
183
+ if (!context.document.source.slice(0, range[0]).trim())
184
+ return;
185
+ const ambiguous = /I hope this helps/iu.test(match[0]);
186
+ // The match runs to the end of the document; keep the line ending the source ended with.
187
+ const ending = /\r?\n(?=[ \t]*$)/u.exec(match[0])?.[0] ?? '';
188
+ return replacement(range, ending, ambiguous
189
+ ? hasDeliveryFraming ? 'A closing acknowledgment follows an explicitly framed draft.' : 'Review a generic closing acknowledgment.'
190
+ : 'A draft revision invitation follows the content.', ambiguous
191
+ ? hasDeliveryFraming
192
+ ? 'This final paragraph follows an explicitly framed draft rather than adding to its content.'
193
+ : 'This standalone phrase can be assistant framing or an intentional personal sign-off. Review before removing it.'
194
+ : hasDeliveryFraming
195
+ ? 'This final paragraph offers revisions after an explicitly framed draft rather than adding to its content.'
196
+ : 'This invitation may be assistant framing or an intentional client call to action. Review before removing it.', hasDeliveryFraming ? 'safe' : 'careful');
197
+ });
198
+ },
199
+ };
200
+ function escaped(term) {
201
+ return term.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&');
202
+ }
203
+ /** A replacement follows the match's case: ALL CAPS, Capitalized, or as configured. */
204
+ function matchCase(matched, use) {
205
+ const letters = matched.replace(/\P{L}/gu, '');
206
+ if (letters.length > 1 && letters === letters.toUpperCase() && letters !== letters.toLowerCase())
207
+ return use.toUpperCase();
208
+ if (/^\p{Lu}/u.test(letters))
209
+ return use.replace(/^./su, (first) => first.toUpperCase());
210
+ return use;
211
+ }
212
+ function wholeTerm(source, range, term) {
213
+ return !(/[\p{L}\p{N}_]/u.test(term[0] ?? '') && /[\p{L}\p{N}_]/u.test(source[range[0] - 1] ?? ''))
214
+ && !(/[\p{L}\p{N}_]/u.test(term.at(-1) ?? '') && /[\p{L}\p{N}_]/u.test(source[range[1]] ?? ''));
215
+ }
216
+ const voiceBanned = {
217
+ id: 'voice/banned',
218
+ severity: 'warn',
219
+ description: 'Find terms explicitly prohibited by the project voice config.',
220
+ check(context) {
221
+ return (context.config.voice?.banned ?? []).flatMap(({ term, use }) => {
222
+ if (!term.trim())
223
+ return [];
224
+ return matches(context, new RegExp(escaped(term), 'giu'), (match, range) => {
225
+ if (!wholeTerm(context.document.source, range, term))
226
+ return;
227
+ return {
228
+ range, message: `The project voice excludes “${term}”.`,
229
+ why: use ? `The project suggests “${use}”. Check that it preserves the intended meaning.` : 'This term is excluded by explicit project configuration, not an AI vocabulary score.',
230
+ ...(use === undefined ? {} : { fix: { range, text: matchCase(match[0], use) } }),
231
+ fixSafety: use === undefined ? 'manual' : 'careful', confidence: 1,
232
+ evidence: { term, ...(use === undefined ? {} : { suggestedReplacement: use }) },
233
+ };
234
+ });
235
+ });
236
+ },
237
+ };
238
+ const voiceRequired = {
239
+ id: 'voice/required',
240
+ severity: 'warn',
241
+ description: 'Report configured terms absent from editable prose; protected quotations do not count.',
242
+ check({ document, config }) {
243
+ // The parser owns visibility. Never let comments, attributes, or code meet
244
+ // a prose requirement. In v0.1 protected quotations also do not qualify.
245
+ // Masked syntax is spaces and prose wraps lines, so whitespace runs compare
246
+ // as one space. Required terms are brand names: their case is exact.
247
+ const collapse = (text) => text.replace(/\s+/gu, ' ');
248
+ const prose = collapse(document.blocks.filter((block) => !block.skip).map((block) => block.text).join('\n'));
249
+ return (config.voice?.required ?? []).flatMap((term) => {
250
+ if (!term.trim())
251
+ return [];
252
+ const wanted = collapse(term.trim());
253
+ const found = Array.from(prose.matchAll(new RegExp(escaped(wanted), 'gu')))
254
+ .some((match) => wholeTerm(prose, [match.index, match.index + match[0].length], wanted));
255
+ if (found)
256
+ return [];
257
+ return [{
258
+ range: [0, 0], message: `The required term “${term}” is missing.`,
259
+ why: 'The project requires this term in editable prose. Protected quotations, code, and document syntax do not satisfy the requirement. Its placement needs an editorial decision.',
260
+ fixSafety: 'manual', confidence: 1, evidence: { term },
261
+ }];
262
+ });
263
+ },
264
+ };
265
+ // What to write instead of a banned character, when the config doesn't say.
266
+ const bannedAdvice = {
267
+ '—': 'Use a comma, a colon, parentheses or a sentence break, whichever reads most naturally.',
268
+ '–': 'Use a hyphen in compound words and "to" between numbers, or rewrite the sentence around it.',
269
+ ';': 'Use a period, or a comma and "and", "but" or "so".',
270
+ '!': 'Use a period.',
271
+ };
272
+ function describeCharacter(character) {
273
+ const code = character.codePointAt(0);
274
+ return code > 0x7e || code < 0x21 ? `“${character}” (U+${code.toString(16).toUpperCase().padStart(4, '0')})` : `“${character}”`;
275
+ }
276
+ /**
277
+ * Absolute bans from the project voice: every occurrence in editable copy is
278
+ * reported, however rare. Density rules measure habits; a ban is a house rule.
279
+ * Protected quotations and code stay exempt, like every other rule.
280
+ */
281
+ const voiceBannedCharacter = {
282
+ id: 'voice/banned-character',
283
+ severity: 'error',
284
+ description: 'Report every character the project voice bans outright.',
285
+ check(context) {
286
+ return (0, editorial_js_1.bannedCharacters)(context.config).flatMap(({ character, use, why }) => {
287
+ const advice = use === undefined ? bannedAdvice[character] ?? 'Rewrite the passage without it.' : `The project suggests “${use}”.`;
288
+ const found = matches(context, new RegExp(escaped(character), 'gu'), (_match, range) => ({
289
+ range, message: `The project bans ${describeCharacter(character)} in copy.`,
290
+ why: `${why ?? 'This character is banned by explicit project configuration wherever it appears in copy, whatever its density.'} ${advice}`,
291
+ ...(use === undefined ? {} : { fix: { range, text: use } }),
292
+ fixSafety: use === undefined ? 'manual' : 'careful', confidence: 1,
293
+ evidence: { character, advice },
294
+ }));
295
+ return found.map((finding) => ({ ...finding, evidence: { ...finding.evidence, count: found.length, rewriteAtLeast: found.length } }));
296
+ });
297
+ },
298
+ };
299
+ /** Compiled banned patterns. Global and Unicode-aware always; zero-length matches can't be reported, so they're skipped. */
300
+ function bannedPatternExpressions(config) {
301
+ return (config.voice?.bannedPatterns ?? []).map(({ pattern, flags = '' }) => new RegExp(pattern, `${[...new Set(flags.replace(/[guvy]/g, ''))].join('')}gu`));
302
+ }
303
+ const voiceBannedPattern = {
304
+ id: 'voice/banned-pattern',
305
+ severity: 'error',
306
+ description: 'Report every match of a pattern the project voice bans outright.',
307
+ check(context) {
308
+ const entries = context.config.voice?.bannedPatterns ?? [];
309
+ return bannedPatternExpressions(context.config).flatMap((expression, index) => {
310
+ const { pattern, message, use } = entries[index];
311
+ const found = matches(context, expression, (match, range) => match[0].length === 0 ? undefined : {
312
+ range, message: message ?? `The project bans “${match[0]}” in copy.`,
313
+ why: `This matches /${pattern}/, which the project bans by explicit configuration, not by a density measure. ${use === undefined ? 'Rewrite the passage without it.' : `The project suggests “${use}”.`}`,
314
+ ...(use === undefined ? {} : { fix: { range, text: use } }),
315
+ fixSafety: use === undefined ? 'manual' : 'careful', confidence: 1,
316
+ evidence: { pattern },
317
+ });
318
+ return found.map((finding) => ({ ...finding, evidence: { ...finding.evidence, count: found.length, rewriteAtLeast: found.length } }));
319
+ });
320
+ },
321
+ };
322
+ /** All deterministic detection lives in this registry; consumers only call lint. */
323
+ exports.rules = [
324
+ zeroWidth,
325
+ characterRule('artifact/soft-hyphen', 'An invisible soft hyphen occurs in prose.', /\u00AD/gu, () => '', 'A discretionary hyphen can survive copying and split a word during searching. Removing it retains the word.'),
326
+ characterRule('artifact/nbsp', 'A non-breaking space occurs in prose.', /\u00A0/gu, () => ' ', 'This space prevents a line break. Replace it only when that layout behavior is unintended.', 'careful'),
327
+ characterRule('artifact/ellipsis-char', 'An ellipsis uses a single Unicode character.', /\u2026/gu, () => '...', 'Three periods may suit plain-text destinations. A typographic ellipsis is also valid, so this is an optional style change.', 'careful'),
328
+ smartQuotes,
329
+ doubleSpace,
330
+ markdownBleed,
331
+ preambleOpener,
332
+ preambleMeta,
333
+ preambleCloser,
334
+ voiceBanned,
335
+ voiceRequired,
336
+ voiceBannedCharacter,
337
+ voiceBannedPattern,
338
+ ...editorial_js_1.editorialRules,
339
+ ];
340
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../src/rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Sentence } from './types.js';
2
+ /** Deterministic segmentation with original UTF-16 ranges; it does not infer authorship. */
3
+ export declare function segmentSentences(text: string, offset?: number): Sentence[];