soturail 0.2.1

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 (149) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +205 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.js +54 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/bench.d.ts +31 -0
  7. package/dist/commands/bench.js +387 -0
  8. package/dist/commands/bench.js.map +1 -0
  9. package/dist/commands/dedupe.d.ts +2 -0
  10. package/dist/commands/dedupe.js +16 -0
  11. package/dist/commands/dedupe.js.map +1 -0
  12. package/dist/commands/doctor.d.ts +14 -0
  13. package/dist/commands/doctor.js +122 -0
  14. package/dist/commands/doctor.js.map +1 -0
  15. package/dist/commands/expand.d.ts +3 -0
  16. package/dist/commands/expand.js +23 -0
  17. package/dist/commands/expand.js.map +1 -0
  18. package/dist/commands/format.d.ts +6 -0
  19. package/dist/commands/format.js +48 -0
  20. package/dist/commands/format.js.map +1 -0
  21. package/dist/commands/hooks.d.ts +11 -0
  22. package/dist/commands/hooks.js +248 -0
  23. package/dist/commands/hooks.js.map +1 -0
  24. package/dist/commands/index.d.ts +3 -0
  25. package/dist/commands/index.js +28 -0
  26. package/dist/commands/index.js.map +1 -0
  27. package/dist/commands/ingest.d.ts +6 -0
  28. package/dist/commands/ingest.js +52 -0
  29. package/dist/commands/ingest.js.map +1 -0
  30. package/dist/commands/init.d.ts +7 -0
  31. package/dist/commands/init.js +179 -0
  32. package/dist/commands/init.js.map +1 -0
  33. package/dist/commands/memory.d.ts +39 -0
  34. package/dist/commands/memory.js +184 -0
  35. package/dist/commands/memory.js.map +1 -0
  36. package/dist/commands/native.d.ts +2 -0
  37. package/dist/commands/native.js +17 -0
  38. package/dist/commands/native.js.map +1 -0
  39. package/dist/commands/read.d.ts +8 -0
  40. package/dist/commands/read.js +87 -0
  41. package/dist/commands/read.js.map +1 -0
  42. package/dist/commands/rules.d.ts +5 -0
  43. package/dist/commands/rules.js +62 -0
  44. package/dist/commands/rules.js.map +1 -0
  45. package/dist/commands/run.d.ts +22 -0
  46. package/dist/commands/run.js +200 -0
  47. package/dist/commands/run.js.map +1 -0
  48. package/dist/commands/spec.d.ts +11 -0
  49. package/dist/commands/spec.js +217 -0
  50. package/dist/commands/spec.js.map +1 -0
  51. package/dist/commands/stats.d.ts +15 -0
  52. package/dist/commands/stats.js +82 -0
  53. package/dist/commands/stats.js.map +1 -0
  54. package/dist/compressors/agent-response-reducer.d.ts +13 -0
  55. package/dist/compressors/agent-response-reducer.js +160 -0
  56. package/dist/compressors/agent-response-reducer.js.map +1 -0
  57. package/dist/compressors/generic-stream.d.ts +6 -0
  58. package/dist/compressors/generic-stream.js +63 -0
  59. package/dist/compressors/generic-stream.js.map +1 -0
  60. package/dist/compressors/git-reducer.d.ts +2 -0
  61. package/dist/compressors/git-reducer.js +78 -0
  62. package/dist/compressors/git-reducer.js.map +1 -0
  63. package/dist/compressors/index.d.ts +10 -0
  64. package/dist/compressors/index.js +84 -0
  65. package/dist/compressors/index.js.map +1 -0
  66. package/dist/compressors/json-toon.d.ts +14 -0
  67. package/dist/compressors/json-toon.js +149 -0
  68. package/dist/compressors/json-toon.js.map +1 -0
  69. package/dist/compressors/test-reducer.d.ts +2 -0
  70. package/dist/compressors/test-reducer.js +50 -0
  71. package/dist/compressors/test-reducer.js.map +1 -0
  72. package/dist/core/cache-normalizer.d.ts +23 -0
  73. package/dist/core/cache-normalizer.js +170 -0
  74. package/dist/core/cache-normalizer.js.map +1 -0
  75. package/dist/core/config.d.ts +104 -0
  76. package/dist/core/config.js +186 -0
  77. package/dist/core/config.js.map +1 -0
  78. package/dist/core/dedupe-store.d.ts +17 -0
  79. package/dist/core/dedupe-store.js +44 -0
  80. package/dist/core/dedupe-store.js.map +1 -0
  81. package/dist/core/document-ingest.d.ts +15 -0
  82. package/dist/core/document-ingest.js +45 -0
  83. package/dist/core/document-ingest.js.map +1 -0
  84. package/dist/core/file-scanner.d.ts +47 -0
  85. package/dist/core/file-scanner.js +248 -0
  86. package/dist/core/file-scanner.js.map +1 -0
  87. package/dist/core/git.d.ts +2 -0
  88. package/dist/core/git.js +29 -0
  89. package/dist/core/git.js.map +1 -0
  90. package/dist/core/metrics-store.d.ts +20 -0
  91. package/dist/core/metrics-store.js +19 -0
  92. package/dist/core/metrics-store.js.map +1 -0
  93. package/dist/core/native-engine.d.ts +25 -0
  94. package/dist/core/native-engine.js +137 -0
  95. package/dist/core/native-engine.js.map +1 -0
  96. package/dist/core/native-runner-adapter.d.ts +18 -0
  97. package/dist/core/native-runner-adapter.js +60 -0
  98. package/dist/core/native-runner-adapter.js.map +1 -0
  99. package/dist/core/raw-store.d.ts +28 -0
  100. package/dist/core/raw-store.js +57 -0
  101. package/dist/core/raw-store.js.map +1 -0
  102. package/dist/core/response-policy.d.ts +11 -0
  103. package/dist/core/response-policy.js +14 -0
  104. package/dist/core/response-policy.js.map +1 -0
  105. package/dist/core/rule-extractor.d.ts +18 -0
  106. package/dist/core/rule-extractor.js +116 -0
  107. package/dist/core/rule-extractor.js.map +1 -0
  108. package/dist/core/rule-validator.d.ts +9 -0
  109. package/dist/core/rule-validator.js +85 -0
  110. package/dist/core/rule-validator.js.map +1 -0
  111. package/dist/core/safety-policy.d.ts +10 -0
  112. package/dist/core/safety-policy.js +69 -0
  113. package/dist/core/safety-policy.js.map +1 -0
  114. package/dist/core/token-estimator.d.ts +2 -0
  115. package/dist/core/token-estimator.js +7 -0
  116. package/dist/core/token-estimator.js.map +1 -0
  117. package/dist/types/index.d.ts +4 -0
  118. package/dist/types/index.js +2 -0
  119. package/dist/types/index.js.map +1 -0
  120. package/docs/architecture.md +47 -0
  121. package/docs/assets/screenshots/README.md +18 -0
  122. package/docs/assets/screenshots/init.svg +13 -0
  123. package/docs/assets/screenshots/run-expand.svg +13 -0
  124. package/docs/assets/screenshots/stats.svg +11 -0
  125. package/docs/assets/soturail-fox.svg +17 -0
  126. package/docs/assets/soturail-icon.svg +10 -0
  127. package/docs/benchmarking.md +34 -0
  128. package/docs/branding.md +14 -0
  129. package/docs/hooks/claude.md +24 -0
  130. package/docs/hooks/codex.md +5 -0
  131. package/docs/hooks/cursor.md +5 -0
  132. package/docs/hooks/gemini.md +5 -0
  133. package/docs/hooks/host-capabilities.json +22 -0
  134. package/docs/hooks.md +15 -0
  135. package/docs/knowledge-to-rules.md +23 -0
  136. package/docs/metrics.md +35 -0
  137. package/docs/mvp.md +21 -0
  138. package/docs/native-runner.md +52 -0
  139. package/docs/prompt-caching.md +27 -0
  140. package/docs/pt-BR/visao-geral.md +26 -0
  141. package/docs/public-roadmap.md +20 -0
  142. package/docs/reducers.md +19 -0
  143. package/docs/release-checklist.md +13 -0
  144. package/docs/response-compression.md +15 -0
  145. package/docs/rules.md +23 -0
  146. package/docs/security-model.md +32 -0
  147. package/docs/spec-driven-workflow.md +22 -0
  148. package/docs/usage.md +64 -0
  149. package/package.json +71 -0
@@ -0,0 +1,45 @@
1
+ import { createHash } from "node:crypto";
2
+ import { promises as fs } from "node:fs";
3
+ import path from "node:path";
4
+ export function isIngestType(value) {
5
+ return ["rules", "requirements", "docs", "course"].includes(value);
6
+ }
7
+ export async function ingestDocument(file, type, root = process.cwd()) {
8
+ const absolute = path.resolve(root, file);
9
+ const extension = path.extname(file).toLowerCase();
10
+ if (extension === ".pdf") {
11
+ throw new Error("PDF extraction is experimental in v0.2.0 and not enabled without a safe text extractor.");
12
+ }
13
+ const raw = await fs.readFile(absolute, "utf8");
14
+ const text = extension === ".json" ? JSON.stringify(JSON.parse(raw), null, 2) : raw;
15
+ const sourceFile = path.normalize(path.relative(root, absolute)).replace(/\\/g, "/");
16
+ return {
17
+ source_file: sourceFile,
18
+ type,
19
+ text,
20
+ content_hash: createHash("sha256").update(text).digest("hex"),
21
+ sections: splitSections(text)
22
+ };
23
+ }
24
+ function splitSections(text) {
25
+ const lines = text.split(/\r?\n/);
26
+ const sections = [];
27
+ let current = { title: "Document", content: "", start_line: 1 };
28
+ lines.forEach((line, index) => {
29
+ const heading = line.match(/^(#{1,6})\s+(.+)$/);
30
+ if (heading) {
31
+ if (current.content.trim().length > 0 || sections.length === 0) {
32
+ sections.push(current);
33
+ }
34
+ current = { title: heading[2]?.trim() ?? "Untitled", content: "", start_line: index + 1 };
35
+ }
36
+ else {
37
+ current.content += `${line}\n`;
38
+ }
39
+ });
40
+ if (current.content.trim().length > 0) {
41
+ sections.push(current);
42
+ }
43
+ return sections.filter((section) => section.content.trim().length > 0);
44
+ }
45
+ //# sourceMappingURL=document-ingest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-ingest.js","sourceRoot":"","sources":["../../src/core/document-ingest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { SotuRailConfig } from "./config.js";
2
+ export interface GitignoreRule {
3
+ pattern: string;
4
+ negate: boolean;
5
+ directoryOnly: boolean;
6
+ anchored: boolean;
7
+ }
8
+ export interface ExtractedSymbol {
9
+ name: string;
10
+ kind: string;
11
+ line: number;
12
+ }
13
+ export interface ExtractedContract {
14
+ kind: string;
15
+ value: string;
16
+ line: number;
17
+ }
18
+ export interface RepoMapFile {
19
+ path: string;
20
+ size_bytes: number;
21
+ language: string;
22
+ symbols: ExtractedSymbol[];
23
+ contracts: ExtractedContract[];
24
+ }
25
+ export interface ScanStats {
26
+ scanned_files: number;
27
+ ignored_files: number;
28
+ ignored_directories: number;
29
+ }
30
+ export interface RepoMap {
31
+ title: "Heuristic Repo Map";
32
+ generated_at: string;
33
+ root: string;
34
+ total_files: number;
35
+ stats: ScanStats;
36
+ files: RepoMapFile[];
37
+ }
38
+ export declare function normalizeForIgnore(inputPath: string): string;
39
+ export declare function parseGitignore(content: string): GitignoreRule[];
40
+ export declare function isIgnoredByRules(relativePath: string, isDirectory: boolean, rules: GitignoreRule[]): boolean;
41
+ export declare function isAlwaysIgnored(relativePath: string, isDirectory: boolean): boolean;
42
+ export declare function scanRepository(root: string, config: SotuRailConfig): Promise<RepoMap>;
43
+ export declare function buildTreeText(repoMap: RepoMap): string;
44
+ export declare function writeRepoMap(root: string, repoMap: RepoMap): Promise<{
45
+ repoMapPath: string;
46
+ treePath: string;
47
+ }>;
@@ -0,0 +1,248 @@
1
+ import { promises as fs } from "node:fs";
2
+ import path from "node:path";
3
+ import { writeJson } from "./config.js";
4
+ const ALWAYS_IGNORED_DIRS = new Set([".git", "node_modules", "dist", "build", "coverage"]);
5
+ const ALWAYS_IGNORED_PATH_PREFIXES = [".soturail/raw"];
6
+ export function normalizeForIgnore(inputPath) {
7
+ return path
8
+ .normalize(inputPath)
9
+ .replace(/\\/g, "/")
10
+ .replace(/^\.\//, "")
11
+ .replace(/^\/+/, "");
12
+ }
13
+ export function parseGitignore(content) {
14
+ return content
15
+ .split(/\r?\n/)
16
+ .map((line) => line.trim())
17
+ .filter((line) => line.length > 0 && !line.startsWith("#"))
18
+ .map((line) => {
19
+ const negate = line.startsWith("!");
20
+ const withoutNegation = negate ? line.slice(1) : line;
21
+ const directoryOnly = withoutNegation.endsWith("/");
22
+ const anchored = withoutNegation.startsWith("/");
23
+ const clean = normalizeForIgnore(withoutNegation.replace(/^\/+/, "").replace(/\/+$/, ""));
24
+ return { pattern: clean, negate, directoryOnly, anchored };
25
+ })
26
+ .filter((rule) => rule.pattern.length > 0);
27
+ }
28
+ function globToRegExp(pattern) {
29
+ const escaped = pattern
30
+ .split("*")
31
+ .map((part) => part.replace(/[.+?^${}()|[\]\\]/g, "\\$&"))
32
+ .join("[^/]*");
33
+ return new RegExp(`^${escaped}$`);
34
+ }
35
+ function basename(relativePath) {
36
+ const normalized = normalizeForIgnore(relativePath);
37
+ const parts = normalized.split("/");
38
+ return parts[parts.length - 1] ?? normalized;
39
+ }
40
+ function ruleMatches(rule, relativePath, isDirectory) {
41
+ const normalized = normalizeForIgnore(relativePath);
42
+ if (rule.directoryOnly && !isDirectory && !normalized.startsWith(`${rule.pattern}/`)) {
43
+ return false;
44
+ }
45
+ if (rule.directoryOnly) {
46
+ return normalized === rule.pattern || normalized.startsWith(`${rule.pattern}/`);
47
+ }
48
+ if (rule.pattern.includes("*")) {
49
+ const target = rule.anchored || rule.pattern.includes("/") ? normalized : basename(normalized);
50
+ return globToRegExp(rule.pattern).test(target);
51
+ }
52
+ if (rule.anchored || rule.pattern.includes("/")) {
53
+ return normalized === rule.pattern || normalized.startsWith(`${rule.pattern}/`);
54
+ }
55
+ return normalized.split("/").includes(rule.pattern) || basename(normalized) === rule.pattern;
56
+ }
57
+ export function isIgnoredByRules(relativePath, isDirectory, rules) {
58
+ let ignored = false;
59
+ for (const rule of rules) {
60
+ if (ruleMatches(rule, relativePath, isDirectory)) {
61
+ ignored = !rule.negate;
62
+ }
63
+ }
64
+ return ignored;
65
+ }
66
+ export function isAlwaysIgnored(relativePath, isDirectory) {
67
+ const normalized = normalizeForIgnore(relativePath);
68
+ const firstSegment = normalized.split("/")[0] ?? normalized;
69
+ if (isDirectory && ALWAYS_IGNORED_DIRS.has(firstSegment)) {
70
+ return true;
71
+ }
72
+ if (ALWAYS_IGNORED_DIRS.has(firstSegment)) {
73
+ return true;
74
+ }
75
+ return ALWAYS_IGNORED_PATH_PREFIXES.some((prefix) => normalized === prefix || normalized.startsWith(`${prefix}/`));
76
+ }
77
+ function extensionOf(relativePath) {
78
+ return path.extname(relativePath).replace(".", "").toLowerCase();
79
+ }
80
+ function languageFor(relativePath) {
81
+ const ext = extensionOf(relativePath);
82
+ if (["ts", "tsx", "js", "jsx", "mjs", "cjs"].includes(ext)) {
83
+ return "typescript/javascript";
84
+ }
85
+ if (ext === "py") {
86
+ return "python";
87
+ }
88
+ if (ext === "java") {
89
+ return "java";
90
+ }
91
+ if (ext === "json") {
92
+ return "json";
93
+ }
94
+ if (["md", "mdx"].includes(ext)) {
95
+ return "markdown";
96
+ }
97
+ return ext.length > 0 ? ext : "text";
98
+ }
99
+ function extractSymbols(relativePath, text) {
100
+ const language = languageFor(relativePath);
101
+ const lines = text.split(/\r?\n/);
102
+ const symbols = [];
103
+ const contracts = [];
104
+ lines.forEach((line, index) => {
105
+ const lineNumber = index + 1;
106
+ const trimmed = line.trim();
107
+ const contractMatch = trimmed.match(/^(?:import|export)\s+.+/);
108
+ if (contractMatch && ["typescript/javascript", "python"].includes(language)) {
109
+ contracts.push({ kind: "module-boundary", value: trimmed.slice(0, 200), line: lineNumber });
110
+ }
111
+ if (language === "typescript/javascript") {
112
+ const symbolMatch = trimmed.match(/^(?:export\s+)?(?:default\s+)?(?:async\s+)?(?:class|interface|type|function|const|let|var)\s+([A-Za-z_$][\w$]*)/);
113
+ if (symbolMatch?.[1]) {
114
+ const kind = trimmed.includes("class")
115
+ ? "class"
116
+ : trimmed.includes("interface")
117
+ ? "interface"
118
+ : trimmed.includes("type")
119
+ ? "type"
120
+ : trimmed.includes("function")
121
+ ? "function"
122
+ : "value";
123
+ symbols.push({ name: symbolMatch[1], kind, line: lineNumber });
124
+ }
125
+ return;
126
+ }
127
+ if (language === "python") {
128
+ const symbolMatch = trimmed.match(/^(?:async\s+)?(?:def|class)\s+([A-Za-z_][\w]*)/);
129
+ if (symbolMatch?.[1]) {
130
+ symbols.push({ name: symbolMatch[1], kind: trimmed.startsWith("class") ? "class" : "function", line: lineNumber });
131
+ }
132
+ return;
133
+ }
134
+ if (language === "java") {
135
+ const classMatch = trimmed.match(/\b(?:class|interface|enum|record)\s+([A-Za-z_][\w]*)/);
136
+ if (classMatch?.[1]) {
137
+ symbols.push({ name: classMatch[1], kind: "type", line: lineNumber });
138
+ }
139
+ const methodMatch = trimmed.match(/^(?:public|private|protected)?\s*(?:static\s+)?(?:final\s+)?[\w<>\[\]]+\s+([A-Za-z_][\w]*)\s*\([^)]*\)\s*(?:throws\s+[\w,\s]+)?\{?$/);
140
+ if (methodMatch?.[1] && !["if", "for", "while", "switch"].includes(methodMatch[1])) {
141
+ symbols.push({ name: methodMatch[1], kind: "method", line: lineNumber });
142
+ }
143
+ }
144
+ });
145
+ return { symbols, contracts };
146
+ }
147
+ async function readGitignore(root) {
148
+ try {
149
+ const raw = await fs.readFile(path.resolve(root, ".gitignore"), "utf8");
150
+ return parseGitignore(raw);
151
+ }
152
+ catch {
153
+ return [];
154
+ }
155
+ }
156
+ export async function scanRepository(root, config) {
157
+ const resolvedRoot = path.resolve(root);
158
+ const rules = await readGitignore(resolvedRoot);
159
+ const files = [];
160
+ const stats = { scanned_files: 0, ignored_files: 0, ignored_directories: 0 };
161
+ const ignoredExtensions = new Set(config.ignore_extensions.map((ext) => ext.replace(/^\./, "").toLowerCase()));
162
+ const maxBytes = config.max_file_size_kb * 1024;
163
+ async function walk(current) {
164
+ const entries = await fs.readdir(current, { withFileTypes: true });
165
+ for (const entry of entries) {
166
+ const absolute = path.resolve(current, entry.name);
167
+ const relative = normalizeForIgnore(path.relative(resolvedRoot, absolute));
168
+ if (entry.isSymbolicLink()) {
169
+ stats.ignored_files += 1;
170
+ continue;
171
+ }
172
+ if (entry.isDirectory()) {
173
+ if (isAlwaysIgnored(relative, true) || isIgnoredByRules(relative, true, rules)) {
174
+ stats.ignored_directories += 1;
175
+ continue;
176
+ }
177
+ await walk(absolute);
178
+ continue;
179
+ }
180
+ if (!entry.isFile()) {
181
+ stats.ignored_files += 1;
182
+ continue;
183
+ }
184
+ if (isAlwaysIgnored(relative, false) || isIgnoredByRules(relative, false, rules)) {
185
+ stats.ignored_files += 1;
186
+ continue;
187
+ }
188
+ if (ignoredExtensions.has(extensionOf(relative))) {
189
+ stats.ignored_files += 1;
190
+ continue;
191
+ }
192
+ const fileStats = await fs.stat(absolute);
193
+ if (fileStats.size > maxBytes) {
194
+ stats.ignored_files += 1;
195
+ continue;
196
+ }
197
+ let text = "";
198
+ try {
199
+ text = await fs.readFile(absolute, "utf8");
200
+ }
201
+ catch {
202
+ stats.ignored_files += 1;
203
+ continue;
204
+ }
205
+ const extracted = extractSymbols(relative, text);
206
+ files.push({
207
+ path: relative,
208
+ size_bytes: fileStats.size,
209
+ language: languageFor(relative),
210
+ symbols: extracted.symbols,
211
+ contracts: extracted.contracts
212
+ });
213
+ stats.scanned_files += 1;
214
+ }
215
+ }
216
+ await walk(resolvedRoot);
217
+ files.sort((left, right) => left.path.localeCompare(right.path));
218
+ return {
219
+ title: "Heuristic Repo Map",
220
+ generated_at: new Date().toISOString(),
221
+ root: path.basename(resolvedRoot),
222
+ total_files: files.length,
223
+ stats,
224
+ files
225
+ };
226
+ }
227
+ export function buildTreeText(repoMap) {
228
+ const lines = [
229
+ "Heuristic Repo Map",
230
+ `Root: ${repoMap.root}`,
231
+ `Files indexed: ${repoMap.total_files}`,
232
+ ""
233
+ ];
234
+ for (const file of repoMap.files) {
235
+ const symbols = file.symbols.map((symbol) => `${symbol.kind}:${symbol.name}`).join(", ");
236
+ lines.push(`${file.path} (${file.language}, ${file.size_bytes} bytes)${symbols ? ` - ${symbols}` : ""}`);
237
+ }
238
+ return `${lines.join("\n")}\n`;
239
+ }
240
+ export async function writeRepoMap(root, repoMap) {
241
+ const indexesDir = path.resolve(root, ".soturail", "indexes");
242
+ const repoMapPath = path.resolve(indexesDir, "repo-map.json");
243
+ const treePath = path.resolve(indexesDir, "tree.txt");
244
+ await writeJson(repoMapPath, repoMap);
245
+ await fs.writeFile(treePath, buildTreeText(repoMap), "utf8");
246
+ return { repoMapPath, treePath };
247
+ }
248
+ //# sourceMappingURL=file-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-scanner.js","sourceRoot":"","sources":["../../src/core/file-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function getCurrentGitCommit(root?: string): Promise<string | null>;
2
+ export declare function hashFile(filePath: string): Promise<string | null>;
@@ -0,0 +1,29 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promises as fs } from "node:fs";
3
+ import { createHash } from "node:crypto";
4
+ import { promisify } from "node:util";
5
+ const execFileAsync = promisify(execFile);
6
+ export async function getCurrentGitCommit(root = process.cwd()) {
7
+ try {
8
+ const { stdout } = await execFileAsync("git", ["rev-parse", "HEAD"], {
9
+ cwd: root,
10
+ timeout: 3000,
11
+ windowsHide: true
12
+ });
13
+ const hash = stdout.trim();
14
+ return hash.length > 0 ? hash : null;
15
+ }
16
+ catch {
17
+ return null;
18
+ }
19
+ }
20
+ export async function hashFile(filePath) {
21
+ try {
22
+ const buffer = await fs.readFile(filePath);
23
+ return createHash("sha256").update(buffer).digest("hex");
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ }
29
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/core/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE;IAC5D,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE;YACnE,GAAG,EAAE,IAAI;YACT,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB;IAC7C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC3C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,20 @@
1
+ export type MetricEventType = "command_run" | "expand" | "omission_report" | "doctor_cache" | "response_format" | "rules_ingest" | "rules_check" | "hook_install" | "dedupe_hit" | "bench_run";
2
+ export interface MetricEvent {
3
+ type: MetricEventType;
4
+ created_at: string;
5
+ raw_id?: string;
6
+ command?: string;
7
+ exit_code?: number;
8
+ raw_tokens_estimated?: number;
9
+ compressed_tokens_estimated?: number;
10
+ estimated_cache_stability_score?: number;
11
+ details?: Record<string, unknown>;
12
+ }
13
+ export declare class MetricsStore {
14
+ private readonly root;
15
+ constructor(root?: string);
16
+ append(event: Omit<MetricEvent, "created_at"> & {
17
+ created_at?: string;
18
+ }): Promise<void>;
19
+ readAll(): Promise<MetricEvent[]>;
20
+ }
@@ -0,0 +1,19 @@
1
+ import { getWorkspacePaths, appendJsonl, readJsonl } from "./config.js";
2
+ export class MetricsStore {
3
+ root;
4
+ constructor(root = process.cwd()) {
5
+ this.root = root;
6
+ }
7
+ async append(event) {
8
+ const paths = getWorkspacePaths(this.root);
9
+ await appendJsonl(paths.metricsFile, {
10
+ ...event,
11
+ created_at: event.created_at ?? new Date().toISOString()
12
+ });
13
+ }
14
+ async readAll() {
15
+ const paths = getWorkspacePaths(this.root);
16
+ return readJsonl(paths.metricsFile);
17
+ }
18
+ }
19
+ //# sourceMappingURL=metrics-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-store.js","sourceRoot":"","sources":["../../src/core/metrics-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AA0BxE,MAAM,OAAO,YAAY;IACM;IAA7B,YAA6B,OAAO,OAAO,CAAC,GAAG,EAAE;QAApB,SAAI,GAAJ,IAAI,CAAgB;IAAG,CAAC;IAErD,KAAK,CAAC,MAAM,CAAC,KAAgE;QAC3E,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE;YACnC,GAAG,KAAK;YACR,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACzD,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,OAAO,SAAS,CAAc,KAAK,CAAC,WAAW,CAAC,CAAC;IACnD,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ import type { Writable } from "node:stream";
2
+ export type ReductionKind = "reduce-generic" | "reduce-git" | "reduce-test" | "reduce-json";
3
+ export type ReducerEngine = "ts" | "native" | "auto";
4
+ export interface NativeEngineInfo {
5
+ available: boolean;
6
+ path: string | null;
7
+ version: string | null;
8
+ checked_paths: string[];
9
+ }
10
+ export declare function detectNativeEngine(root?: string): Promise<NativeEngineInfo>;
11
+ export interface NativeRunOptions {
12
+ commandParts: string[];
13
+ rawLogPath: string;
14
+ summaryJsonPath: string;
15
+ cwd?: string;
16
+ interactive?: boolean;
17
+ terminalStdout?: Writable;
18
+ terminalStderr?: Writable;
19
+ }
20
+ export interface NativeRunResult {
21
+ exitCode: number;
22
+ summary: Record<string, unknown>;
23
+ }
24
+ export declare function runWithNative(options: NativeRunOptions, root?: string): Promise<NativeRunResult | null>;
25
+ export declare function reduceWithNative(kind: ReductionKind, input: string, rawId: string, root?: string): Promise<string | null>;
@@ -0,0 +1,137 @@
1
+ import { execFile, spawn } from "node:child_process";
2
+ import { promises as fs } from "node:fs";
3
+ import path from "node:path";
4
+ import { promisify } from "node:util";
5
+ const execFileAsync = promisify(execFile);
6
+ function executableName() {
7
+ return process.platform === "win32" ? "soturail-native.exe" : "soturail-native";
8
+ }
9
+ async function isExecutable(filePath) {
10
+ try {
11
+ const stat = await fs.stat(filePath);
12
+ return stat.isFile();
13
+ }
14
+ catch {
15
+ return false;
16
+ }
17
+ }
18
+ async function pathLookup() {
19
+ const command = process.platform === "win32" ? "where" : "which";
20
+ try {
21
+ const { stdout } = await execFileAsync(command, ["soturail-native"], { windowsHide: true, timeout: 3000 });
22
+ const first = stdout.split(/\r?\n/).find((line) => line.trim().length > 0);
23
+ return first?.trim() ?? null;
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ }
29
+ export async function detectNativeEngine(root = process.cwd()) {
30
+ const name = executableName();
31
+ const candidates = [
32
+ path.resolve(root, "native", "soturail-native", "target", "release", name),
33
+ path.resolve(root, "native", "soturail-native", "target", "debug", name),
34
+ path.resolve(root, "dist", "native", name)
35
+ ];
36
+ const checked = [...candidates];
37
+ const onPath = await pathLookup();
38
+ if (onPath) {
39
+ candidates.push(onPath);
40
+ checked.push(onPath);
41
+ }
42
+ const found = await firstExisting(candidates);
43
+ if (!found) {
44
+ return { available: false, path: null, version: null, checked_paths: checked };
45
+ }
46
+ try {
47
+ const { stdout } = await execFileAsync(found, ["--version"], { windowsHide: true, timeout: 3000 });
48
+ return { available: true, path: found, version: stdout.trim(), checked_paths: checked };
49
+ }
50
+ catch {
51
+ return { available: true, path: found, version: null, checked_paths: checked };
52
+ }
53
+ }
54
+ export async function runWithNative(options, root = process.cwd()) {
55
+ const info = await detectNativeEngine(root);
56
+ if (!info.path) {
57
+ return null;
58
+ }
59
+ const args = [
60
+ "run",
61
+ "--raw-log",
62
+ options.rawLogPath,
63
+ "--summary-json",
64
+ options.summaryJsonPath,
65
+ "--reducer",
66
+ "auto"
67
+ ];
68
+ if (options.interactive) {
69
+ args.push("--interactive");
70
+ }
71
+ args.push("--", ...nativeCommandParts(options.commandParts));
72
+ return new Promise((resolve) => {
73
+ const child = spawn(info.path, args, {
74
+ cwd: options.cwd ?? root,
75
+ stdio: ["pipe", "pipe", "pipe"],
76
+ windowsHide: !options.interactive
77
+ });
78
+ child.stdout.on("data", (chunk) => (options.terminalStdout ?? process.stdout).write(chunk));
79
+ child.stderr.on("data", (chunk) => (options.terminalStderr ?? process.stderr).write(chunk));
80
+ if (options.interactive && child.stdin && process.stdin.readable) {
81
+ process.stdin.pipe(child.stdin);
82
+ }
83
+ else {
84
+ child.stdin.end();
85
+ }
86
+ child.on("error", () => resolve(null));
87
+ child.on("close", async (code) => {
88
+ if (options.interactive && child.stdin) {
89
+ process.stdin.unpipe(child.stdin);
90
+ }
91
+ let summary = {};
92
+ try {
93
+ summary = JSON.parse(await fs.readFile(options.summaryJsonPath, "utf8"));
94
+ }
95
+ catch {
96
+ summary = {};
97
+ }
98
+ resolve({ exitCode: typeof code === "number" ? code : 1, summary });
99
+ });
100
+ });
101
+ }
102
+ function nativeCommandParts(parts) {
103
+ if (parts.length === 1 && /\s/.test(parts[0] ?? "")) {
104
+ const command = parts[0] ?? "";
105
+ return process.platform === "win32" ? ["cmd.exe", "/d", "/s", "/c", command] : ["sh", "-c", command];
106
+ }
107
+ return parts;
108
+ }
109
+ async function firstExisting(candidates) {
110
+ for (const candidate of candidates) {
111
+ if (await isExecutable(candidate)) {
112
+ return candidate;
113
+ }
114
+ }
115
+ return null;
116
+ }
117
+ export async function reduceWithNative(kind, input, rawId, root = process.cwd()) {
118
+ const info = await detectNativeEngine(root);
119
+ if (!info.path) {
120
+ return null;
121
+ }
122
+ return new Promise((resolve) => {
123
+ const child = spawn(info.path, [kind, "--raw-id", rawId], {
124
+ cwd: root,
125
+ stdio: ["pipe", "pipe", "pipe"],
126
+ windowsHide: true
127
+ });
128
+ const stdout = [];
129
+ child.stdout.on("data", (chunk) => stdout.push(Buffer.from(chunk)));
130
+ child.on("error", () => resolve(null));
131
+ child.on("close", (code) => {
132
+ resolve(code === 0 ? Buffer.concat(stdout).toString("utf8") : null);
133
+ });
134
+ child.stdin.end(input);
135
+ });
136
+ }
137
+ //# sourceMappingURL=native-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-engine.js","sourceRoot":"","sources":["../../src/core/native-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { Writable } from "node:stream";
2
+ export interface RunnerOptions {
3
+ command: string;
4
+ cwd?: string;
5
+ interactive?: boolean;
6
+ rawLogStream: Writable;
7
+ terminalStdout?: Writable;
8
+ terminalStderr?: Writable;
9
+ env?: NodeJS.ProcessEnv;
10
+ }
11
+ export interface RunnerResult {
12
+ exitCode: number;
13
+ signal: NodeJS.Signals | null;
14
+ rawText: string;
15
+ }
16
+ export declare class NativeRunnerAdapter {
17
+ run(options: RunnerOptions): Promise<RunnerResult>;
18
+ }