@dzhechkov/harness-core 0.8.2 → 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 (45) hide show
  1. package/.dz-manifest.json +110 -22
  2. package/README.md +66 -1
  3. package/dist/cmd-usage.d.ts +148 -0
  4. package/dist/cmd-usage.d.ts.map +1 -0
  5. package/dist/cmd-usage.js +548 -0
  6. package/dist/cmd-usage.js.map +1 -0
  7. package/dist/compounding.d.ts +4 -0
  8. package/dist/compounding.d.ts.map +1 -1
  9. package/dist/compounding.js +6 -0
  10. package/dist/compounding.js.map +1 -1
  11. package/dist/contract-checklist.d.ts +123 -0
  12. package/dist/contract-checklist.d.ts.map +1 -0
  13. package/dist/contract-checklist.js +700 -0
  14. package/dist/contract-checklist.js.map +1 -0
  15. package/dist/feature-adr-routing.d.ts +2 -2
  16. package/dist/feature-adr-routing.d.ts.map +1 -1
  17. package/dist/feature-adr-routing.js +21 -1
  18. package/dist/feature-adr-routing.js.map +1 -1
  19. package/dist/index.d.ts +7 -0
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +7 -0
  22. package/dist/index.js.map +1 -1
  23. package/dist/qe-bridge.d.ts.map +1 -1
  24. package/dist/qe-bridge.js +9 -0
  25. package/dist/qe-bridge.js.map +1 -1
  26. package/dist/restart-advisor.d.ts +103 -0
  27. package/dist/restart-advisor.d.ts.map +1 -0
  28. package/dist/restart-advisor.js +445 -0
  29. package/dist/restart-advisor.js.map +1 -0
  30. package/dist/slop-lint.d.ts +128 -0
  31. package/dist/slop-lint.d.ts.map +1 -0
  32. package/dist/slop-lint.js +607 -0
  33. package/dist/slop-lint.js.map +1 -0
  34. package/package.json +14 -13
  35. package/sbom.json +241 -21
  36. package/src/cmd-usage.ts +720 -0
  37. package/src/compounding.ts +13 -0
  38. package/src/contract-checklist.ts +973 -0
  39. package/src/deadwood-allowlist.json +80 -0
  40. package/src/feature-adr-routing.ts +21 -1
  41. package/src/index.ts +79 -0
  42. package/src/qe-bridge.ts +9 -0
  43. package/src/restart-advisor.ts +579 -0
  44. package/src/slop-lint.ts +762 -0
  45. package/src/slop-markers.json +71 -0
@@ -0,0 +1,607 @@
1
+ // SPDX-License-Identifier: MIT
2
+ export const DEFAULT_SLOP_CONFIG = Object.freeze({
3
+ schema: 'dz-slop-config/1',
4
+ lexicalDensityPer100Words: Object.freeze({ en: 4, ru: 4 }),
5
+ lexicalMinimumMarkers: 2,
6
+ lexicalWordFloor: 25,
7
+ bulletMinimumItems: 8,
8
+ bulletMinimumLineRatio: 0.8,
9
+ bulletMaximumMeanWords: 12,
10
+ adjectiveStackSize: 3,
11
+ });
12
+ export const BUNDLED_SLOP_REGISTRY_URL = new URL('../src/slop-markers.json', import.meta.url);
13
+ const record = (value) => value !== null && typeof value === 'object' && !Array.isArray(value) ? value : null;
14
+ function finiteIn(value, min, max) {
15
+ return typeof value === 'number' && Number.isFinite(value) && value >= min && value <= max;
16
+ }
17
+ export function validateSlopLintConfig(value) {
18
+ const errors = [];
19
+ const root = record(value);
20
+ if (root === null)
21
+ return { ok: false, errors: [{ field: '$', value, reason: 'must be an object' }] };
22
+ const need = (field, valid, reason) => {
23
+ if (!valid)
24
+ errors.push({ field, value: root[field], reason });
25
+ };
26
+ need('schema', root.schema === 'dz-slop-config/1', 'must equal dz-slop-config/1');
27
+ const density = record(root.lexicalDensityPer100Words);
28
+ if (density === null) {
29
+ errors.push({ field: 'lexicalDensityPer100Words', value: root.lexicalDensityPer100Words, reason: 'must contain complete en and ru thresholds' });
30
+ }
31
+ else {
32
+ if (!finiteIn(density.en, 0.1, 100))
33
+ errors.push({ field: 'lexicalDensityPer100Words.en', value: density.en, reason: 'must be finite in 0.1..100' });
34
+ if (!finiteIn(density.ru, 0.1, 100))
35
+ errors.push({ field: 'lexicalDensityPer100Words.ru', value: density.ru, reason: 'must be finite in 0.1..100' });
36
+ }
37
+ need('lexicalMinimumMarkers', finiteIn(root.lexicalMinimumMarkers, 2, 100), 'must be finite in 2..100');
38
+ need('lexicalWordFloor', finiteIn(root.lexicalWordFloor, 1, 1_000), 'must be finite in 1..1000');
39
+ need('bulletMinimumItems', finiteIn(root.bulletMinimumItems, 3, 100), 'must be finite in 3..100');
40
+ need('bulletMinimumLineRatio', finiteIn(root.bulletMinimumLineRatio, 0.5, 1), 'must be finite in 0.5..1');
41
+ need('bulletMaximumMeanWords', finiteIn(root.bulletMaximumMeanWords, 1, 100), 'must be finite in 1..100');
42
+ need('adjectiveStackSize', root.adjectiveStackSize === 3, 'must equal 3');
43
+ if (errors.length > 0)
44
+ return { ok: false, errors };
45
+ return { ok: true, value: value };
46
+ }
47
+ function validateRegistryEntry(value, field, seen, errors) {
48
+ const entry = record(value);
49
+ if (entry === null) {
50
+ errors.push({ field, value, reason: 'must be an object' });
51
+ return;
52
+ }
53
+ const id = entry.id;
54
+ if (typeof id !== 'string' || !/^(?:en|ru)\.[a-z0-9.-]+$/.test(id)) {
55
+ errors.push({ field: `${field}.id`, value: id, reason: 'must be a stable en.* or ru.* id' });
56
+ }
57
+ else if (seen.has(id)) {
58
+ errors.push({ field: `${field}.id`, value: id, reason: 'duplicate registry id' });
59
+ }
60
+ else {
61
+ seen.add(id);
62
+ }
63
+ if (entry.language !== 'en' && entry.language !== 'ru') {
64
+ errors.push({ field: `${field}.language`, value: entry.language, reason: 'must be en or ru' });
65
+ }
66
+ else if (typeof id === 'string' && !id.startsWith(`${entry.language}.`)) {
67
+ errors.push({ field: `${field}.language`, value: entry.language, reason: 'must match the id language prefix' });
68
+ }
69
+ const match = record(entry.match);
70
+ if (match === null || !['form', 'stem', 'phrase'].includes(String(match.kind))) {
71
+ errors.push({ field: `${field}.match`, value: entry.match, reason: 'must use form, stem, or phrase' });
72
+ }
73
+ else if (!Array.isArray(match.values) || match.values.length === 0 ||
74
+ match.values.some((item) => typeof item !== 'string' || item.trim() === '')) {
75
+ errors.push({ field: `${field}.match.values`, value: match.values, reason: 'must contain non-empty literal strings' });
76
+ }
77
+ if (typeof entry.rationale !== 'string' || entry.rationale.trim() === '') {
78
+ errors.push({ field: `${field}.rationale`, value: entry.rationale, reason: 'must be non-empty' });
79
+ }
80
+ const provenance = record(entry.provenance);
81
+ if (provenance === null || typeof provenance.source !== 'string' || provenance.source.trim() === '' ||
82
+ provenance.license !== 'repository-authored') {
83
+ errors.push({ field: `${field}.provenance`, value: entry.provenance, reason: 'must name a source and repository-authored license' });
84
+ }
85
+ }
86
+ export function parseSlopRegistry(value) {
87
+ try {
88
+ const errors = [];
89
+ const root = record(value);
90
+ if (root === null)
91
+ return { ok: false, errors: [{ field: '$', value, reason: 'must be an object' }] };
92
+ if (root.schema !== 'dz-slop-registry/1') {
93
+ errors.push({ field: 'schema', value: root.schema, reason: 'must equal dz-slop-registry/1' });
94
+ }
95
+ const metadata = record(root.metadata);
96
+ const reference = metadata === null ? null : record(metadata.englishReference);
97
+ if (metadata === null || typeof metadata.policyVersion !== 'string' || typeof metadata.owner !== 'string' ||
98
+ typeof metadata.reviewCadence !== 'string' || reference === null ||
99
+ reference.repository !== 'https://github.com/NousResearch/autonovel' ||
100
+ typeof reference.commit !== 'string' || !/^[0-9a-f]{40}$/.test(reference.commit) ||
101
+ reference.path !== 'ANTI-SLOP.md' || reference.license !== 'none-declared' ||
102
+ typeof reference.retrieved !== 'string' || typeof reference.use !== 'string') {
103
+ errors.push({ field: 'metadata', value: root.metadata, reason: 'must carry owner, cadence, and the pinned unlicensed reference record' });
104
+ }
105
+ const markers = root.markers;
106
+ const adjectives = root.adjectives;
107
+ if (!Array.isArray(markers) || markers.length === 0) {
108
+ errors.push({ field: 'markers', value: markers, reason: 'must contain entries' });
109
+ }
110
+ if (!Array.isArray(adjectives) || adjectives.length === 0) {
111
+ errors.push({ field: 'adjectives', value: adjectives, reason: 'must contain entries' });
112
+ }
113
+ const seen = new Set();
114
+ if (Array.isArray(markers))
115
+ markers.forEach((entry, index) => validateRegistryEntry(entry, `markers[${index}]`, seen, errors));
116
+ if (Array.isArray(adjectives))
117
+ adjectives.forEach((entry, index) => validateRegistryEntry(entry, `adjectives[${index}]`, seen, errors));
118
+ if (Array.isArray(markers) && !markers.some((entry) => record(entry)?.language === 'en')) {
119
+ errors.push({ field: 'markers', value: markers, reason: 'must contain EN markers' });
120
+ }
121
+ if (Array.isArray(markers) && !markers.some((entry) => record(entry)?.language === 'ru')) {
122
+ errors.push({ field: 'markers', value: markers, reason: 'must contain RU markers' });
123
+ }
124
+ if (Array.isArray(adjectives) && !adjectives.some((entry) => record(entry)?.language === 'en')) {
125
+ errors.push({ field: 'adjectives', value: adjectives, reason: 'must contain EN adjectives' });
126
+ }
127
+ if (Array.isArray(adjectives) && !adjectives.some((entry) => record(entry)?.language === 'ru')) {
128
+ errors.push({ field: 'adjectives', value: adjectives, reason: 'must contain RU adjectives' });
129
+ }
130
+ if (errors.length > 0)
131
+ return { ok: false, errors };
132
+ return { ok: true, value: value };
133
+ }
134
+ catch (error) {
135
+ return { ok: false, errors: [{ field: '$', value, reason: error instanceof Error ? error.message : 'registry validation failed' }] };
136
+ }
137
+ }
138
+ function sourceLines(text) {
139
+ const lines = [];
140
+ let offset = 0;
141
+ let line = 1;
142
+ while (offset <= text.length) {
143
+ let end = offset;
144
+ while (end < text.length && text[end] !== '\n' && text[end] !== '\r')
145
+ end += 1;
146
+ lines.push({ raw: text.slice(offset, end), line, offset });
147
+ if (end >= text.length)
148
+ break;
149
+ if (text[end] === '\r' && text[end + 1] === '\n')
150
+ end += 1;
151
+ offset = end + 1;
152
+ line += 1;
153
+ }
154
+ return lines;
155
+ }
156
+ function maskRange(chars, start, end) {
157
+ for (let i = Math.max(0, start); i < Math.min(chars.length, end); i += 1)
158
+ chars[i] = ' ';
159
+ }
160
+ function visibleMarkdown(raw) {
161
+ // RegExp match offsets are UTF-16 code-unit offsets, so keep the projection in
162
+ // code units too. Spreading would turn astral characters into one array slot
163
+ // and shift every later source location.
164
+ const chars = raw.split('');
165
+ const maskMatches = (regex, keep = 0) => {
166
+ regex.lastIndex = 0;
167
+ for (let match = regex.exec(raw); match !== null; match = regex.exec(raw)) {
168
+ maskRange(chars, match.index + keep, match.index + match[0].length);
169
+ if (match[0].length === 0)
170
+ regex.lastIndex += 1;
171
+ }
172
+ };
173
+ maskMatches(/`+[^`]*`+/g);
174
+ maskMatches(/\]\([^)]*\)/g, 1);
175
+ maskMatches(/<[^>]*>/g);
176
+ const heading = /^\s{0,3}#{1,6}\s+/.exec(raw);
177
+ if (heading !== null)
178
+ maskRange(chars, 0, heading[0].length);
179
+ const bullet = /^\s{0,3}(?:[-+*]|\d+[.)])\s+/.exec(raw);
180
+ if (bullet !== null)
181
+ maskRange(chars, 0, bullet[0].length);
182
+ for (let i = 0; i < chars.length; i += 1) {
183
+ if ('*_~[]'.includes(chars[i] ?? ''))
184
+ chars[i] = ' ';
185
+ }
186
+ return chars.join('');
187
+ }
188
+ function projectUnits(text) {
189
+ const units = [];
190
+ const diagnostics = [];
191
+ let prose = [];
192
+ let list = [];
193
+ let fence = null;
194
+ let inExample = false;
195
+ let exampleStartLine = 1;
196
+ let frontmatter = false;
197
+ let frontmatterEligible = true;
198
+ const flushProse = () => {
199
+ if (prose.length > 0)
200
+ units.push({ kind: 'prose', lines: prose });
201
+ prose = [];
202
+ };
203
+ const flushList = () => {
204
+ if (list.length > 0)
205
+ units.push({ kind: 'list', lines: list });
206
+ list = [];
207
+ };
208
+ const boundary = () => { flushProse(); flushList(); };
209
+ for (const source of sourceLines(text)) {
210
+ const trimmed = source.raw.trim();
211
+ if (frontmatterEligible && source.line === 1 && trimmed === '---') {
212
+ frontmatter = true;
213
+ continue;
214
+ }
215
+ frontmatterEligible = false;
216
+ if (frontmatter) {
217
+ if (trimmed === '---')
218
+ frontmatter = false;
219
+ continue;
220
+ }
221
+ if (trimmed === '<!-- slop-lint:example:start -->') {
222
+ boundary();
223
+ if (!inExample)
224
+ exampleStartLine = source.line;
225
+ inExample = true;
226
+ continue;
227
+ }
228
+ if (trimmed === '<!-- slop-lint:example:end -->') {
229
+ boundary();
230
+ inExample = false;
231
+ continue;
232
+ }
233
+ if (inExample)
234
+ continue;
235
+ const fenceMatch = /^\s*(`{3,}|~{3,})/.exec(source.raw);
236
+ if (fenceMatch !== null) {
237
+ boundary();
238
+ const marker = fenceMatch[1][0];
239
+ if (fence === null)
240
+ fence = marker;
241
+ else if (fence === marker)
242
+ fence = null;
243
+ continue;
244
+ }
245
+ if (fence !== null)
246
+ continue;
247
+ if (trimmed === '' || /^\s*>/.test(source.raw)) {
248
+ boundary();
249
+ continue;
250
+ }
251
+ const projected = { ...source, visible: visibleMarkdown(source.raw) };
252
+ if (/^\s{0,3}(?:[-+*]|\d+[.)])\s+/.test(source.raw)) {
253
+ flushProse();
254
+ list.push(projected);
255
+ continue;
256
+ }
257
+ if (/^\s{0,3}#{1,6}\s+/.test(source.raw) || /^\s*\|.*\|\s*$/.test(source.raw)) {
258
+ boundary();
259
+ units.push({ kind: 'prose', lines: [projected] });
260
+ continue;
261
+ }
262
+ // A nonblank continuation remains part of the contiguous list section. This makes the
263
+ // configured line ratio meaningful and prevents prose-heavy interrupted lists from being
264
+ // treated as six adjacent one-line bullets.
265
+ if (list.length > 0) {
266
+ list.push(projected);
267
+ continue;
268
+ }
269
+ prose.push(projected);
270
+ }
271
+ boundary();
272
+ if (inExample) {
273
+ diagnostics.push({ code: 'unclosed-example-block', line: exampleStartLine, message: 'slop-lint example block is not closed' });
274
+ }
275
+ return { units: units.filter((unit) => tokensFor(unit).length > 0), diagnostics };
276
+ }
277
+ function tokensFor(unit) {
278
+ const tokens = [];
279
+ const word = /[\p{L}\p{N}]+(?:[-'’][\p{L}\p{N}]+)*/gu;
280
+ for (const source of unit.lines) {
281
+ word.lastIndex = 0;
282
+ for (let match = word.exec(source.visible); match !== null; match = word.exec(source.visible)) {
283
+ const value = match[0];
284
+ tokens.push({
285
+ normalized: value.normalize('NFC').toLocaleLowerCase('und'),
286
+ text: source.raw.slice(match.index, match.index + value.length),
287
+ line: source.line,
288
+ columnStart: match.index + 1,
289
+ columnEnd: match.index + value.length + 1,
290
+ startOffset: source.offset + match.index,
291
+ endOffset: source.offset + match.index + value.length,
292
+ visibleLine: source.visible,
293
+ });
294
+ }
295
+ }
296
+ return tokens;
297
+ }
298
+ function valueTokens(value) {
299
+ return (value.normalize('NFC').toLocaleLowerCase('und').match(/[\p{L}\p{N}]+(?:[-'’][\p{L}\p{N}]+)*/gu) ?? []);
300
+ }
301
+ function compile(entries) {
302
+ return entries.map((entry) => ({
303
+ id: entry.id,
304
+ language: entry.language,
305
+ kind: entry.match.kind,
306
+ values: entry.match.values.map(valueTokens).filter((value) => value.length > 0),
307
+ }));
308
+ }
309
+ function tokenMatches(token, expected, kind) {
310
+ return kind === 'stem' ? token.startsWith(expected) : token === expected;
311
+ }
312
+ function candidatesFor(tokens, entries) {
313
+ const hasLatin = tokens.some((token) => /\p{Script=Latin}/u.test(token.normalized));
314
+ const hasCyrillic = tokens.some((token) => /\p{Script=Cyrillic}/u.test(token.normalized));
315
+ const candidates = [];
316
+ for (let index = 0; index < tokens.length; index += 1) {
317
+ for (const entry of entries) {
318
+ if ((entry.language === 'en' && !hasLatin) || (entry.language === 'ru' && !hasCyrillic))
319
+ continue;
320
+ for (const value of entry.values) {
321
+ if (index + value.length > tokens.length)
322
+ continue;
323
+ let matches = true;
324
+ for (let part = 0; part < value.length; part += 1) {
325
+ const actual = tokens[index + part]?.normalized ?? '';
326
+ const expected = value[part] ?? '';
327
+ if (!tokenMatches(actual, expected, entry.kind)) {
328
+ matches = false;
329
+ break;
330
+ }
331
+ }
332
+ if (matches)
333
+ candidates.push({ entry, first: index, last: index + value.length - 1 });
334
+ }
335
+ }
336
+ }
337
+ return candidates;
338
+ }
339
+ function nonOverlapping(candidates) {
340
+ const selected = [];
341
+ const occupied = new Set();
342
+ for (const candidate of [...candidates].sort((a, b) => (b.last - b.first) - (a.last - a.first) || a.entry.id.localeCompare(b.entry.id) || a.first - b.first)) {
343
+ let overlap = false;
344
+ for (let index = candidate.first; index <= candidate.last; index += 1)
345
+ if (occupied.has(index))
346
+ overlap = true;
347
+ if (overlap)
348
+ continue;
349
+ selected.push(candidate);
350
+ for (let index = candidate.first; index <= candidate.last; index += 1)
351
+ occupied.add(index);
352
+ }
353
+ return selected.sort((a, b) => a.first - b.first || compareText(a.entry.id, b.entry.id));
354
+ }
355
+ function compareText(a, b) {
356
+ return a < b ? -1 : a > b ? 1 : 0;
357
+ }
358
+ function thresholds(config, density = 0) {
359
+ return {
360
+ densityPer100Words: density,
361
+ minimumMarkers: config.lexicalMinimumMarkers,
362
+ wordFloor: config.lexicalWordFloor,
363
+ bulletMinimumItems: config.bulletMinimumItems,
364
+ bulletMinimumLineRatio: config.bulletMinimumLineRatio,
365
+ bulletMaximumMeanWords: config.bulletMaximumMeanWords,
366
+ adjectiveStackSize: config.adjectiveStackSize,
367
+ };
368
+ }
369
+ function metrics(overrides = {}) {
370
+ return {
371
+ markerCount: 0,
372
+ distinctMarkers: 0,
373
+ visibleWords: 0,
374
+ densityPer100Words: 0,
375
+ listItems: 0,
376
+ listLineRatio: 0,
377
+ listMeanWords: 0,
378
+ adjectiveCount: 0,
379
+ ...overrides,
380
+ };
381
+ }
382
+ function clip(value, limit = 160) {
383
+ const compact = value.replace(/\s+/gu, ' ').trim();
384
+ return compact.length > limit ? `${compact.slice(0, limit - 1)}…` : compact;
385
+ }
386
+ function evidenceFor(text, tokens, match) {
387
+ const first = tokens[match.first];
388
+ const last = tokens[match.last];
389
+ return {
390
+ id: match.entry.id,
391
+ language: match.entry.language,
392
+ normalizedSpan: tokens.slice(match.first, match.last + 1).map((token) => token.normalized).join(' '),
393
+ text: text.slice(first.startOffset, last.endOffset),
394
+ lineStart: first.line,
395
+ columnStart: first.columnStart,
396
+ lineEnd: last.line,
397
+ columnEnd: last.columnEnd,
398
+ startOffset: first.startOffset,
399
+ endOffset: last.endOffset,
400
+ count: 1,
401
+ };
402
+ }
403
+ function unitExcerpt(unit) {
404
+ return clip(unit.lines.map((line) => line.raw).join('\n'));
405
+ }
406
+ function lexicalFinding(text, unit, paragraph, tokens, entries, config) {
407
+ const selected = nonOverlapping(candidatesFor(tokens, entries));
408
+ const distinctMarkers = new Set(selected.map((match) => match.entry.id)).size;
409
+ if (distinctMarkers < config.lexicalMinimumMarkers)
410
+ return null;
411
+ const languages = new Set(selected.map((match) => match.entry.language));
412
+ const language = languages.size === 2 ? 'mixed' : selected[0].entry.language;
413
+ const densityThreshold = language === 'mixed'
414
+ ? Math.max(config.lexicalDensityPer100Words.en, config.lexicalDensityPer100Words.ru)
415
+ : config.lexicalDensityPer100Words[language];
416
+ // The default policy intentionally has two regimes. The distinct-ID floor owns W <= 50;
417
+ // density is a dilution cap that can reject the same two-hit cluster from W = 51 onward.
418
+ const exactDensity = 100 * selected.length / Math.max(tokens.length, config.lexicalWordFloor);
419
+ if (exactDensity < densityThreshold)
420
+ return null;
421
+ const evidence = selected.map((match) => evidenceFor(text, tokens, match));
422
+ const first = evidence[0];
423
+ const last = evidence[evidence.length - 1];
424
+ return {
425
+ ruleId: 'lexical-density',
426
+ severity: 'advisory',
427
+ paragraph,
428
+ lineStart: first.lineStart,
429
+ columnStart: first.columnStart,
430
+ lineEnd: last.lineEnd,
431
+ columnEnd: last.columnEnd,
432
+ language,
433
+ excerpt: unitExcerpt(unit),
434
+ evidence,
435
+ metrics: metrics({ markerCount: selected.length, distinctMarkers, visibleWords: tokens.length, densityPer100Words: Math.round(exactDensity * 100) / 100 }),
436
+ thresholds: thresholds(config, densityThreshold),
437
+ suggestion: 'Replace repeated stock wording with concrete facts, or keep the terms and document why the cluster is necessary.',
438
+ };
439
+ }
440
+ function stockAdjectiveLeadCount(unit, entries) {
441
+ let count = 0;
442
+ for (const line of unit.lines) {
443
+ if (!/^\s{0,3}(?:[-+*]|\d+[.)])\s+/.test(line.raw))
444
+ continue;
445
+ const lineTokens = tokensFor({ kind: 'list', lines: [line] });
446
+ if (candidatesFor(lineTokens, entries).some((candidate) => candidate.first === 0))
447
+ count += 1;
448
+ }
449
+ return count;
450
+ }
451
+ function bulletFinding(unit, paragraph, adjectiveEntries, config) {
452
+ if (unit.kind !== 'list')
453
+ return null;
454
+ const itemCount = unit.lines.filter((line) => /^\s{0,3}(?:[-+*]|\d+[.)])\s+/.test(line.raw)).length;
455
+ const lineRatio = unit.lines.length === 0 ? 0 : itemCount / unit.lines.length;
456
+ const visibleWords = tokensFor(unit).length;
457
+ const meanWords = itemCount === 0 ? 0 : visibleWords / itemCount;
458
+ if (itemCount < config.bulletMinimumItems || lineRatio < config.bulletMinimumLineRatio ||
459
+ meanWords > config.bulletMaximumMeanWords)
460
+ return null;
461
+ // Short reference tables, TOCs, procedures, and file inventories occupy the same numeric range
462
+ // as synthetic bullet walls. Require the wall to repeat a closed-registry stock-adjective lead;
463
+ // the configured item floor is also the minimum number of qualifying leads.
464
+ const adjectiveLeadCount = stockAdjectiveLeadCount(unit, adjectiveEntries);
465
+ if (adjectiveLeadCount < config.bulletMinimumItems)
466
+ return null;
467
+ const first = unit.lines[0];
468
+ const last = unit.lines[unit.lines.length - 1];
469
+ return {
470
+ ruleId: 'bullet-wall',
471
+ severity: 'advisory',
472
+ paragraph,
473
+ lineStart: first.line,
474
+ columnStart: 1,
475
+ lineEnd: last.line,
476
+ columnEnd: last.raw.length + 1,
477
+ language: 'structural',
478
+ excerpt: unitExcerpt(unit),
479
+ evidence: [],
480
+ metrics: metrics({
481
+ visibleWords,
482
+ listItems: itemCount,
483
+ listLineRatio: Math.round(lineRatio * 100) / 100,
484
+ listMeanWords: Math.round(meanWords * 100) / 100,
485
+ adjectiveCount: adjectiveLeadCount,
486
+ }),
487
+ thresholds: thresholds(config),
488
+ suggestion: 'Replace repeated stock-adjective leads with concrete, non-redundant claims; keep a reference list when its structure is essential.',
489
+ };
490
+ }
491
+ function gapAllowsStack(first, second) {
492
+ if (first.line !== second.line)
493
+ return false;
494
+ const gap = first.visibleLine.slice(first.columnEnd - 1, second.columnStart - 1)
495
+ .replace(/[\s,*_~[\]()]+/gu, ' ')
496
+ .trim()
497
+ .toLowerCase();
498
+ return gap === '';
499
+ }
500
+ function adjectiveFinding(text, unit, paragraph, tokens, entries, config) {
501
+ const matches = tokens.map((_, index) => nonOverlapping(candidatesFor(tokens.slice(index, index + 1), entries))[0] ?? null);
502
+ for (let index = 0; index + config.adjectiveStackSize <= tokens.length; index += 1) {
503
+ if (matches[index] === null || matches[index + 1] === null)
504
+ continue;
505
+ if (index > 0 && matches[index - 1] !== null)
506
+ continue;
507
+ const conjunctionIndex = index + 2;
508
+ const hasConjunction = tokens[conjunctionIndex]?.normalized === 'and' || tokens[conjunctionIndex]?.normalized === 'и';
509
+ const thirdIndex = hasConjunction ? index + 3 : index + 2;
510
+ const third = matches[thirdIndex];
511
+ if (third === null || third === undefined)
512
+ continue;
513
+ const next = matches[thirdIndex + 1];
514
+ if (tokens[thirdIndex + 1] === undefined)
515
+ continue;
516
+ if (next !== null && next !== undefined)
517
+ continue;
518
+ const indices = [index, index + 1, thirdIndex];
519
+ if (!gapAllowsStack(tokens[index], tokens[index + 1]))
520
+ continue;
521
+ if (hasConjunction) {
522
+ if (!gapAllowsStack(tokens[index + 1], tokens[conjunctionIndex]) ||
523
+ !gapAllowsStack(tokens[conjunctionIndex], tokens[thirdIndex]))
524
+ continue;
525
+ }
526
+ else if (!gapAllowsStack(tokens[index + 1], tokens[thirdIndex]))
527
+ continue;
528
+ const typed = indices.map((tokenIndex) => matches[tokenIndex]);
529
+ if (new Set(typed.map((match) => match.entry.id)).size !== config.adjectiveStackSize)
530
+ continue;
531
+ const evidence = typed.map((match, part) => evidenceFor(text, tokens, { ...match, first: indices[part], last: indices[part] }));
532
+ return {
533
+ ruleId: 'triple-adjective-stack',
534
+ severity: 'advisory',
535
+ paragraph,
536
+ lineStart: evidence[0].lineStart,
537
+ columnStart: evidence[0].columnStart,
538
+ lineEnd: evidence[evidence.length - 1].lineEnd,
539
+ columnEnd: evidence[evidence.length - 1].columnEnd,
540
+ language: new Set(evidence.map((item) => item.language)).size === 2 ? 'mixed' : evidence[0].language,
541
+ excerpt: unitExcerpt(unit),
542
+ evidence,
543
+ metrics: metrics({ visibleWords: tokens.length, adjectiveCount: config.adjectiveStackSize }),
544
+ thresholds: thresholds(config),
545
+ suggestion: 'Keep only qualifiers that add distinct, testable information.',
546
+ };
547
+ }
548
+ return null;
549
+ }
550
+ /**
551
+ * Pure deterministic style analysis. The caller supplies already-loaded policy data; this function
552
+ * performs no file, network, database, clock, locale, or process I/O and never throws.
553
+ */
554
+ export function slopLint(text, input) {
555
+ try {
556
+ if (typeof text !== 'string') {
557
+ return { paragraphCount: 0, findings: [], diagnostics: [{ code: 'analysis-error', line: 1, message: 'text must be a string' }] };
558
+ }
559
+ if (text.length > 2 * 1024 * 1024) {
560
+ return { paragraphCount: 0, findings: [], diagnostics: [{ code: 'input-limit-exceeded', line: 1, message: 'input exceeds the 2 MiB core limit' }] };
561
+ }
562
+ const configResult = validateSlopLintConfig(input?.config);
563
+ if (!configResult.ok) {
564
+ return { paragraphCount: 0, findings: [], diagnostics: [{ code: 'analysis-error', line: 1, message: configResult.errors.map((error) => `${error.field}: ${error.reason}`).join('; ') }] };
565
+ }
566
+ const registryResult = parseSlopRegistry(input?.registry);
567
+ if (!registryResult.ok) {
568
+ return { paragraphCount: 0, findings: [], diagnostics: [{ code: 'analysis-error', line: 1, message: registryResult.errors.map((error) => `${error.field}: ${error.reason}`).join('; ') }] };
569
+ }
570
+ const projected = projectUnits(text);
571
+ const markerEntries = compile(registryResult.value.markers);
572
+ const adjectiveEntries = compile(registryResult.value.adjectives);
573
+ const findings = [];
574
+ for (let index = 0; index < projected.units.length; index += 1) {
575
+ const unit = projected.units[index];
576
+ const tokens = tokensFor(unit);
577
+ const paragraph = index + 1;
578
+ const lexical = lexicalFinding(text, unit, paragraph, tokens, markerEntries, configResult.value);
579
+ const bullet = bulletFinding(unit, paragraph, adjectiveEntries, configResult.value);
580
+ const adjectives = adjectiveFinding(text, unit, paragraph, tokens, adjectiveEntries, configResult.value);
581
+ if (lexical !== null)
582
+ findings.push(lexical);
583
+ if (bullet !== null)
584
+ findings.push(bullet);
585
+ if (adjectives !== null)
586
+ findings.push(adjectives);
587
+ if (findings.length > 1_000) {
588
+ return {
589
+ paragraphCount: projected.units.length,
590
+ findings: [],
591
+ diagnostics: [...projected.diagnostics, { code: 'input-limit-exceeded', line: unit.lines[0]?.line ?? 1, message: 'finding cap exceeded; no partial clean result was returned' }],
592
+ };
593
+ }
594
+ }
595
+ findings.sort((a, b) => a.lineStart - b.lineStart || a.columnStart - b.columnStart || compareText(a.ruleId, b.ruleId) ||
596
+ compareText(a.evidence[0]?.id ?? '', b.evidence[0]?.id ?? ''));
597
+ return { paragraphCount: projected.units.length, findings, diagnostics: projected.diagnostics };
598
+ }
599
+ catch (error) {
600
+ return {
601
+ paragraphCount: 0,
602
+ findings: [],
603
+ diagnostics: [{ code: 'analysis-error', line: 1, message: error instanceof Error ? error.message : 'analysis failed' }],
604
+ };
605
+ }
606
+ }
607
+ //# sourceMappingURL=slop-lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slop-lint.js","sourceRoot":"","sources":["../src/slop-lint.ts"],"names":[],"mappings":"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"}