renma 0.1.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 (84) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +350 -0
  3. package/dist/catalog.d.ts +8 -0
  4. package/dist/catalog.d.ts.map +1 -0
  5. package/dist/catalog.js +140 -0
  6. package/dist/catalog.js.map +1 -0
  7. package/dist/cli.d.ts +2 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +301 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/commands/catalog.d.ts +24 -0
  12. package/dist/commands/catalog.d.ts.map +1 -0
  13. package/dist/commands/catalog.js +88 -0
  14. package/dist/commands/catalog.js.map +1 -0
  15. package/dist/commands/graph.d.ts +45 -0
  16. package/dist/commands/graph.d.ts.map +1 -0
  17. package/dist/commands/graph.js +344 -0
  18. package/dist/commands/graph.js.map +1 -0
  19. package/dist/commands/inspect.d.ts +36 -0
  20. package/dist/commands/inspect.d.ts.map +1 -0
  21. package/dist/commands/inspect.js +143 -0
  22. package/dist/commands/inspect.js.map +1 -0
  23. package/dist/commands/ownership.d.ts +50 -0
  24. package/dist/commands/ownership.d.ts.map +1 -0
  25. package/dist/commands/ownership.js +154 -0
  26. package/dist/commands/ownership.js.map +1 -0
  27. package/dist/commands/readiness.d.ts +64 -0
  28. package/dist/commands/readiness.d.ts.map +1 -0
  29. package/dist/commands/readiness.js +614 -0
  30. package/dist/commands/readiness.js.map +1 -0
  31. package/dist/commands/scan.d.ts +4 -0
  32. package/dist/commands/scan.d.ts.map +1 -0
  33. package/dist/commands/scan.js +12 -0
  34. package/dist/commands/scan.js.map +1 -0
  35. package/dist/commands/suggest-semantic-split.d.ts +8 -0
  36. package/dist/commands/suggest-semantic-split.d.ts.map +1 -0
  37. package/dist/commands/suggest-semantic-split.js +215 -0
  38. package/dist/commands/suggest-semantic-split.js.map +1 -0
  39. package/dist/config.d.ts +15 -0
  40. package/dist/config.d.ts.map +1 -0
  41. package/dist/config.js +184 -0
  42. package/dist/config.js.map +1 -0
  43. package/dist/discovery.d.ts +7 -0
  44. package/dist/discovery.d.ts.map +1 -0
  45. package/dist/discovery.js +122 -0
  46. package/dist/discovery.js.map +1 -0
  47. package/dist/index.d.ts +3 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +4 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/markdown.d.ts +4 -0
  52. package/dist/markdown.d.ts.map +1 -0
  53. package/dist/markdown.js +77 -0
  54. package/dist/markdown.js.map +1 -0
  55. package/dist/metadata.d.ts +8 -0
  56. package/dist/metadata.d.ts.map +1 -0
  57. package/dist/metadata.js +61 -0
  58. package/dist/metadata.js.map +1 -0
  59. package/dist/model.d.ts +56 -0
  60. package/dist/model.d.ts.map +1 -0
  61. package/dist/model.js +2 -0
  62. package/dist/model.js.map +1 -0
  63. package/dist/report.d.ts +6 -0
  64. package/dist/report.d.ts.map +1 -0
  65. package/dist/report.js +39 -0
  66. package/dist/report.js.map +1 -0
  67. package/dist/rule-engine.d.ts +16 -0
  68. package/dist/rule-engine.d.ts.map +1 -0
  69. package/dist/rule-engine.js +10 -0
  70. package/dist/rule-engine.js.map +1 -0
  71. package/dist/rules.d.ts +7 -0
  72. package/dist/rules.d.ts.map +1 -0
  73. package/dist/rules.js +1413 -0
  74. package/dist/rules.js.map +1 -0
  75. package/dist/scanner.d.ts +5 -0
  76. package/dist/scanner.d.ts.map +1 -0
  77. package/dist/scanner.js +104 -0
  78. package/dist/scanner.js.map +1 -0
  79. package/dist/types.d.ts +99 -0
  80. package/dist/types.d.ts.map +1 -0
  81. package/dist/types.js +2 -0
  82. package/dist/types.js.map +1 -0
  83. package/package.json +56 -0
  84. package/scripts/split-reference.mjs +172 -0
@@ -0,0 +1,77 @@
1
+ /** Parse a markdown artifact into headings, links, code fences, and frontmatter metadata. */
2
+ export function parseDocument(artifact) {
3
+ const lines = artifact.content.split(/\r?\n/);
4
+ const headings = [];
5
+ const links = [];
6
+ const codeFences = [];
7
+ const metadata = parseFrontmatter(lines);
8
+ let fenceStart;
9
+ let fenceLanguage = "";
10
+ let fenceLines = [];
11
+ lines.forEach((line, index) => {
12
+ const lineNumber = index + 1;
13
+ const fence = line.match(/^```(\S*)\s*$/);
14
+ if (fence) {
15
+ if (fenceStart === undefined) {
16
+ fenceStart = lineNumber;
17
+ fenceLanguage = fence[1] ?? "";
18
+ fenceLines = [];
19
+ }
20
+ else {
21
+ codeFences.push({
22
+ language: fenceLanguage,
23
+ content: fenceLines.join("\n"),
24
+ startLine: fenceStart,
25
+ endLine: lineNumber,
26
+ });
27
+ fenceStart = undefined;
28
+ fenceLanguage = "";
29
+ fenceLines = [];
30
+ }
31
+ return;
32
+ }
33
+ if (fenceStart !== undefined) {
34
+ fenceLines.push(line);
35
+ return;
36
+ }
37
+ const heading = line.match(/^(#{1,6})\s+(.+?)\s*#*$/);
38
+ if (heading) {
39
+ headings.push({
40
+ depth: heading[1]?.length ?? 1,
41
+ text: heading[2]?.trim() ?? "",
42
+ line: lineNumber,
43
+ });
44
+ }
45
+ for (const match of line.matchAll(/\[([^\]]+)\]\(([^)]+)\)/g)) {
46
+ links.push({
47
+ text: match[1] ?? "",
48
+ target: match[2] ?? "",
49
+ line: lineNumber,
50
+ });
51
+ }
52
+ });
53
+ if (fenceStart !== undefined) {
54
+ codeFences.push({
55
+ language: fenceLanguage,
56
+ content: fenceLines.join("\n"),
57
+ startLine: fenceStart,
58
+ endLine: lines.length,
59
+ });
60
+ }
61
+ return { artifact, lines, headings, codeFences, links, metadata };
62
+ }
63
+ function parseFrontmatter(lines) {
64
+ if (lines[0] !== "---")
65
+ return {};
66
+ const metadata = {};
67
+ for (let index = 1; index < lines.length; index += 1) {
68
+ const line = lines[index];
69
+ if (line === "---")
70
+ break;
71
+ const match = line?.match(/^([A-Za-z0-9_-]+):\s*(.+)$/);
72
+ if (match)
73
+ metadata[match[1]] = match[2]?.trim() ?? "";
74
+ }
75
+ return metadata;
76
+ }
77
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { AssetMetadata } from "./model.js";
2
+ import type { Diagnostic, ParsedDocument } from "./types.js";
3
+ /** Normalize parsed frontmatter into asset metadata plus validation diagnostics. */
4
+ export declare function parseAssetMetadata(document: ParsedDocument): {
5
+ metadata: AssetMetadata;
6
+ diagnostics: Diagnostic[];
7
+ };
8
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAS7D,oFAAoF;AACpF,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,cAAc,GAAG;IAC5D,QAAQ,EAAE,aAAa,CAAC;IACxB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B,CA+BA"}
@@ -0,0 +1,61 @@
1
+ const STATUSES = [
2
+ "experimental",
3
+ "stable",
4
+ "deprecated",
5
+ "archived",
6
+ ];
7
+ /** Normalize parsed frontmatter into asset metadata plus validation diagnostics. */
8
+ export function parseAssetMetadata(document) {
9
+ const diagnostics = [];
10
+ const rawStatus = document.metadata.status;
11
+ const status = parseStatus(rawStatus);
12
+ const metadata = {
13
+ tags: listValue(document.metadata.tags),
14
+ whenToUse: listValue(document.metadata.when_to_use),
15
+ whenNotToUse: listValue(document.metadata.when_not_to_use),
16
+ requiresContext: listValue(document.metadata.requires_context),
17
+ optionalContext: listValue(document.metadata.optional_context),
18
+ conflicts: listValue(document.metadata.conflicts),
19
+ supersededBy: listValue(document.metadata.superseded_by),
20
+ };
21
+ if (rawStatus !== undefined && status === undefined) {
22
+ diagnostics.push({
23
+ severity: "warning",
24
+ path: document.artifact.path,
25
+ message: `Invalid status "${rawStatus}". Expected one of: ${STATUSES.join(", ")}.`,
26
+ });
27
+ }
28
+ assignOptional(metadata, "id", optionalText(document.metadata.id));
29
+ assignOptional(metadata, "version", optionalText(document.metadata.version));
30
+ assignOptional(metadata, "owner", optionalText(document.metadata.owner));
31
+ assignOptional(metadata, "status", status);
32
+ return {
33
+ metadata,
34
+ diagnostics,
35
+ };
36
+ }
37
+ function parseStatus(value) {
38
+ if (!value)
39
+ return undefined;
40
+ return STATUSES.includes(value)
41
+ ? value
42
+ : undefined;
43
+ }
44
+ function optionalText(value) {
45
+ const trimmed = value?.trim();
46
+ return trimmed ? trimmed : undefined;
47
+ }
48
+ function listValue(value) {
49
+ if (!value)
50
+ return [];
51
+ return value
52
+ .split(",")
53
+ .map((item) => item.trim())
54
+ .filter(Boolean);
55
+ }
56
+ function assignOptional(metadata, key, value) {
57
+ if (value !== undefined) {
58
+ metadata[key] = value;
59
+ }
60
+ }
61
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAGA,MAAM,QAAQ,GAAkB;IAC9B,cAAc;IACd,QAAQ;IACR,YAAY;IACZ,UAAU;CACX,CAAC;AAEF,oFAAoF;AACpF,MAAM,UAAU,kBAAkB,CAAC,QAAwB;IAIzD,MAAM,WAAW,GAAiB,EAAE,CAAC;IACrC,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC3C,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAkB;QAC9B,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;QACvC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;QACnD,YAAY,EAAE,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC;QAC1D,eAAe,EAAE,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAC9D,eAAe,EAAE,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAC9D,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;QACjD,YAAY,EAAE,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC;KACzD,CAAC;IAEF,IAAI,SAAS,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACpD,WAAW,CAAC,IAAI,CAAC;YACf,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI;YAC5B,OAAO,EAAE,mBAAmB,SAAS,uBAAuB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;SACnF,CAAC,CAAC;IACL,CAAC;IAED,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IACnE,cAAc,CAAC,QAAQ,EAAE,SAAS,EAAE,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7E,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACzE,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAE3C,OAAO;QACL,QAAQ;QACR,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAyB;IAC5C,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO,QAAQ,CAAC,QAAQ,CAAC,KAAoB,CAAC;QAC5C,CAAC,CAAE,KAAqB;QACxB,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,KAAyB;IAC7C,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC9B,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACvC,CAAC;AAED,SAAS,SAAS,CAAC,KAAyB;IAC1C,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,KAAK;SACT,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,cAAc,CACrB,QAAuB,EACvB,GAAM,EACN,KAAmC;IAEnC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACxB,CAAC;AACH,CAAC"}
@@ -0,0 +1,56 @@
1
+ import type { ArtifactKind, Evidence } from "./types.js";
2
+ /** Lifecycle state for a skill or context asset. */
3
+ export type AssetStatus = "experimental" | "stable" | "deprecated" | "archived";
4
+ /** Artifact kinds Renma keeps in the normalized model. */
5
+ export type AssetKind = Exclude<ArtifactKind, "unknown">;
6
+ /** Relationship kinds used by graph analysis and repository validation. */
7
+ export type DependencyKind = "requires" | "optional" | "conflicts" | "extends" | "references" | "covered_by";
8
+ /** Normalized shared metadata for cataloged assets. */
9
+ export interface AssetMetadata {
10
+ id?: string;
11
+ version?: string;
12
+ owner?: string;
13
+ status?: AssetStatus;
14
+ tags: string[];
15
+ whenToUse: string[];
16
+ whenNotToUse: string[];
17
+ requiresContext: string[];
18
+ optionalContext: string[];
19
+ conflicts: string[];
20
+ supersededBy: string[];
21
+ }
22
+ /** Repository object Renma can catalog, validate, reference, or report on. */
23
+ export interface Asset {
24
+ id: string;
25
+ kind: AssetKind;
26
+ sourcePath: string;
27
+ contentHash: string;
28
+ metadata: AssetMetadata;
29
+ }
30
+ export interface Skill extends Asset {
31
+ kind: "skill";
32
+ requiredContext: string[];
33
+ optionalContext: string[];
34
+ conflicts: string[];
35
+ }
36
+ export interface SupportAsset extends Asset {
37
+ kind: Exclude<AssetKind, "skill" | "agent" | "config">;
38
+ }
39
+ /** Backwards-compatible catalog entry name for callers already using catalog output. */
40
+ export type CatalogEntry = Skill | SupportAsset;
41
+ export interface Dependency {
42
+ /** Asset ID declaring the relationship. */
43
+ from: string;
44
+ /** Asset ID or declared target named by the relationship. */
45
+ to: string;
46
+ kind: DependencyKind;
47
+ sourcePath: string;
48
+ evidence?: Evidence;
49
+ }
50
+ /** Deterministic catalog of normalized repository assets and their declared edges. */
51
+ export interface Catalog {
52
+ entries: CatalogEntry[];
53
+ assets: Asset[];
54
+ dependencies: Dependency[];
55
+ }
56
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEzD,oDAAoD;AACpD,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,CAAC;AAEhF,0DAA0D;AAC1D,MAAM,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;AAEzD,2EAA2E;AAC3E,MAAM,MAAM,cAAc,GACtB,UAAU,GACV,UAAU,GACV,WAAW,GACX,SAAS,GACT,YAAY,GACZ,YAAY,CAAC;AAEjB,uDAAuD;AACvD,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,8EAA8E;AAC9E,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,KAAM,SAAQ,KAAK;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,YAAa,SAAQ,KAAK;IACzC,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC,CAAC;CACxD;AAED,wFAAwF;AACxF,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,YAAY,CAAC;AAEhD,MAAM,WAAW,UAAU;IACzB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,cAAc,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,sFAAsF;AACtF,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,YAAY,EAAE,UAAU,EAAE,CAAC;CAC5B"}
package/dist/model.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import type { ScanResult } from "./types.js";
2
+ /** Format a scan result as stable pretty-printed JSON. */
3
+ export declare function formatJson(result: ScanResult): string;
4
+ /** Format a scan result as human-readable terminal text. */
5
+ export declare function formatText(result: ScanResult): string;
6
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,0DAA0D;AAC1D,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAErD;AAED,4DAA4D;AAC5D,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAuCrD"}
package/dist/report.js ADDED
@@ -0,0 +1,39 @@
1
+ /** Format a scan result as stable pretty-printed JSON. */
2
+ export function formatJson(result) {
3
+ return `${JSON.stringify(result, null, 2)}\n`;
4
+ }
5
+ /** Format a scan result as human-readable terminal text. */
6
+ export function formatText(result) {
7
+ const lines = [
8
+ `Renma scan`,
9
+ `Root: ${result.root}`,
10
+ `Config: ${result.configPath ?? "(defaults)"}`,
11
+ `Files scanned: ${result.scannedFileCount}`,
12
+ `Diagnostics: ${result.diagnostics.length}`,
13
+ `Exit threshold: ${result.exitThreshold}`,
14
+ `Findings: ${result.findings.length}`,
15
+ ];
16
+ if (result.findings.length === 0) {
17
+ lines.push("No findings.");
18
+ }
19
+ for (const diagnostic of result.diagnostics) {
20
+ lines.push(`diagnostic ${diagnostic.severity}: ${diagnostic.path ? `${diagnostic.path}: ` : ""}${diagnostic.message}`);
21
+ }
22
+ for (const finding of result.findings) {
23
+ lines.push("");
24
+ lines.push(`${finding.severity.toUpperCase()} ${finding.id}: ${finding.title}`);
25
+ lines.push(` ${finding.evidence.path}:${finding.evidence.startLine}`);
26
+ if (finding.evidence.snippet)
27
+ lines.push(` evidence: ${finding.evidence.snippet}`);
28
+ lines.push(` why: ${finding.whyItMatters}`);
29
+ lines.push(` fix: ${finding.remediation}`);
30
+ if (finding.constraints && finding.constraints.length > 0)
31
+ lines.push(` constraints: ${finding.constraints.join("; ")}`);
32
+ if (finding.verificationSteps && finding.verificationSteps.length > 0)
33
+ lines.push(` verify: ${finding.verificationSteps.join("; ")}`);
34
+ if (finding.llmHint)
35
+ lines.push(` llm: ${finding.llmHint}`);
36
+ }
37
+ return `${lines.join("\n")}\n`;
38
+ }
39
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAEA,0DAA0D;AAC1D,MAAM,UAAU,UAAU,CAAC,MAAkB;IAC3C,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,UAAU,CAAC,MAAkB;IAC3C,MAAM,KAAK,GAAG;QACZ,YAAY;QACZ,SAAS,MAAM,CAAC,IAAI,EAAE;QACtB,WAAW,MAAM,CAAC,UAAU,IAAI,YAAY,EAAE;QAC9C,kBAAkB,MAAM,CAAC,gBAAgB,EAAE;QAC3C,gBAAgB,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE;QAC3C,mBAAmB,MAAM,CAAC,aAAa,EAAE;QACzC,aAAa,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE;KACtC,CAAC;IAEF,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,CACR,cAAc,UAAU,CAAC,QAAQ,KAAK,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,CAC3G,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CACR,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,EAAE,KAAK,OAAO,CAAC,KAAK,EAAE,CACpE,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;QACvE,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO;YAC1B,KAAK,CAAC,IAAI,CAAC,eAAe,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5C,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC,kBAAkB,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjE,IAAI,OAAO,CAAC,iBAAiB,IAAI,OAAO,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC;YACnE,KAAK,CAAC,IAAI,CAAC,aAAa,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClE,IAAI,OAAO,CAAC,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { Catalog } from "./model.js";
2
+ import type { Finding, ParsedDocument, ScanConfig } from "./types.js";
3
+ /** Shared input passed to each deterministic rule. */
4
+ export interface RuleContext {
5
+ documents: ParsedDocument[];
6
+ catalog?: Catalog;
7
+ config: ScanConfig;
8
+ }
9
+ /** Deterministic rule that can emit findings from a shared rule context. */
10
+ export interface Rule {
11
+ id: string;
12
+ run(context: RuleContext): Finding[];
13
+ }
14
+ /** Run a list of deterministic rules and concatenate their findings. */
15
+ export declare function runRuleRegistry(documents: ParsedDocument[], rules: Rule[], catalog?: Catalog, config?: ScanConfig): Finding[];
16
+ //# sourceMappingURL=rule-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-engine.d.ts","sourceRoot":"","sources":["../src/rule-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEtE,sDAAsD;AACtD,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,4EAA4E;AAC5E,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,EAAE,CAAC;CACtC;AAED,wEAAwE;AACxE,wBAAgB,eAAe,CAC7B,SAAS,EAAE,cAAc,EAAE,EAC3B,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,CAAC,EAAE,OAAO,EACjB,MAAM,CAAC,EAAE,UAAU,GAClB,OAAO,EAAE,CAOX"}
@@ -0,0 +1,10 @@
1
+ /** Run a list of deterministic rules and concatenate their findings. */
2
+ export function runRuleRegistry(documents, rules, catalog, config) {
3
+ if (!config)
4
+ throw new Error("Rule registry requires scan config.");
5
+ const context = catalog === undefined
6
+ ? { documents, config }
7
+ : { documents, catalog, config };
8
+ return rules.flatMap((rule) => rule.run(context));
9
+ }
10
+ //# sourceMappingURL=rule-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-engine.js","sourceRoot":"","sources":["../src/rule-engine.ts"],"names":[],"mappings":"AAgBA,wEAAwE;AACxE,MAAM,UAAU,eAAe,CAC7B,SAA2B,EAC3B,KAAa,EACb,OAAiB,EACjB,MAAmB;IAEnB,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACpE,MAAM,OAAO,GACX,OAAO,KAAK,SAAS;QACnB,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE;QACvB,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACrC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Catalog } from "./model.js";
2
+ import type { Finding, ParsedDocument, ScanConfig, Severity } from "./types.js";
3
+ /** Run all deterministic rules and return findings in stable source order. */
4
+ export declare function runRules(documents: ParsedDocument[], config: ScanConfig, catalog?: Catalog): Finding[];
5
+ /** Return whether a severity is at least as severe as a configured threshold. */
6
+ export declare function severityMeets(value: Severity, threshold: Severity): boolean;
7
+ //# sourceMappingURL=rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../src/rules.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAA4B,MAAM,YAAY,CAAC;AAEpE,OAAO,KAAK,EAEV,OAAO,EACP,cAAc,EACd,UAAU,EACV,QAAQ,EACT,MAAM,YAAY,CAAC;AAwIpB,8EAA8E;AAC9E,wBAAgB,QAAQ,CACtB,SAAS,EAAE,cAAc,EAAE,EAC3B,MAAM,EAAE,UAAU,EAClB,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,EAAE,CAOX;AA+TD,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,GAAG,OAAO,CAQ3E"}