renma 0.1.1 → 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.
@@ -0,0 +1,412 @@
1
+ import { createHash } from "node:crypto";
2
+ import path from "node:path";
3
+ const FINDING_CAPS = {
4
+ "MAINT-REPEATED-SECTION": 10,
5
+ "MAINT-REPEATED-HEADING": 10,
6
+ "MAINT-REPEATED-CODE-BLOCK": 10,
7
+ "MAINT-REPEATED-LINK": 10,
8
+ "MAINT-REPEATED-CONTEXT-PATTERN": 10,
9
+ };
10
+ const SHINGLE_SIZE = 24;
11
+ const TOKEN_SHINGLE_NEARBY_LINE_WINDOW = 8;
12
+ export function repeatedContextFindingCap(id) {
13
+ return FINDING_CAPS[id];
14
+ }
15
+ const GENERIC_HEADINGS = new Set([
16
+ "overview",
17
+ "usage",
18
+ "examples",
19
+ "example",
20
+ "setup",
21
+ "installation",
22
+ "configuration",
23
+ "config",
24
+ "troubleshooting",
25
+ "notes",
26
+ "references",
27
+ "requirements",
28
+ "prerequisites",
29
+ "next steps",
30
+ "background",
31
+ "appendix",
32
+ ]);
33
+ const COMMON_CONTEXT_TOKENS = new Set([
34
+ "the",
35
+ "and",
36
+ "for",
37
+ "with",
38
+ "that",
39
+ "this",
40
+ "from",
41
+ "into",
42
+ "your",
43
+ "you",
44
+ "are",
45
+ "must",
46
+ "should",
47
+ "when",
48
+ "then",
49
+ "than",
50
+ "not",
51
+ "use",
52
+ "run",
53
+ ]);
54
+ export function detectRepeatedContextPatterns(documents) {
55
+ const findings = [
56
+ ...groupsToFindings("MAINT-REPEATED-SECTION", "Repeated section", "section_hash", collectRepeatedSections(documents), "Move the repeated section into an owned source-of-truth context or reference, then replace copies with explicit references where appropriate."),
57
+ ...groupsToFindings("MAINT-REPEATED-HEADING", "Repeated heading", "heading", collectRepeatedHeadings(documents), "Review whether these similarly named sections are intentional navigation or a sign that knowledge should be consolidated under one owned context."),
58
+ ...groupsToFindings("MAINT-REPEATED-CODE-BLOCK", "Repeated code block", "code_block", collectRepeatedCodeBlocks(documents), "Move the repeated command or code sample into one maintained reference, then link to it from dependent skills or docs."),
59
+ ...groupsToFindings("MAINT-REPEATED-LINK", "Repeated link target", "link_target", collectRepeatedLinks(documents), "Check whether the repeated link target should be declared as a shared reference or source-of-truth dependency."),
60
+ ...groupsToFindings("MAINT-REPEATED-CONTEXT-PATTERN", "Repeated context pattern", "token_shingle", collectRepeatedTokenShingles(documents), "Use the repeated token sequence as evidence for a consolidation proposal, then have a human approve any reviewable patch."),
61
+ ];
62
+ return findings.sort(compareFindings);
63
+ }
64
+ function collectRepeatedSections(documents) {
65
+ const groups = new Map();
66
+ for (const document of documents) {
67
+ for (let index = 0; index < document.headings.length; index += 1) {
68
+ const heading = document.headings[index];
69
+ if (!heading)
70
+ continue;
71
+ const endLine = findSectionEndLine(document, index);
72
+ const lines = document.lines.slice(heading.line - 1, endLine);
73
+ const normalized = normalizeWhitespace(lines.join("\n"));
74
+ if (tokenCount(normalized) < 40 || normalized.length < 240)
75
+ continue;
76
+ const key = hashText(normalized);
77
+ addOccurrence(groups, {
78
+ kind: "section_hash",
79
+ key,
80
+ label: `section hash ${key.slice(0, 12)}`,
81
+ occurrence: {
82
+ path: document.artifact.path,
83
+ startLine: heading.line,
84
+ endLine,
85
+ snippet: snippet(lines),
86
+ },
87
+ });
88
+ }
89
+ }
90
+ return repeatedCrossFileGroups(groups, 2);
91
+ }
92
+ function collectRepeatedHeadings(documents) {
93
+ const groups = new Map();
94
+ for (const document of documents) {
95
+ for (const heading of document.headings) {
96
+ const normalized = normalizeHeading(heading.text);
97
+ if (normalized.length < 24 ||
98
+ tokenCount(normalized) < 3 ||
99
+ GENERIC_HEADINGS.has(normalized)) {
100
+ continue;
101
+ }
102
+ addOccurrence(groups, {
103
+ kind: "heading",
104
+ key: normalized,
105
+ label: heading.text,
106
+ occurrence: {
107
+ path: document.artifact.path,
108
+ startLine: heading.line,
109
+ endLine: heading.line,
110
+ snippet: document.lines[heading.line - 1] ?? heading.text,
111
+ },
112
+ });
113
+ }
114
+ }
115
+ return repeatedCrossFileGroups(groups, 2);
116
+ }
117
+ function collectRepeatedCodeBlocks(documents) {
118
+ const groups = new Map();
119
+ for (const document of documents) {
120
+ for (const fence of document.codeFences) {
121
+ const normalized = normalizeWhitespace(fence.content);
122
+ if (normalized.length < 80 || tokenCount(normalized) < 10)
123
+ continue;
124
+ const language = fence.language || "plain";
125
+ const key = hashText(`${language}\n${normalized}`);
126
+ addOccurrence(groups, {
127
+ kind: "code_block",
128
+ key,
129
+ label: `${language} code block ${key.slice(0, 12)}`,
130
+ occurrence: {
131
+ path: document.artifact.path,
132
+ startLine: fence.startLine,
133
+ endLine: fence.endLine,
134
+ snippet: snippet(document.lines.slice(fence.startLine - 1, fence.endLine)),
135
+ },
136
+ });
137
+ }
138
+ }
139
+ return repeatedCrossFileGroups(groups, 2);
140
+ }
141
+ function collectRepeatedLinks(documents) {
142
+ const groups = new Map();
143
+ for (const document of documents) {
144
+ for (const link of document.links) {
145
+ const target = normalizeLocalMarkdownLinkTarget(link.target, document.artifact.path);
146
+ if (!target)
147
+ continue;
148
+ addOccurrence(groups, {
149
+ kind: "link_target",
150
+ key: target,
151
+ label: target,
152
+ occurrence: {
153
+ path: document.artifact.path,
154
+ startLine: link.line,
155
+ endLine: link.line,
156
+ snippet: document.lines[link.line - 1] ?? link.target,
157
+ },
158
+ });
159
+ }
160
+ }
161
+ return repeatedCrossFileGroups(groups, 3);
162
+ }
163
+ function collectRepeatedTokenShingles(documents) {
164
+ const groups = new Map();
165
+ for (const document of documents) {
166
+ const tokens = tokenizeDocument(document);
167
+ const seenInDocument = new Set();
168
+ for (let index = 0; index <= tokens.length - SHINGLE_SIZE; index += 1) {
169
+ const shingle = tokens.slice(index, index + SHINGLE_SIZE);
170
+ const words = shingle.map((token) => token.value);
171
+ const key = words.join(" ");
172
+ if (seenInDocument.has(key))
173
+ continue;
174
+ if (!isUsefulShingle(words))
175
+ continue;
176
+ seenInDocument.add(key);
177
+ const startLine = shingle[0]?.line ?? 1;
178
+ const endLine = shingle[shingle.length - 1]?.line ?? startLine;
179
+ addOccurrence(groups, {
180
+ kind: "token_shingle",
181
+ key,
182
+ label: `${SHINGLE_SIZE}-token pattern`,
183
+ occurrence: {
184
+ path: document.artifact.path,
185
+ startLine,
186
+ endLine,
187
+ snippet: snippet(document.lines.slice(startLine - 1, endLine)),
188
+ },
189
+ });
190
+ }
191
+ }
192
+ return collapseNearDuplicateTokenShingles(repeatedCrossFileGroups(groups, 2));
193
+ }
194
+ function groupsToFindings(id, title, kind, groups, remediation) {
195
+ return groups
196
+ .filter((group) => group.kind === kind)
197
+ .sort(compareGroups)
198
+ .slice(0, repeatedContextFindingCap(id))
199
+ .flatMap((group) => {
200
+ const occurrences = sortOccurrences(group.occurrences);
201
+ const first = occurrences[0];
202
+ if (!first)
203
+ return [];
204
+ const others = occurrences.slice(1, 5);
205
+ const alsoAppears = formatOtherOccurrences(others);
206
+ return [
207
+ {
208
+ id,
209
+ title,
210
+ category: "maintenance",
211
+ severity: kind === "heading" || kind === "link_target" ? "low" : "medium",
212
+ confidence: confidenceForKind(kind),
213
+ evidence: {
214
+ path: first.path,
215
+ startLine: first.startLine,
216
+ endLine: first.endLine,
217
+ snippet: first.snippet,
218
+ },
219
+ remediation,
220
+ whyItMatters: "Repeated agent context can drift across skills, agents, references, and examples. Renma reports deterministic evidence so an LLM or maintainer can propose consolidation and a human can approve it.",
221
+ llmHint: `${title} detected for ${group.label}. ${alsoAppears} Use these locations as evidence for a consolidation proposal, but do not treat them as an automatic source-of-truth decision.`,
222
+ constraints: [
223
+ "Do not delete or rewrite content solely because this finding exists.",
224
+ "Preserve procedural details and ownership boundaries while consolidating.",
225
+ "Treat this as deterministic evidence, not a semantic source-of-truth decision.",
226
+ ],
227
+ verificationSteps: [
228
+ "Review all reported occurrences and choose an owned source of truth.",
229
+ "Run renma scan after any consolidation patch.",
230
+ ],
231
+ },
232
+ ];
233
+ });
234
+ }
235
+ function addOccurrence(groups, input) {
236
+ const groupKey = `${input.kind}:${input.key}`;
237
+ const existing = groups.get(groupKey);
238
+ if (existing) {
239
+ existing.occurrences.push(input.occurrence);
240
+ return;
241
+ }
242
+ groups.set(groupKey, {
243
+ kind: input.kind,
244
+ key: input.key,
245
+ label: input.label,
246
+ occurrences: [input.occurrence],
247
+ });
248
+ }
249
+ function repeatedCrossFileGroups(groups, minimumPaths) {
250
+ return [...groups.values()].filter((group) => distinctPaths(group.occurrences).size >= minimumPaths);
251
+ }
252
+ function collapseNearDuplicateTokenShingles(groups) {
253
+ const selected = [];
254
+ for (const group of [...groups].sort(compareTokenShingleRepresentatives)) {
255
+ if (selected.some((representative) => isNearDuplicateTokenShingleGroup(group, representative))) {
256
+ continue;
257
+ }
258
+ selected.push(group);
259
+ }
260
+ return selected;
261
+ }
262
+ function isNearDuplicateTokenShingleGroup(candidate, representative) {
263
+ const candidatePrimary = sortOccurrences(candidate.occurrences)[0];
264
+ const representativePrimary = sortOccurrences(representative.occurrences)[0];
265
+ if (!candidatePrimary || !representativePrimary)
266
+ return false;
267
+ if (candidatePrimary.path === representativePrimary.path &&
268
+ Math.abs(candidatePrimary.startLine - representativePrimary.startLine) <=
269
+ TOKEN_SHINGLE_NEARBY_LINE_WINDOW) {
270
+ return true;
271
+ }
272
+ return (alsoAppearsSignature(candidate.occurrences) ===
273
+ alsoAppearsSignature(representative.occurrences));
274
+ }
275
+ function compareTokenShingleRepresentatives(left, right) {
276
+ const leftPrimary = sortOccurrences(left.occurrences)[0];
277
+ const rightPrimary = sortOccurrences(right.occurrences)[0];
278
+ return ((leftPrimary?.path ?? "").localeCompare(rightPrimary?.path ?? "") ||
279
+ (leftPrimary?.startLine ?? 0) - (rightPrimary?.startLine ?? 0) ||
280
+ (leftPrimary?.endLine ?? 0) - (rightPrimary?.endLine ?? 0) ||
281
+ left.key.localeCompare(right.key));
282
+ }
283
+ function alsoAppearsSignature(occurrences) {
284
+ const sorted = sortOccurrences(occurrences);
285
+ const primary = sorted[0];
286
+ return sorted
287
+ .filter((occurrence) => occurrence !== primary)
288
+ .map((occurrence) => `${occurrence.path}:L${occurrence.startLine}`)
289
+ .sort()
290
+ .join("|");
291
+ }
292
+ function findSectionEndLine(document, headingIndex) {
293
+ const heading = document.headings[headingIndex];
294
+ if (!heading)
295
+ return document.lines.length;
296
+ const nextPeer = document.headings
297
+ .slice(headingIndex + 1)
298
+ .find((candidate) => candidate.depth <= heading.depth);
299
+ return nextPeer ? nextPeer.line - 1 : document.lines.length;
300
+ }
301
+ function tokenizeDocument(document) {
302
+ const codeLines = new Set();
303
+ for (const fence of document.codeFences) {
304
+ for (let line = fence.startLine; line <= fence.endLine; line += 1) {
305
+ codeLines.add(line);
306
+ }
307
+ }
308
+ const tokens = [];
309
+ for (let index = 0; index < document.lines.length; index += 1) {
310
+ const lineNumber = index + 1;
311
+ if (codeLines.has(lineNumber))
312
+ continue;
313
+ const line = document.lines[index] ?? "";
314
+ const matches = line.matchAll(/[A-Za-z0-9][A-Za-z0-9_./:-]*/g);
315
+ for (const match of matches) {
316
+ const value = match[0]?.toLowerCase();
317
+ if (!value || value.length < 3)
318
+ continue;
319
+ tokens.push({ value, line: lineNumber });
320
+ }
321
+ }
322
+ return tokens;
323
+ }
324
+ function isUsefulShingle(words) {
325
+ const uniqueWords = new Set(words);
326
+ if (uniqueWords.size < 12)
327
+ return false;
328
+ const usefulWords = words.filter((word) => !COMMON_CONTEXT_TOKENS.has(word));
329
+ if (usefulWords.length < 14)
330
+ return false;
331
+ return words.join(" ").length >= 140;
332
+ }
333
+ function normalizeLocalMarkdownLinkTarget(value, sourcePath) {
334
+ const target = normalizeWhitespace(value);
335
+ if (!target ||
336
+ target.startsWith("#") ||
337
+ /^[a-z][a-z0-9+.-]*:/i.test(target)) {
338
+ return undefined;
339
+ }
340
+ const withoutFragment = target.replace(/#.*/, "").replace(/\?.*/, "");
341
+ if (!withoutFragment)
342
+ return undefined;
343
+ const normalizedTarget = withoutFragment.replace(/\\/g, "/");
344
+ const normalizedSource = sourcePath.replace(/\\/g, "/");
345
+ const sourceDirectory = path.posix.dirname(normalizedSource);
346
+ const resolved = normalizedTarget.startsWith("/")
347
+ ? path.posix.normalize(normalizedTarget.slice(1))
348
+ : path.posix.normalize(path.posix.join(sourceDirectory === "." ? "" : sourceDirectory, normalizedTarget));
349
+ if (!resolved || resolved === "." || resolved.startsWith("../")) {
350
+ return undefined;
351
+ }
352
+ const repositoryRelative = resolved.replace(/^\.\//, "");
353
+ if (!repositoryRelative.includes("/") &&
354
+ !repositoryRelative.endsWith(".md") &&
355
+ !repositoryRelative.endsWith(".mdx")) {
356
+ return undefined;
357
+ }
358
+ return repositoryRelative;
359
+ }
360
+ function normalizeHeading(value) {
361
+ return normalizeWhitespace(value)
362
+ .replace(/^#+\s*/, "")
363
+ .replace(/\s+#+$/, "")
364
+ .toLowerCase();
365
+ }
366
+ function normalizeWhitespace(value) {
367
+ return value.replace(/\s+/g, " ").trim();
368
+ }
369
+ function hashText(value) {
370
+ return createHash("sha256").update(value).digest("hex");
371
+ }
372
+ function tokenCount(value) {
373
+ return value.length === 0 ? 0 : value.split(/\s+/).length;
374
+ }
375
+ function snippet(lines) {
376
+ return lines.join("\n").trim().slice(0, 600);
377
+ }
378
+ function sortOccurrences(occurrences) {
379
+ return [...occurrences].sort((left, right) => left.path.localeCompare(right.path) || left.startLine - right.startLine);
380
+ }
381
+ function distinctPaths(occurrences) {
382
+ return new Set(occurrences.map((occurrence) => occurrence.path));
383
+ }
384
+ function compareGroups(left, right) {
385
+ return (distinctPaths(right.occurrences).size -
386
+ distinctPaths(left.occurrences).size ||
387
+ right.occurrences.length - left.occurrences.length ||
388
+ left.label.localeCompare(right.label) ||
389
+ left.key.localeCompare(right.key));
390
+ }
391
+ function compareFindings(left, right) {
392
+ return (left.id.localeCompare(right.id) ||
393
+ left.evidence.path.localeCompare(right.evidence.path) ||
394
+ left.evidence.startLine - right.evidence.startLine);
395
+ }
396
+ function confidenceForKind(kind) {
397
+ switch (kind) {
398
+ case "section_hash":
399
+ case "code_block":
400
+ return "high";
401
+ case "token_shingle":
402
+ return "medium";
403
+ case "heading":
404
+ case "link_target":
405
+ return "low";
406
+ }
407
+ }
408
+ function formatOtherOccurrences(occurrences) {
409
+ const locations = occurrences.map((occurrence) => `${occurrence.path}:L${occurrence.startLine}`);
410
+ return `Also appears in ${locations.join("; ")}.`;
411
+ }
412
+ //# sourceMappingURL=repeated-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repeated-context.js","sourceRoot":"","sources":["../src/repeated-context.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAI/D,OAAO,KAAK,EAAuB,UAAU,EAAE,MAAM,YAAY,CAAC;AAElE,sEAAsE;AACtE,wBAAsB,IAAI,CACxB,UAAU,EAAE,MAAM,EAClB,SAAS,GAAE,eAAoB,GAC9B,OAAO,CAAC,UAAU,CAAC,CAwBrB"}
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAM/D,OAAO,KAAK,EAAuB,UAAU,EAAE,MAAM,YAAY,CAAC;AAElE,sEAAsE;AACtE,wBAAsB,IAAI,CACxB,UAAU,EAAE,MAAM,EAClB,SAAS,GAAE,eAAoB,GAC9B,OAAO,CAAC,UAAU,CAAC,CA0BrB"}
package/dist/scanner.js CHANGED
@@ -3,7 +3,9 @@ import { buildCatalog } from "./catalog.js";
3
3
  import { loadConfig } from "./config.js";
4
4
  import { discoverArtifacts } from "./discovery.js";
5
5
  import { parseDocument } from "./markdown.js";
6
+ import { detectRepeatedContextPatterns } from "./repeated-context.js";
6
7
  import { runRules } from "./rules.js";
8
+ import { securityDiagnosticFindings } from "./security-diagnostics.js";
7
9
  /** Run the complete deterministic scan pipeline for a target path. */
8
10
  export async function scan(targetPath, overrides = {}) {
9
11
  const root = path.resolve(targetPath);
@@ -13,7 +15,9 @@ export async function scan(targetPath, overrides = {}) {
13
15
  const catalogResult = buildCatalog(documents);
14
16
  const findings = [
15
17
  ...runRules(documents, config, catalogResult.catalog),
18
+ ...detectRepeatedContextPatterns(documents),
16
19
  ...catalogDiagnosticFindings(catalogResult.diagnostics),
20
+ ...securityDiagnosticFindings(artifacts, config),
17
21
  ].sort((a, b) => {
18
22
  const byPath = a.evidence.path.localeCompare(b.evidence.path);
19
23
  if (byPath !== 0)
@@ -1 +1 @@
1
- {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Artifact, Finding, SecurityConfig } from "./types.js";
2
+ type SecurityDiagnosticsConfig = {
3
+ security?: SecurityConfig;
4
+ };
5
+ export declare function securityDiagnosticFindings(artifacts: Artifact[], config?: SecurityDiagnosticsConfig): Finding[];
6
+ export {};
7
+ //# sourceMappingURL=security-diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-diagnostics.d.ts","sourceRoot":"","sources":["../src/security-diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA6lBpE,KAAK,yBAAyB,GAAG;IAC/B,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B,CAAC;AAEF,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,QAAQ,EAAE,EACrB,MAAM,GAAE,yBAA8B,GACrC,OAAO,EAAE,CAIX"}