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,12 @@
1
+ import { formatJson, formatText } from "../report.js";
2
+ import { scan } from "../scanner.js";
3
+ import { severityMeets } from "../rules.js";
4
+ /** Execute the scan command, write its report to stdout, and return an exit code. */
5
+ export async function runScanCommand(target, overrides) {
6
+ const result = await scan(target, overrides);
7
+ process.stdout.write(result.format === "json" ? formatJson(result) : formatText(result));
8
+ return result.findings.some((finding) => severityMeets(finding.severity, result.exitThreshold))
9
+ ? 1
10
+ : 0;
11
+ }
12
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAc,EACd,SAA0B;IAE1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CACnE,CAAC;IAEF,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CACtC,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,aAAa,CAAC,CACtD;QACC,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,CAAC,CAAC;AACR,CAAC"}
@@ -0,0 +1,8 @@
1
+ export type SuggestSemanticSplitFormat = "prompt" | "json";
2
+ export interface SuggestSemanticSplitOptions {
3
+ format?: SuggestSemanticSplitFormat;
4
+ maxContextBytes?: number;
5
+ maxSourceBytes?: number;
6
+ }
7
+ export declare function runSuggestSemanticSplitCommand(target: string, options?: SuggestSemanticSplitOptions): Promise<number>;
8
+ //# sourceMappingURL=suggest-semantic-split.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest-semantic-split.d.ts","sourceRoot":"","sources":["../../src/commands/suggest-semantic-split.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,0BAA0B,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE3D,MAAM,WAAW,2BAA2B;IAC1C,MAAM,CAAC,EAAE,0BAA0B,CAAC;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAsCD,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,MAAM,CAAC,CAYjB"}
@@ -0,0 +1,215 @@
1
+ import { readdir, readFile, stat } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { buildInspectOutline } from "./inspect.js";
4
+ const DEFAULT_MAX_CONTEXT_BYTES = 32 * 1024;
5
+ const CONTEXT_DIRS = new Set(["references", "profiles", "examples", "r"]);
6
+ export async function runSuggestSemanticSplitCommand(target, options = {}) {
7
+ const semanticSplitReviewBundle = await buildSemanticSplitReviewBundle(target, options);
8
+ const format = options.format ?? "prompt";
9
+ process.stdout.write(format === "json"
10
+ ? `${JSON.stringify(semanticSplitReviewBundle, null, 2)}\n`
11
+ : renderCodexPrompt(semanticSplitReviewBundle));
12
+ return 0;
13
+ }
14
+ async function buildSemanticSplitReviewBundle(target, options) {
15
+ const sourcePath = path.resolve(target);
16
+ const sourceOutline = await buildInspectOutline(sourcePath);
17
+ const skillDir = await findSkillDir(path.dirname(sourcePath));
18
+ const skillPath = skillDir ? path.join(skillDir, "SKILL.md") : null;
19
+ const skill = skillPath
20
+ ? await readLimitedText(skillPath, options.maxContextBytes ?? DEFAULT_MAX_CONTEXT_BYTES)
21
+ : null;
22
+ const skillContext = skill && skillPath
23
+ ? {
24
+ bytesRead: skill.bytesRead,
25
+ path: skillPath,
26
+ text: skill.text,
27
+ truncated: skill.truncated,
28
+ }
29
+ : null;
30
+ const siblingContext = skillDir
31
+ ? await collectSiblingContext(skillDir, sourcePath, options.maxContextBytes ?? DEFAULT_MAX_CONTEXT_BYTES)
32
+ : [];
33
+ return {
34
+ context: {
35
+ siblingFiles: siblingContext,
36
+ skill: skillContext,
37
+ skillDir,
38
+ },
39
+ helperCommands: {
40
+ outline: `renma inspect ${shellQuote(sourcePath)} --format json`,
41
+ sliceExample: `renma inspect ${shellQuote(sourcePath)} --lines L10-L42 --format text`,
42
+ },
43
+ mode: "codex-semantic-split-prompt",
44
+ mutatesFiles: false,
45
+ source: {
46
+ outline: sourceOutline,
47
+ path: sourcePath,
48
+ },
49
+ };
50
+ }
51
+ function renderCodexPrompt(semanticSplitReviewBundle) {
52
+ const { source } = semanticSplitReviewBundle;
53
+ const { context } = semanticSplitReviewBundle;
54
+ const siblingSummary = context.siblingFiles.length > 0
55
+ ? context.siblingFiles
56
+ .map((file) => `### ${file.path}\nBytes read: ${file.bytesRead}${file.truncated ? " (truncated)" : ""}\n${fence(file.preview)}`)
57
+ .join("\n\n")
58
+ : "(none found)";
59
+ return `${[
60
+ "# Codex Task: Suggest Semantic Reference Split",
61
+ "",
62
+ "You are improving an AI-agent skill repository.",
63
+ "",
64
+ "Read the compact source outline and nearby context. Suggest a semantic split plan for the source file based on meaning, not byte size and not predefined categories.",
65
+ "",
66
+ "Infer the best split direction as a human maintainer would. For example, choose platform-specific files only if the content itself separates macOS/Linux, Windows, etc. If the better boundary is setup phase, troubleshooting area, tool, workflow mode, audience, prerequisite, verification, or something else, choose that instead.",
67
+ "",
68
+ "Use deterministic inspection helpers when the outline is not enough. Prefer these helpers over ad hoc cat/sed calls so token usage stays low:",
69
+ `- Outline: \`${semanticSplitReviewBundle.helperCommands.outline}\``,
70
+ `- Exact slice: \`${semanticSplitReviewBundle.helperCommands.sliceExample}\``,
71
+ "",
72
+ "Do not rewrite files. Return only a proposal.",
73
+ "",
74
+ "Return strict JSON with this shape:",
75
+ "",
76
+ fence(`{
77
+ "source": "${source.path}",
78
+ "shouldSplit": true,
79
+ "splitDirection": "one sentence describing the semantic boundary",
80
+ "suggestedFiles": [
81
+ {
82
+ "path": "suggested repo-relative or source-neighbor path",
83
+ "category": "human-readable category",
84
+ "why": "why this category belongs together",
85
+ "sourceRanges": ["L10-L42", "L80-L120"],
86
+ "usageHint": "when SKILL.md should reference this file"
87
+ }
88
+ ],
89
+ "sharedContent": [
90
+ {
91
+ "sourceRanges": ["L1-L9"],
92
+ "recommendation": "keep in a common file, duplicate intentionally, or reference from SKILL.md"
93
+ }
94
+ ],
95
+ "skillGuidanceUpdate": "brief SKILL.md usage and reference guidance",
96
+ "risks": ["coverage or validation concerns"],
97
+ "confidence": 0.0
98
+ }`),
99
+ "",
100
+ "Rules:",
101
+ "- Use source line ranges from the outline and exact line slices.",
102
+ "- Do not split inside fenced code blocks.",
103
+ "- Do not drop warnings, prerequisites, rollback, or verification steps.",
104
+ "- Name files by meaning, not by part number.",
105
+ "- If the source should remain one file, set shouldSplit to false and suggestedFiles to [].",
106
+ "- Return JSON only. Do not include Markdown outside the JSON.",
107
+ "",
108
+ "## Source Outline",
109
+ "",
110
+ fence(JSON.stringify(source.outline, null, 2)),
111
+ "",
112
+ "## Nearby SKILL.md",
113
+ "",
114
+ context.skill
115
+ ? `Path: ${context.skill.path}\nBytes read: ${context.skill.bytesRead}${context.skill.truncated ? " (truncated)" : ""}\n\n${fence(context.skill.text)}`
116
+ : "(not found)",
117
+ "",
118
+ "## Sibling Context Files",
119
+ "",
120
+ siblingSummary,
121
+ "",
122
+ ].join("\n")}\n`;
123
+ }
124
+ async function findSkillDir(startDir) {
125
+ let current = startDir;
126
+ while (true) {
127
+ try {
128
+ const skill = path.join(current, "SKILL.md");
129
+ if ((await stat(skill)).isFile()) {
130
+ return current;
131
+ }
132
+ }
133
+ catch {
134
+ // Keep walking upward.
135
+ }
136
+ const parent = path.dirname(current);
137
+ if (parent === current) {
138
+ return null;
139
+ }
140
+ current = parent;
141
+ }
142
+ }
143
+ async function collectSiblingContext(skillDir, sourcePath, maxBytes) {
144
+ const files = await walk(skillDir);
145
+ const contextFiles = [];
146
+ for (const filePath of files.sort()) {
147
+ if (filePath === sourcePath || path.basename(filePath) === "SKILL.md") {
148
+ continue;
149
+ }
150
+ const relative = path.relative(skillDir, filePath);
151
+ const [topLevel] = relative.split(path.sep);
152
+ if (!topLevel || !CONTEXT_DIRS.has(topLevel) || !filePath.endsWith(".md")) {
153
+ continue;
154
+ }
155
+ const text = await readLimitedText(filePath, Math.min(maxBytes, 4 * 1024));
156
+ contextFiles.push({
157
+ bytesRead: text.bytesRead,
158
+ path: filePath,
159
+ preview: previewMarkdown(text.text),
160
+ truncated: text.truncated,
161
+ });
162
+ if (contextFiles.length >= 80) {
163
+ break;
164
+ }
165
+ }
166
+ return contextFiles;
167
+ }
168
+ async function walk(dir) {
169
+ const entries = await readdir(dir, { withFileTypes: true });
170
+ const files = [];
171
+ for (const entry of entries) {
172
+ if (entry.name === "node_modules" || entry.name === ".git") {
173
+ continue;
174
+ }
175
+ const entryPath = path.join(dir, entry.name);
176
+ if (entry.isDirectory()) {
177
+ files.push(...(await walk(entryPath)));
178
+ }
179
+ else if (entry.isFile()) {
180
+ files.push(entryPath);
181
+ }
182
+ }
183
+ return files;
184
+ }
185
+ async function readLimitedText(filePath, maxBytes) {
186
+ const buffer = await readFile(filePath);
187
+ const slice = buffer.subarray(0, maxBytes);
188
+ return {
189
+ bytesRead: slice.byteLength,
190
+ text: slice.toString("utf8"),
191
+ truncated: buffer.byteLength > maxBytes,
192
+ };
193
+ }
194
+ function previewMarkdown(text) {
195
+ const lines = text.split(/\n/);
196
+ const preview = [];
197
+ for (const line of lines) {
198
+ if (/^#{1,6}\s+/.test(line) ||
199
+ /^description:\s*/i.test(line) ||
200
+ /^name:\s*/i.test(line)) {
201
+ preview.push(line);
202
+ }
203
+ if (preview.length >= 8) {
204
+ break;
205
+ }
206
+ }
207
+ return preview.length > 0 ? preview.join("\n") : lines.slice(0, 8).join("\n");
208
+ }
209
+ function fence(text) {
210
+ return `\`\`\`text\n${text}\n\`\`\``;
211
+ }
212
+ function shellQuote(value) {
213
+ return `'${value.replaceAll("'", "'\\''")}'`;
214
+ }
215
+ //# sourceMappingURL=suggest-semantic-split.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest-semantic-split.js","sourceRoot":"","sources":["../../src/commands/suggest-semantic-split.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { LoadedConfig, ScanConfig, Severity } from "./types.js";
2
+ /** Default scan configuration used when no config file or CLI overrides apply. */
3
+ export declare const DEFAULT_CONFIG: ScanConfig;
4
+ /** Error raised for invalid Renma configuration or CLI configuration input. */
5
+ export declare class ConfigError extends Error {
6
+ }
7
+ /** CLI-level overrides merged on top of discovered configuration. */
8
+ export interface ConfigOverrides {
9
+ configPath?: string;
10
+ failOn?: Severity;
11
+ format?: "text" | "json";
12
+ }
13
+ /** Load, validate, and merge scan configuration for a repository root. */
14
+ export declare function loadConfig(root: string, overrides: ConfigOverrides): Promise<LoadedConfig>;
15
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAKrE,kFAAkF;AAClF,eAAO,MAAM,cAAc,EAAE,UAuB5B,CAAC;AAEF,+EAA+E;AAC/E,qBAAa,WAAY,SAAQ,KAAK;CAAG;AAEzC,qEAAqE;AACrE,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1B;AAED,0EAA0E;AAC1E,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,eAAe,GACzB,OAAO,CAAC,YAAY,CAAC,CAiBvB"}
package/dist/config.js ADDED
@@ -0,0 +1,184 @@
1
+ import { access, readFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ const SEVERITIES = ["low", "medium", "high", "critical"];
4
+ const FORMATS = ["text", "json"];
5
+ /** Default scan configuration used when no config file or CLI overrides apply. */
6
+ export const DEFAULT_CONFIG = {
7
+ failOn: "high",
8
+ format: "text",
9
+ globs: [
10
+ "skills/**/SKILL.md",
11
+ ".agents/**/*.md",
12
+ "AGENTS.md",
13
+ "README.md",
14
+ "context/**/*.md",
15
+ "contexts/**/*.md",
16
+ "skills/**/profiles/**/*.md",
17
+ "skills/**/references/**/*.md",
18
+ "skills/**/examples/**/*.md",
19
+ "skills/**/scripts/**/*",
20
+ "tools/**/*",
21
+ ],
22
+ exclude: ["node_modules", "dist", ".git"],
23
+ maxFileSizeBytes: 512 * 1024,
24
+ maxDepth: 16,
25
+ concurrency: 16,
26
+ layout: {
27
+ workflowAliases: {},
28
+ },
29
+ };
30
+ /** Error raised for invalid Renma configuration or CLI configuration input. */
31
+ export class ConfigError extends Error {
32
+ }
33
+ /** Load, validate, and merge scan configuration for a repository root. */
34
+ export async function loadConfig(root, overrides) {
35
+ const discoveredPath = overrides.configPath ?? (await findDefaultConfig(root));
36
+ const fileConfig = discoveredPath ? await readConfigFile(discoveredPath) : {};
37
+ const config = normalizeConfig(fileConfig, discoveredPath);
38
+ return {
39
+ config: {
40
+ ...DEFAULT_CONFIG,
41
+ ...config,
42
+ failOn: overrides.failOn ?? config.failOn ?? DEFAULT_CONFIG.failOn,
43
+ format: overrides.format ?? config.format ?? DEFAULT_CONFIG.format,
44
+ },
45
+ ...(discoveredPath
46
+ ? { configPath: toPosix(path.relative(root, discoveredPath)) }
47
+ : {}),
48
+ };
49
+ }
50
+ async function findDefaultConfig(root) {
51
+ for (const name of ["renma.config.json", ".renma.json"]) {
52
+ const candidate = path.join(root, name);
53
+ try {
54
+ await access(candidate);
55
+ return candidate;
56
+ }
57
+ catch {
58
+ // Try the next conventional name.
59
+ }
60
+ }
61
+ return undefined;
62
+ }
63
+ async function readConfigFile(configPath) {
64
+ let raw;
65
+ try {
66
+ raw = await readFile(configPath, "utf8");
67
+ }
68
+ catch (error) {
69
+ throw new ConfigError(`Could not read config file ${configPath}: ${errorMessage(error)}`);
70
+ }
71
+ try {
72
+ return JSON.parse(raw);
73
+ }
74
+ catch (error) {
75
+ throw new ConfigError(`Config file ${configPath} is not valid JSON: ${errorMessage(error)}`);
76
+ }
77
+ }
78
+ function normalizeConfig(value, configPath) {
79
+ if (value === undefined || value === null)
80
+ return {};
81
+ if (!isRecord(value)) {
82
+ throw new ConfigError(`Config${label(configPath)} must be a JSON object.`);
83
+ }
84
+ const allowed = new Set([
85
+ "fail_on",
86
+ "format",
87
+ "globs",
88
+ "exclude",
89
+ "max_file_size_bytes",
90
+ "max_depth",
91
+ "concurrency",
92
+ "layout",
93
+ ]);
94
+ for (const key of Object.keys(value)) {
95
+ if (!allowed.has(key)) {
96
+ throw new ConfigError(`Unknown config field "${key}"${label(configPath)}.`);
97
+ }
98
+ }
99
+ const config = {};
100
+ if (value.fail_on !== undefined)
101
+ config.failOn = enumValue("fail_on", value.fail_on, SEVERITIES);
102
+ if (value.format !== undefined)
103
+ config.format = enumValue("format", value.format, FORMATS);
104
+ if (value.globs !== undefined)
105
+ config.globs = stringArray("globs", value.globs);
106
+ if (value.exclude !== undefined)
107
+ config.exclude = stringArray("exclude", value.exclude);
108
+ if (value.max_file_size_bytes !== undefined) {
109
+ config.maxFileSizeBytes = positiveInteger("max_file_size_bytes", value.max_file_size_bytes);
110
+ }
111
+ if (value.max_depth !== undefined)
112
+ config.maxDepth = positiveInteger("max_depth", value.max_depth);
113
+ if (value.concurrency !== undefined)
114
+ config.concurrency = positiveInteger("concurrency", value.concurrency);
115
+ if (value.layout !== undefined)
116
+ config.layout = layoutPolicy(value.layout);
117
+ return config;
118
+ }
119
+ function enumValue(field, value, allowed) {
120
+ if (typeof value === "string" && allowed.includes(value))
121
+ return value;
122
+ throw new ConfigError(`${field} must be one of: ${allowed.join(", ")}.`);
123
+ }
124
+ function stringArray(field, value) {
125
+ if (Array.isArray(value) && value.every((item) => typeof item === "string"))
126
+ return value;
127
+ throw new ConfigError(`${field} must be an array of strings.`);
128
+ }
129
+ function positiveInteger(field, value) {
130
+ if (Number.isInteger(value) && typeof value === "number" && value > 0)
131
+ return value;
132
+ throw new ConfigError(`${field} must be a positive integer.`);
133
+ }
134
+ function isRecord(value) {
135
+ return typeof value === "object" && value !== null && !Array.isArray(value);
136
+ }
137
+ function label(configPath) {
138
+ return configPath ? ` in ${configPath}` : "";
139
+ }
140
+ function errorMessage(error) {
141
+ return error instanceof Error ? error.message : String(error);
142
+ }
143
+ function toPosix(value) {
144
+ return value.split(path.sep).join(path.posix.sep);
145
+ }
146
+ function layoutPolicy(value) {
147
+ if (!value || typeof value !== "object" || Array.isArray(value))
148
+ throw new ConfigError("layout must be an object.");
149
+ const layout = value;
150
+ const allowed = new Set(["tool_namespace", "workflow_aliases"]);
151
+ for (const key of Object.keys(layout)) {
152
+ if (!allowed.has(key))
153
+ throw new ConfigError(`Unknown layout config key "${key}". Allowed keys: ${[...allowed].join(", ")}.`);
154
+ }
155
+ const toolNamespace = layout.tool_namespace === undefined
156
+ ? undefined
157
+ : stringValue("layout.tool_namespace", layout.tool_namespace);
158
+ const workflowAliases = layout.workflow_aliases === undefined
159
+ ? DEFAULT_CONFIG.layout.workflowAliases
160
+ : stringRecord("layout.workflow_aliases", layout.workflow_aliases);
161
+ return {
162
+ ...(toolNamespace === undefined ? {} : { toolNamespace }),
163
+ workflowAliases: {
164
+ ...DEFAULT_CONFIG.layout.workflowAliases,
165
+ ...workflowAliases,
166
+ },
167
+ };
168
+ }
169
+ function stringRecord(name, value) {
170
+ if (!value || typeof value !== "object" || Array.isArray(value))
171
+ throw new ConfigError(`${name} must be an object of string values.`);
172
+ const record = value;
173
+ for (const [key, item] of Object.entries(record)) {
174
+ if (typeof item !== "string")
175
+ throw new ConfigError(`${name}.${key} must be a string.`);
176
+ }
177
+ return record;
178
+ }
179
+ function stringValue(name, value) {
180
+ if (typeof value !== "string" || value.trim() === "")
181
+ throw new ConfigError(`${name} must be a non-empty string.`);
182
+ return value;
183
+ }
184
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Artifact, Diagnostic, ScanConfig } from "./types.js";
2
+ /** Discover and read scan artifacts according to the provided scan configuration. */
3
+ export declare function discoverArtifacts(root: string, config: ScanConfig): Promise<{
4
+ artifacts: Artifact[];
5
+ diagnostics: Diagnostic[];
6
+ }>;
7
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,QAAQ,EAER,UAAU,EACV,UAAU,EACX,MAAM,YAAY,CAAC;AAEpB,qFAAqF;AACrF,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC;IAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IAAC,WAAW,EAAE,UAAU,EAAE,CAAA;CAAE,CAAC,CA2E/D"}
@@ -0,0 +1,122 @@
1
+ import { glob, lstat, readFile, stat } from "node:fs/promises";
2
+ import path from "node:path";
3
+ /** Discover and read scan artifacts according to the provided scan configuration. */
4
+ export async function discoverArtifacts(root, config) {
5
+ const diagnostics = [];
6
+ const paths = new Set();
7
+ for (const pattern of config.globs) {
8
+ try {
9
+ for await (const match of glob(pattern, {
10
+ cwd: root,
11
+ withFileTypes: false,
12
+ })) {
13
+ if (typeof match === "string")
14
+ paths.add(toPosix(match));
15
+ }
16
+ }
17
+ catch (error) {
18
+ diagnostics.push({
19
+ severity: "error",
20
+ message: `Could not evaluate glob "${pattern}": ${errorMessage(error)}`,
21
+ });
22
+ }
23
+ }
24
+ const candidates = [...paths]
25
+ .filter((relativePath) => !isExcluded(relativePath, config.exclude))
26
+ .filter((relativePath) => depth(relativePath) <= config.maxDepth)
27
+ .sort((a, b) => a.localeCompare(b));
28
+ const artifacts = await mapLimit(candidates, config.concurrency, async (relativePath) => {
29
+ const absolutePath = path.join(root, relativePath);
30
+ try {
31
+ const linkInfo = await lstat(absolutePath);
32
+ if (linkInfo.isSymbolicLink()) {
33
+ diagnostics.push({
34
+ severity: "warning",
35
+ path: relativePath,
36
+ message: "Skipping symbolic link.",
37
+ });
38
+ return undefined;
39
+ }
40
+ const info = await stat(absolutePath);
41
+ if (!info.isFile())
42
+ return undefined;
43
+ if (info.size > config.maxFileSizeBytes) {
44
+ diagnostics.push({
45
+ severity: "warning",
46
+ path: relativePath,
47
+ message: `Skipping file larger than max_file_size_bytes (${config.maxFileSizeBytes}).`,
48
+ });
49
+ return undefined;
50
+ }
51
+ const content = await readFile(absolutePath, "utf8");
52
+ return {
53
+ path: relativePath,
54
+ absolutePath,
55
+ kind: classify(relativePath),
56
+ sizeBytes: info.size,
57
+ content,
58
+ };
59
+ }
60
+ catch (error) {
61
+ diagnostics.push({
62
+ severity: "error",
63
+ path: relativePath,
64
+ message: `Could not read file: ${errorMessage(error)}`,
65
+ });
66
+ return undefined;
67
+ }
68
+ });
69
+ return {
70
+ artifacts: artifacts.filter((artifact) => artifact !== undefined),
71
+ diagnostics,
72
+ };
73
+ }
74
+ function classify(relativePath) {
75
+ if (relativePath.endsWith("/SKILL.md"))
76
+ return "skill";
77
+ if (relativePath === "AGENTS.md" || relativePath.startsWith(".agents/"))
78
+ return "agent";
79
+ if (relativePath.startsWith("context/") ||
80
+ relativePath.startsWith("contexts/"))
81
+ return "context";
82
+ if (relativePath.includes("/profiles/"))
83
+ return "profile";
84
+ if (relativePath.includes("/references/"))
85
+ return "reference";
86
+ if (relativePath.includes("/examples/"))
87
+ return "example";
88
+ if (relativePath.endsWith("renma.config.json") ||
89
+ relativePath.endsWith(".renma.json")) {
90
+ return "config";
91
+ }
92
+ return "unknown";
93
+ }
94
+ async function mapLimit(items, limit, mapper) {
95
+ const results = new Array(items.length);
96
+ let cursor = 0;
97
+ const workers = Array.from({ length: Math.min(limit, items.length) }, async () => {
98
+ while (cursor < items.length) {
99
+ const index = cursor;
100
+ cursor += 1;
101
+ results[index] = await mapper(items[index]);
102
+ }
103
+ });
104
+ await Promise.all(workers);
105
+ return results;
106
+ }
107
+ function isExcluded(relativePath, excludes) {
108
+ const segments = relativePath.split("/");
109
+ return excludes.some((exclude) => segments.includes(exclude) ||
110
+ relativePath === exclude ||
111
+ relativePath.startsWith(`${exclude}/`));
112
+ }
113
+ function depth(relativePath) {
114
+ return relativePath.split("/").filter(Boolean).length;
115
+ }
116
+ function toPosix(value) {
117
+ return value.split(path.sep).join(path.posix.sep);
118
+ }
119
+ function errorMessage(error) {
120
+ return error instanceof Error ? error.message : String(error);
121
+ }
122
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { main } from "./cli.js";
3
+ process.exitCode = await main();
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhC,OAAO,CAAC,QAAQ,GAAG,MAAM,IAAI,EAAE,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Artifact, ParsedDocument } from "./types.js";
2
+ /** Parse a markdown artifact into headings, links, code fences, and frontmatter metadata. */
3
+ export declare function parseDocument(artifact: Artifact): ParsedDocument;
4
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EAIR,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,6FAA6F;AAC7F,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,cAAc,CAiEhE"}