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.
- package/LICENSE +21 -0
- package/README.md +205 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +54 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/bench.d.ts +31 -0
- package/dist/commands/bench.js +387 -0
- package/dist/commands/bench.js.map +1 -0
- package/dist/commands/dedupe.d.ts +2 -0
- package/dist/commands/dedupe.js +16 -0
- package/dist/commands/dedupe.js.map +1 -0
- package/dist/commands/doctor.d.ts +14 -0
- package/dist/commands/doctor.js +122 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/expand.d.ts +3 -0
- package/dist/commands/expand.js +23 -0
- package/dist/commands/expand.js.map +1 -0
- package/dist/commands/format.d.ts +6 -0
- package/dist/commands/format.js +48 -0
- package/dist/commands/format.js.map +1 -0
- package/dist/commands/hooks.d.ts +11 -0
- package/dist/commands/hooks.js +248 -0
- package/dist/commands/hooks.js.map +1 -0
- package/dist/commands/index.d.ts +3 -0
- package/dist/commands/index.js +28 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/ingest.d.ts +6 -0
- package/dist/commands/ingest.js +52 -0
- package/dist/commands/ingest.js.map +1 -0
- package/dist/commands/init.d.ts +7 -0
- package/dist/commands/init.js +179 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/memory.d.ts +39 -0
- package/dist/commands/memory.js +184 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/native.d.ts +2 -0
- package/dist/commands/native.js +17 -0
- package/dist/commands/native.js.map +1 -0
- package/dist/commands/read.d.ts +8 -0
- package/dist/commands/read.js +87 -0
- package/dist/commands/read.js.map +1 -0
- package/dist/commands/rules.d.ts +5 -0
- package/dist/commands/rules.js +62 -0
- package/dist/commands/rules.js.map +1 -0
- package/dist/commands/run.d.ts +22 -0
- package/dist/commands/run.js +200 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/spec.d.ts +11 -0
- package/dist/commands/spec.js +217 -0
- package/dist/commands/spec.js.map +1 -0
- package/dist/commands/stats.d.ts +15 -0
- package/dist/commands/stats.js +82 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/compressors/agent-response-reducer.d.ts +13 -0
- package/dist/compressors/agent-response-reducer.js +160 -0
- package/dist/compressors/agent-response-reducer.js.map +1 -0
- package/dist/compressors/generic-stream.d.ts +6 -0
- package/dist/compressors/generic-stream.js +63 -0
- package/dist/compressors/generic-stream.js.map +1 -0
- package/dist/compressors/git-reducer.d.ts +2 -0
- package/dist/compressors/git-reducer.js +78 -0
- package/dist/compressors/git-reducer.js.map +1 -0
- package/dist/compressors/index.d.ts +10 -0
- package/dist/compressors/index.js +84 -0
- package/dist/compressors/index.js.map +1 -0
- package/dist/compressors/json-toon.d.ts +14 -0
- package/dist/compressors/json-toon.js +149 -0
- package/dist/compressors/json-toon.js.map +1 -0
- package/dist/compressors/test-reducer.d.ts +2 -0
- package/dist/compressors/test-reducer.js +50 -0
- package/dist/compressors/test-reducer.js.map +1 -0
- package/dist/core/cache-normalizer.d.ts +23 -0
- package/dist/core/cache-normalizer.js +170 -0
- package/dist/core/cache-normalizer.js.map +1 -0
- package/dist/core/config.d.ts +104 -0
- package/dist/core/config.js +186 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/dedupe-store.d.ts +17 -0
- package/dist/core/dedupe-store.js +44 -0
- package/dist/core/dedupe-store.js.map +1 -0
- package/dist/core/document-ingest.d.ts +15 -0
- package/dist/core/document-ingest.js +45 -0
- package/dist/core/document-ingest.js.map +1 -0
- package/dist/core/file-scanner.d.ts +47 -0
- package/dist/core/file-scanner.js +248 -0
- package/dist/core/file-scanner.js.map +1 -0
- package/dist/core/git.d.ts +2 -0
- package/dist/core/git.js +29 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/metrics-store.d.ts +20 -0
- package/dist/core/metrics-store.js +19 -0
- package/dist/core/metrics-store.js.map +1 -0
- package/dist/core/native-engine.d.ts +25 -0
- package/dist/core/native-engine.js +137 -0
- package/dist/core/native-engine.js.map +1 -0
- package/dist/core/native-runner-adapter.d.ts +18 -0
- package/dist/core/native-runner-adapter.js +60 -0
- package/dist/core/native-runner-adapter.js.map +1 -0
- package/dist/core/raw-store.d.ts +28 -0
- package/dist/core/raw-store.js +57 -0
- package/dist/core/raw-store.js.map +1 -0
- package/dist/core/response-policy.d.ts +11 -0
- package/dist/core/response-policy.js +14 -0
- package/dist/core/response-policy.js.map +1 -0
- package/dist/core/rule-extractor.d.ts +18 -0
- package/dist/core/rule-extractor.js +116 -0
- package/dist/core/rule-extractor.js.map +1 -0
- package/dist/core/rule-validator.d.ts +9 -0
- package/dist/core/rule-validator.js +85 -0
- package/dist/core/rule-validator.js.map +1 -0
- package/dist/core/safety-policy.d.ts +10 -0
- package/dist/core/safety-policy.js +69 -0
- package/dist/core/safety-policy.js.map +1 -0
- package/dist/core/token-estimator.d.ts +2 -0
- package/dist/core/token-estimator.js +7 -0
- package/dist/core/token-estimator.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/docs/architecture.md +47 -0
- package/docs/assets/screenshots/README.md +18 -0
- package/docs/assets/screenshots/init.svg +13 -0
- package/docs/assets/screenshots/run-expand.svg +13 -0
- package/docs/assets/screenshots/stats.svg +11 -0
- package/docs/assets/soturail-fox.svg +17 -0
- package/docs/assets/soturail-icon.svg +10 -0
- package/docs/benchmarking.md +34 -0
- package/docs/branding.md +14 -0
- package/docs/hooks/claude.md +24 -0
- package/docs/hooks/codex.md +5 -0
- package/docs/hooks/cursor.md +5 -0
- package/docs/hooks/gemini.md +5 -0
- package/docs/hooks/host-capabilities.json +22 -0
- package/docs/hooks.md +15 -0
- package/docs/knowledge-to-rules.md +23 -0
- package/docs/metrics.md +35 -0
- package/docs/mvp.md +21 -0
- package/docs/native-runner.md +52 -0
- package/docs/prompt-caching.md +27 -0
- package/docs/pt-BR/visao-geral.md +26 -0
- package/docs/public-roadmap.md +20 -0
- package/docs/reducers.md +19 -0
- package/docs/release-checklist.md +13 -0
- package/docs/response-compression.md +15 -0
- package/docs/rules.md +23 -0
- package/docs/security-model.md +32 -0
- package/docs/spec-driven-workflow.md +22 -0
- package/docs/usage.md +64 -0
- 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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"}
|
package/dist/core/git.js
ADDED
|
@@ -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
|
+
}
|