soturail 0.2.1 → 0.2.3

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 (45) hide show
  1. package/README.md +81 -0
  2. package/dist/cli.js +6 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/bench.d.ts +14 -3
  5. package/dist/commands/bench.js +237 -180
  6. package/dist/commands/bench.js.map +1 -1
  7. package/dist/commands/release.d.ts +3 -0
  8. package/dist/commands/release.js +59 -0
  9. package/dist/commands/release.js.map +1 -0
  10. package/dist/commands/run.js +20 -1
  11. package/dist/commands/run.js.map +1 -1
  12. package/dist/commands/self.d.ts +2 -0
  13. package/dist/commands/self.js +49 -0
  14. package/dist/commands/self.js.map +1 -0
  15. package/dist/commands/stats.d.ts +6 -0
  16. package/dist/commands/stats.js +28 -0
  17. package/dist/commands/stats.js.map +1 -1
  18. package/dist/core/config.d.ts +1 -1
  19. package/dist/core/config.js +1 -0
  20. package/dist/core/config.js.map +1 -1
  21. package/dist/core/file-scanner.js +6 -2
  22. package/dist/core/file-scanner.js.map +1 -1
  23. package/dist/core/metrics-store.d.ts +7 -0
  24. package/dist/core/metrics-store.js.map +1 -1
  25. package/dist/core/release-preflight.d.ts +22 -0
  26. package/dist/core/release-preflight.js +199 -0
  27. package/dist/core/release-preflight.js.map +1 -0
  28. package/dist/core/self-dogfood.d.ts +56 -0
  29. package/dist/core/self-dogfood.js +323 -0
  30. package/dist/core/self-dogfood.js.map +1 -0
  31. package/dist/core/version.d.ts +1 -0
  32. package/dist/core/version.js +3 -0
  33. package/dist/core/version.js.map +1 -0
  34. package/docs/benchmarking.md +4 -2
  35. package/docs/hooks/claude.md +4 -0
  36. package/docs/hooks/codex.md +11 -0
  37. package/docs/hooks/cursor.md +11 -0
  38. package/docs/hooks/gemini.md +11 -0
  39. package/docs/hooks.md +11 -0
  40. package/docs/release-checklist.md +76 -6
  41. package/docs/release-workflow.md +84 -0
  42. package/docs/skill-rail.md +28 -0
  43. package/docs/windows.md +97 -0
  44. package/docs/workflow-rail.md +26 -0
  45. package/package.json +9 -3
@@ -0,0 +1,199 @@
1
+ import { spawn } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import { promises as fs } from "node:fs";
4
+ import path from "node:path";
5
+ const SEMVER_PATTERN = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/;
6
+ export async function runReleasePreflight(root = process.cwd(), options = {}) {
7
+ const resolvedRoot = path.resolve(root);
8
+ const runAudit = options.runAudit ?? true;
9
+ const runPack = options.runPack ?? true;
10
+ const gates = [];
11
+ const packageJson = await readOptionalJson(path.join(resolvedRoot, "package.json"));
12
+ const packageName = typeof packageJson?.name === "string" ? packageJson.name : null;
13
+ const version = typeof packageJson?.version === "string" ? packageJson.version : null;
14
+ addGate(gates, "package_version", "package.json version", Boolean(version && SEMVER_PATTERN.test(version)), version ?? "missing");
15
+ const packageLock = await readOptionalJson(path.join(resolvedRoot, "package-lock.json"));
16
+ const lockVersion = typeof packageLock?.version === "string" ? packageLock.version : null;
17
+ const lockRootVersion = packageLock && typeof packageLock === "object"
18
+ && "packages" in packageLock
19
+ && packageLock.packages
20
+ && typeof packageLock.packages === "object"
21
+ && "" in packageLock.packages
22
+ && packageLock.packages[""]
23
+ && typeof packageLock.packages[""] === "object"
24
+ && "version" in packageLock.packages[""]
25
+ && typeof packageLock.packages[""].version === "string"
26
+ ? packageLock.packages[""].version
27
+ : null;
28
+ addGate(gates, "package_lock_version", "package-lock version sync", Boolean(version && lockVersion === version && lockRootVersion === version), `package-lock.version=${lockVersion ?? "missing"}, packages[\"\"].version=${lockRootVersion ?? "missing"}`);
29
+ const cliVersion = await readCliVersion(resolvedRoot, options.cliCommand);
30
+ addGate(gates, "cli_version", "CLI runtime version sync", Boolean(version && cliVersion.code === 0 && cliVersion.stdout.trim() === version), cliVersion.code === 0 ? `cli=${cliVersion.stdout.trim() || "empty"}, package=${version ?? "missing"}` : cliVersion.stderr.trim());
31
+ if (runPack) {
32
+ const pack = await runProcess("npm", ["pack", "--dry-run"], resolvedRoot, true);
33
+ const combined = `${pack.stdout}\n${pack.stderr}`;
34
+ const expectedTarball = packageName && version ? `${packageName}-${version}.tgz` : null;
35
+ addGate(gates, "npm_pack_metadata", "npm pack metadata", Boolean(pack.code === 0 && expectedTarball && combined.includes(expectedTarball)), expectedTarball ? `expected ${expectedTarball}` : "missing package name or version");
36
+ }
37
+ else {
38
+ addGate(gates, "npm_pack_metadata", "npm pack metadata", true, "skipped by test options", false);
39
+ }
40
+ const readme = await readOptionalText(path.join(resolvedRoot, "README.md"));
41
+ addGate(gates, "readme_install", "README install instructions", Boolean(readme && /npx\s+soturail/.test(readme) && readme.includes("npm install -g soturail") && readme.includes("soturail --version")), readme ? "README.md contains npm/npx/global install guidance" : "README.md missing");
42
+ const changelog = await readOptionalText(path.join(resolvedRoot, "CHANGELOG.md"));
43
+ addGate(gates, "changelog_entry", "CHANGELOG version entry", Boolean(version && changelog?.includes(`## [${version}]`)), version ? `expected ## [${version}]` : "missing version");
44
+ const releaseNotesPath = version ? path.join(resolvedRoot, `RELEASE_NOTES_v${version}.md`) : "";
45
+ addGate(gates, "release_notes", "release notes file", Boolean(version && existsSync(releaseNotesPath)), version ? path.relative(resolvedRoot, releaseNotesPath) : "missing version");
46
+ addGate(gates, "license", "LICENSE file", existsSync(path.join(resolvedRoot, "LICENSE")), "LICENSE");
47
+ let fullAudit = { total: 0, names: [] };
48
+ let runtimeAudit = { total: 0, names: [] };
49
+ if (runAudit) {
50
+ const runtime = await runProcess("npm", ["audit", "--omit=dev", "--json"], resolvedRoot, true);
51
+ runtimeAudit = parseAudit(runtime.stdout);
52
+ addGate(gates, "runtime_audit", "runtime npm audit", runtime.code === 0 && runtimeAudit.total === 0, runtimeAudit.total === 0 ? "0 runtime vulnerabilities" : `${runtimeAudit.total} runtime findings: ${runtimeAudit.names.join(", ")}`);
53
+ const full = await runProcess("npm", ["audit", "--json"], resolvedRoot, true);
54
+ fullAudit = parseAudit(full.stdout);
55
+ }
56
+ else {
57
+ addGate(gates, "runtime_audit", "runtime npm audit", true, "skipped by test options", false);
58
+ }
59
+ const fullAuditDevOnly = fullAudit.total === 0 || (runtimeAudit.total === 0 && fullAudit.total >= runtimeAudit.total);
60
+ addGate(gates, "full_audit_explained", "full npm audit explanation", fullAuditDevOnly, fullAudit.total === 0
61
+ ? "0 full audit findings"
62
+ : `${fullAudit.total} full audit findings treated as dev-only: ${fullAudit.names.join(", ")}`);
63
+ return {
64
+ ok: gates.every((gate) => !gate.required || gate.ok),
65
+ version,
66
+ packageName,
67
+ fullAuditDevOnly,
68
+ fullAuditFindings: fullAudit.names,
69
+ gates
70
+ };
71
+ }
72
+ export function formatReleasePreflight(result) {
73
+ const lines = [
74
+ `Release preflight: ${result.ok ? "passed" : "failed"}`,
75
+ `package: ${result.packageName ?? "unknown"}`,
76
+ `version: ${result.version ?? "unknown"}`,
77
+ `full_audit_dev_only: ${result.fullAuditDevOnly}`,
78
+ "gates:"
79
+ ];
80
+ for (const gate of result.gates) {
81
+ lines.push(`- ${gate.ok ? "PASS" : "FAIL"} ${gate.id}: ${gate.details}`);
82
+ }
83
+ return lines.join("\n");
84
+ }
85
+ async function readCliVersion(root, cliCommand) {
86
+ if (cliCommand && cliCommand.length > 0) {
87
+ const command = cliCommand[0];
88
+ const args = cliCommand.slice(1);
89
+ if (!command)
90
+ return { code: 1, stdout: "", stderr: "empty CLI command" };
91
+ return runProcess(command, args, root, true);
92
+ }
93
+ const cliPath = path.join(root, "dist", "cli.js");
94
+ if (!existsSync(cliPath)) {
95
+ return { code: 1, stdout: "", stderr: "dist/cli.js is missing; run npm run build first" };
96
+ }
97
+ return runProcess(process.execPath, [cliPath, "--version"], root, true);
98
+ }
99
+ async function readOptionalText(filePath) {
100
+ try {
101
+ return await fs.readFile(filePath, "utf8");
102
+ }
103
+ catch {
104
+ return null;
105
+ }
106
+ }
107
+ async function readOptionalJson(filePath) {
108
+ const text = await readOptionalText(filePath);
109
+ if (!text)
110
+ return null;
111
+ try {
112
+ return JSON.parse(text);
113
+ }
114
+ catch {
115
+ return null;
116
+ }
117
+ }
118
+ function addGate(gates, id, label, ok, details, required = true) {
119
+ gates.push({ id, label, ok, details, required });
120
+ }
121
+ function parseAudit(text) {
122
+ try {
123
+ const parsed = JSON.parse(text);
124
+ return {
125
+ total: parsed.metadata?.vulnerabilities?.total ?? 0,
126
+ names: Object.keys(parsed.vulnerabilities ?? {})
127
+ };
128
+ }
129
+ catch {
130
+ return { total: -1, names: [] };
131
+ }
132
+ }
133
+ async function runProcess(command, args, cwd, allowFailure = false) {
134
+ return new Promise((resolve, reject) => {
135
+ const spawnSpec = resolveSpawn(command, args);
136
+ const child = spawn(spawnSpec.command, spawnSpec.args, {
137
+ cwd,
138
+ shell: false,
139
+ windowsHide: true,
140
+ env: process.env
141
+ });
142
+ let stdout = "";
143
+ let stderr = "";
144
+ child.stdout?.on("data", (chunk) => {
145
+ stdout += chunk.toString();
146
+ });
147
+ child.stderr?.on("data", (chunk) => {
148
+ stderr += chunk.toString();
149
+ });
150
+ child.on("error", reject);
151
+ child.on("close", (code) => {
152
+ const result = { code: code ?? 1, stdout, stderr };
153
+ if ((code ?? 1) !== 0 && !allowFailure) {
154
+ reject(new Error(`${command} ${args.join(" ")} failed with exit code ${code ?? 1}`));
155
+ }
156
+ else {
157
+ resolve(result);
158
+ }
159
+ });
160
+ });
161
+ }
162
+ function resolveSpawn(command, args) {
163
+ if (process.platform !== "win32")
164
+ return { command, args };
165
+ if (command === "npm" || command === "npx") {
166
+ const cli = npmCliPath(command);
167
+ if (cli)
168
+ return { command: process.execPath, args: [cli, ...args] };
169
+ }
170
+ if (command === "node")
171
+ return { command: process.execPath, args };
172
+ return { command: resolveWindowsCommand(command), args };
173
+ }
174
+ function npmCliPath(command) {
175
+ const npmExecPath = process.env.npm_execpath;
176
+ const candidates = [];
177
+ if (npmExecPath) {
178
+ const dir = path.dirname(npmExecPath);
179
+ candidates.push(path.resolve(dir, command === "npm" ? "npm-cli.js" : "npx-cli.js"));
180
+ }
181
+ const nodeDir = path.dirname(process.execPath);
182
+ candidates.push(path.resolve(nodeDir, "node_modules", "npm", "bin", command === "npm" ? "npm-cli.js" : "npx-cli.js"));
183
+ return candidates.find((candidate) => existsSync(candidate));
184
+ }
185
+ function resolveWindowsCommand(command) {
186
+ if (path.isAbsolute(command) && existsSync(command))
187
+ return command;
188
+ const extensions = path.extname(command) ? [""] : [".exe", ".cmd", ".bat", ""];
189
+ const entries = (process.env.PATH ?? "").split(path.delimiter).filter(Boolean);
190
+ for (const entry of entries) {
191
+ for (const extension of extensions) {
192
+ const candidate = path.resolve(entry, `${command}${extension}`);
193
+ if (existsSync(candidate))
194
+ return candidate;
195
+ }
196
+ }
197
+ return command;
198
+ }
199
+ //# sourceMappingURL=release-preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-preflight.js","sourceRoot":"","sources":["../../src/core/release-preflight.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { type Writable } from "node:stream";
2
+ import { type BenchResult } from "../commands/bench.js";
3
+ export interface SelfDoctorResult {
4
+ ok: boolean;
5
+ root: string;
6
+ package_name: string | null;
7
+ package_version: string | null;
8
+ missing: string[];
9
+ }
10
+ export interface SelfIndexResult {
11
+ indexed_files_count: number;
12
+ ignored_files_count: number;
13
+ ignored_directories_count: number;
14
+ }
15
+ export interface SelfRunStep {
16
+ ok: boolean;
17
+ exit_code: number | null;
18
+ raw_id: string | null;
19
+ raw_tokens: number;
20
+ reduced_tokens: number;
21
+ summary: string;
22
+ error?: string;
23
+ }
24
+ export interface SelfBenchResult {
25
+ ok: boolean;
26
+ raw_id: string | null;
27
+ cases_count: number;
28
+ summary: string;
29
+ results: BenchResult[];
30
+ error?: string;
31
+ }
32
+ export interface SelfDogfoodState {
33
+ doctor?: SelfDoctorResult;
34
+ index?: SelfIndexResult;
35
+ build?: SelfRunStep;
36
+ test?: SelfRunStep;
37
+ bench?: SelfBenchResult;
38
+ report_path?: string;
39
+ errors: string[];
40
+ }
41
+ export interface SelfReportInput extends SelfDogfoodState {
42
+ root?: string;
43
+ }
44
+ export declare function createEmptySelfState(): SelfDogfoodState;
45
+ export declare function selfDoctor(root?: string): Promise<SelfDoctorResult>;
46
+ export declare function assertSotuRailRepository(root?: string): Promise<SelfDoctorResult>;
47
+ export declare function selfIndex(root?: string): Promise<SelfIndexResult>;
48
+ export declare function selfBuild(root?: string, terminalStdout?: Writable, terminalStderr?: Writable): Promise<SelfRunStep>;
49
+ export declare function selfTest(root?: string, terminalStdout?: Writable, terminalStderr?: Writable): Promise<SelfRunStep>;
50
+ export declare function selfBench(root?: string, terminalStdout?: Writable, terminalStderr?: Writable): Promise<SelfBenchResult>;
51
+ export declare function writeSelfReport(input: SelfReportInput): Promise<string>;
52
+ export declare function selfAll(root?: string, terminalStdout?: Writable, terminalStderr?: Writable): Promise<SelfDogfoodState>;
53
+ export declare function formatSelfDoctor(result: SelfDoctorResult): string;
54
+ export declare function formatSelfIndex(result: SelfIndexResult): string;
55
+ export declare function formatSelfRunStep(label: string, result: SelfRunStep): string;
56
+ export declare function formatSelfBench(result: SelfBenchResult): string;
@@ -0,0 +1,323 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promises as fs } from "node:fs";
3
+ import path from "node:path";
4
+ import { PassThrough } from "node:stream";
5
+ import { promisify } from "node:util";
6
+ import { runBenchmarks, summarizeBenchmarkResults } from "../commands/bench.js";
7
+ import { executeRunCommand } from "../commands/run.js";
8
+ import { ensureWorkspace, getWorkspacePaths, loadConfig } from "./config.js";
9
+ import { scanRepository, writeRepoMap } from "./file-scanner.js";
10
+ import { getCurrentGitCommit } from "./git.js";
11
+ import { estimateTokens } from "./token-estimator.js";
12
+ const execFileAsync = promisify(execFile);
13
+ const REQUIRED_SOTURAIL_PATHS = [
14
+ "package.json",
15
+ "README.md",
16
+ "CHANGELOG.md",
17
+ "ROADMAP.md",
18
+ path.join("src", "cli.ts"),
19
+ path.join("src", "commands"),
20
+ path.join("src", "core"),
21
+ "tests",
22
+ "docs"
23
+ ];
24
+ export function createEmptySelfState() {
25
+ return { errors: [] };
26
+ }
27
+ export async function selfDoctor(root = process.cwd()) {
28
+ const resolvedRoot = path.resolve(root);
29
+ const missing = [];
30
+ for (const required of REQUIRED_SOTURAIL_PATHS) {
31
+ const absolute = path.resolve(resolvedRoot, required);
32
+ try {
33
+ await fs.access(absolute);
34
+ }
35
+ catch {
36
+ missing.push(path.normalize(required));
37
+ }
38
+ }
39
+ const packageJson = await readPackageJson(resolvedRoot);
40
+ if (packageJson.name !== "soturail") {
41
+ missing.push("package.json:name=soturail");
42
+ }
43
+ return {
44
+ ok: missing.length === 0,
45
+ root: resolvedRoot,
46
+ package_name: typeof packageJson.name === "string" ? packageJson.name : null,
47
+ package_version: typeof packageJson.version === "string" ? packageJson.version : null,
48
+ missing
49
+ };
50
+ }
51
+ export async function assertSotuRailRepository(root = process.cwd()) {
52
+ const doctor = await selfDoctor(root);
53
+ if (!doctor.ok) {
54
+ throw new Error(`This directory does not look like the SotuRail repository. Missing: ${doctor.missing.join(", ")}`);
55
+ }
56
+ return doctor;
57
+ }
58
+ export async function selfIndex(root = process.cwd()) {
59
+ await assertSotuRailRepository(root);
60
+ await ensureWorkspace(root);
61
+ const config = await loadConfig(root);
62
+ const repoMap = await scanRepository(root, config);
63
+ await writeRepoMap(root, repoMap);
64
+ return {
65
+ indexed_files_count: repoMap.total_files,
66
+ ignored_files_count: repoMap.stats.ignored_files,
67
+ ignored_directories_count: repoMap.stats.ignored_directories
68
+ };
69
+ }
70
+ export async function selfBuild(root = process.cwd(), terminalStdout, terminalStderr) {
71
+ return selfRunCommand(["npm", "run", "build"], root, terminalStdout, terminalStderr);
72
+ }
73
+ export async function selfTest(root = process.cwd(), terminalStdout, terminalStderr) {
74
+ return selfRunCommand(["npm", "test"], root, terminalStdout, terminalStderr);
75
+ }
76
+ export async function selfBench(root = process.cwd(), terminalStdout, terminalStderr) {
77
+ await assertSotuRailRepository(root);
78
+ const cliPath = path.resolve(root, "dist", "cli.js");
79
+ let runResult = null;
80
+ try {
81
+ await fs.access(cliPath);
82
+ runResult = await executeRunCommand([`"${process.execPath}" "${cliPath}" bench run --engine ts`], {
83
+ terminalStdout: terminalStdout ?? drainedStream(),
84
+ terminalStderr: terminalStderr ?? drainedStream(),
85
+ engine: "ts"
86
+ }, root);
87
+ }
88
+ catch {
89
+ // If the built CLI is unavailable, the in-process benchmark path still gives a real report.
90
+ }
91
+ const results = runResult ? await readLatestBenchmarkResults(root) : await runBenchmarks({ engine: "ts" }, root);
92
+ return {
93
+ ok: runResult ? runResult.exitCode === 0 : true,
94
+ raw_id: runResult?.rawId ?? null,
95
+ cases_count: results.length,
96
+ summary: summarizeBenchmarkResults(results),
97
+ results
98
+ };
99
+ }
100
+ export async function writeSelfReport(input) {
101
+ const root = path.resolve(input.root ?? process.cwd());
102
+ await ensureWorkspace(root);
103
+ const paths = getWorkspacePaths(root);
104
+ const reportsDir = path.resolve(paths.workspace, "reports");
105
+ await fs.mkdir(reportsDir, { recursive: true });
106
+ const reportPath = path.resolve(reportsDir, "self-dogfood.md");
107
+ const packageJson = await readPackageJson(root);
108
+ const commit = await getCurrentGitCommit(root);
109
+ const branch = await getCurrentGitBranch(root);
110
+ const accounting = selfTokenAccounting(input);
111
+ const report = [
112
+ "# SotuRail Self-Dogfood Report",
113
+ "",
114
+ "## Stable Project Description",
115
+ "",
116
+ "SotuRail aims to unify terminal compression, progressive repo reading, Spec-Driven workflows, local memory, rules extraction, agent hooks, benchmarks and cache-friendly payloads into one local-first workflow.",
117
+ "",
118
+ `- package_name: ${stringOrUnknown(packageJson.name)}`,
119
+ `- package_version: ${stringOrUnknown(packageJson.version)}`,
120
+ "- report_schema: self-dogfood-v1",
121
+ "",
122
+ "## Stable Quality Rails",
123
+ "",
124
+ "- Build, test and benchmark commands should run through SotuRail so raw logs are recoverable.",
125
+ "- Token counts are deterministic estimates unless provider metadata is explicitly imported.",
126
+ "- Dynamic raw IDs, timestamps, logs and volatile command status stay below this stable section.",
127
+ "",
128
+ "## Dynamic Execution Data",
129
+ "",
130
+ `- repository_path: ${path.normalize(root)}`,
131
+ `- current_git_commit_hash: ${commit ?? "unknown"}`,
132
+ `- current_branch: ${branch ?? "unknown"}`,
133
+ `- doctor_ok: ${input.doctor?.ok ?? false}`,
134
+ `- indexed_files_count: ${input.index?.indexed_files_count ?? 0}`,
135
+ `- ignored_files_directories_count: ${(input.index?.ignored_files_count ?? 0) + (input.index?.ignored_directories_count ?? 0)}`,
136
+ `- build_result: ${formatStep(input.build)}`,
137
+ `- test_result: ${formatStep(input.test)}`,
138
+ `- benchmark_summary: ${input.bench?.summary.replace(/\r?\n/g, " | ") ?? "not run"}`,
139
+ `- build_raw_id: ${input.build?.raw_id ?? "n/a"}`,
140
+ `- test_raw_id: ${input.test?.raw_id ?? "n/a"}`,
141
+ `- benchmark_raw_id: ${input.bench?.raw_id ?? "n/a"}`,
142
+ `- estimated_raw_tokens: ${accounting.estimated_raw_tokens}`,
143
+ `- estimated_reduced_tokens: ${accounting.estimated_reduced_tokens}`,
144
+ `- estimated_metadata_overhead_tokens: ${accounting.estimated_metadata_overhead_tokens}`,
145
+ `- compression_effective: ${accounting.compression_effective}`,
146
+ "",
147
+ "## Known Limitations",
148
+ "",
149
+ "- Native benchmark rows are marked unavailable when the optional native binary is not built.",
150
+ "- Self-dogfood reports are local evidence, not provider cache-hit evidence.",
151
+ "- Small command outputs may cost more after metadata, but recovery and audit paths remain valuable.",
152
+ "",
153
+ "## Recommended Next Action",
154
+ "",
155
+ input.errors.length > 0
156
+ ? `Review partial failures: ${input.errors.join("; ")}`
157
+ : "Keep running `soturail self all` before release-oriented commits.",
158
+ ""
159
+ ].join("\n");
160
+ await fs.writeFile(reportPath, report, "utf8");
161
+ return reportPath;
162
+ }
163
+ export async function selfAll(root = process.cwd(), terminalStdout, terminalStderr) {
164
+ const state = createEmptySelfState();
165
+ try {
166
+ state.doctor = await selfDoctor(root);
167
+ if (!state.doctor.ok) {
168
+ state.errors.push(`doctor failed: ${state.doctor.missing.join(", ")}`);
169
+ state.report_path = await writeSelfReport({ ...state, root });
170
+ return state;
171
+ }
172
+ state.index = await selfIndex(root);
173
+ state.build = await selfBuild(root, terminalStdout, terminalStderr);
174
+ if (!state.build.ok) {
175
+ state.errors.push(`build failed: raw_id=${state.build.raw_id ?? "n/a"}`);
176
+ state.report_path = await writeSelfReport({ ...state, root });
177
+ return state;
178
+ }
179
+ state.test = await selfTest(root, terminalStdout, terminalStderr);
180
+ if (!state.test.ok) {
181
+ state.errors.push(`test failed: raw_id=${state.test.raw_id ?? "n/a"}`);
182
+ state.report_path = await writeSelfReport({ ...state, root });
183
+ return state;
184
+ }
185
+ state.bench = await selfBench(root, terminalStdout, terminalStderr);
186
+ if (!state.bench.ok) {
187
+ state.errors.push(`bench failed: raw_id=${state.bench.raw_id ?? "n/a"}`);
188
+ }
189
+ }
190
+ catch (error) {
191
+ state.errors.push(error instanceof Error ? error.message : String(error));
192
+ }
193
+ state.report_path = await writeSelfReport({ ...state, root });
194
+ return state;
195
+ }
196
+ export function formatSelfDoctor(result) {
197
+ return [
198
+ "SotuRail self doctor",
199
+ `ok: ${result.ok}`,
200
+ `root: ${path.normalize(result.root)}`,
201
+ `package_name: ${result.package_name ?? "unknown"}`,
202
+ `package_version: ${result.package_version ?? "unknown"}`,
203
+ `missing: ${result.missing.length === 0 ? "none" : result.missing.join(", ")}`
204
+ ].join("\n") + "\n";
205
+ }
206
+ export function formatSelfIndex(result) {
207
+ return [
208
+ "SotuRail self index",
209
+ `indexed_files_count: ${result.indexed_files_count}`,
210
+ `ignored_files_count: ${result.ignored_files_count}`,
211
+ `ignored_directories_count: ${result.ignored_directories_count}`
212
+ ].join("\n") + "\n";
213
+ }
214
+ export function formatSelfRunStep(label, result) {
215
+ return [
216
+ `SotuRail self ${label}`,
217
+ `ok: ${result.ok}`,
218
+ `exit_code: ${result.exit_code ?? "n/a"}`,
219
+ `raw_id: ${result.raw_id ?? "n/a"}`
220
+ ].join("\n") + "\n";
221
+ }
222
+ export function formatSelfBench(result) {
223
+ return [
224
+ "SotuRail self bench",
225
+ `ok: ${result.ok}`,
226
+ `raw_id: ${result.raw_id ?? "n/a"}`,
227
+ `cases_count: ${result.cases_count}`,
228
+ result.summary
229
+ ].join("\n") + "\n";
230
+ }
231
+ function selfTokenAccounting(input) {
232
+ const estimatedRaw = (input.build?.raw_tokens ?? 0) + (input.test?.raw_tokens ?? 0);
233
+ const estimatedReduced = (input.build?.reduced_tokens ?? 0) + (input.test?.reduced_tokens ?? 0);
234
+ const metadata = estimateTokens(JSON.stringify({
235
+ doctor: input.doctor?.ok,
236
+ index: input.index,
237
+ build_raw_id: input.build?.raw_id,
238
+ test_raw_id: input.test?.raw_id,
239
+ bench_raw_id: input.bench?.raw_id
240
+ }));
241
+ return {
242
+ estimated_raw_tokens: estimatedRaw,
243
+ estimated_reduced_tokens: estimatedReduced,
244
+ estimated_metadata_overhead_tokens: metadata,
245
+ compression_effective: estimatedReduced + metadata <= estimatedRaw
246
+ };
247
+ }
248
+ async function selfRunCommand(commandParts, root, terminalStdout, terminalStderr) {
249
+ await assertSotuRailRepository(root);
250
+ try {
251
+ const result = await executeRunCommand(commandParts, {
252
+ terminalStdout: terminalStdout ?? drainedStream(),
253
+ terminalStderr: terminalStderr ?? drainedStream(),
254
+ engine: "ts"
255
+ }, root);
256
+ return {
257
+ ok: result.exitCode === 0,
258
+ exit_code: result.exitCode,
259
+ raw_id: result.rawId,
260
+ raw_tokens: result.record.raw_tokens_estimated,
261
+ reduced_tokens: result.record.compressed_tokens_estimated,
262
+ summary: result.summary
263
+ };
264
+ }
265
+ catch (error) {
266
+ return {
267
+ ok: false,
268
+ exit_code: null,
269
+ raw_id: null,
270
+ raw_tokens: 0,
271
+ reduced_tokens: 0,
272
+ summary: "",
273
+ error: error instanceof Error ? error.message : String(error)
274
+ };
275
+ }
276
+ }
277
+ async function readPackageJson(root) {
278
+ try {
279
+ return JSON.parse(await fs.readFile(path.resolve(root, "package.json"), "utf8"));
280
+ }
281
+ catch {
282
+ return {};
283
+ }
284
+ }
285
+ async function readLatestBenchmarkResults(root) {
286
+ const filePath = path.resolve(root, "benchmarks", "results", "latest.json");
287
+ try {
288
+ const parsed = JSON.parse(await fs.readFile(filePath, "utf8"));
289
+ return Array.isArray(parsed.results) ? parsed.results : [];
290
+ }
291
+ catch {
292
+ return [];
293
+ }
294
+ }
295
+ async function getCurrentGitBranch(root) {
296
+ try {
297
+ const { stdout } = await execFileAsync("git", ["rev-parse", "--abbrev-ref", "HEAD"], {
298
+ cwd: root,
299
+ timeout: 3000,
300
+ windowsHide: true
301
+ });
302
+ const branch = stdout.trim();
303
+ return branch.length > 0 ? branch : null;
304
+ }
305
+ catch {
306
+ return null;
307
+ }
308
+ }
309
+ function drainedStream() {
310
+ const stream = new PassThrough();
311
+ stream.resume();
312
+ return stream;
313
+ }
314
+ function formatStep(step) {
315
+ if (!step) {
316
+ return "not run";
317
+ }
318
+ return step.ok ? `pass exit_code=${step.exit_code}` : `fail exit_code=${step.exit_code ?? "n/a"}`;
319
+ }
320
+ function stringOrUnknown(value) {
321
+ return typeof value === "string" && value.length > 0 ? value : "unknown";
322
+ }
323
+ //# sourceMappingURL=self-dogfood.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-dogfood.js","sourceRoot":"","sources":["../../src/core/self-dogfood.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const SOTURAIL_VERSION = "0.2.3";
@@ -0,0 +1,3 @@
1
+ // Generated by scripts/sync-version.mjs from package.json. Do not edit manually.
2
+ export const SOTURAIL_VERSION = "0.2.3";
3
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/core/version.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC"}
@@ -18,9 +18,11 @@ The suite groups results as:
18
18
 
19
19
  - terminal compression;
20
20
  - agent response compression;
21
- - JSON/tool payload compression;
22
21
  - knowledge structuring;
23
- - native performance when available.
22
+ - cache stability;
23
+ - native engine availability/performance when available.
24
+
25
+ Terminal compression includes npm install noise, Vitest failures, TypeScript diagnostics, git diff/status noise and JSON/tool payload output.
24
26
 
25
27
  Knowledge-to-Rules is not judged as pure compression. It creates reusable structured rules, citations and validator metadata.
26
28