soturail 0.4.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/LICENSE +15 -21
  2. package/README.md +292 -157
  3. package/dist/cli.js +12 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/agents.js +39 -5
  6. package/dist/commands/agents.js.map +1 -1
  7. package/dist/commands/context.js +66 -2
  8. package/dist/commands/context.js.map +1 -1
  9. package/dist/commands/diagram.d.ts +2 -0
  10. package/dist/commands/diagram.js +24 -0
  11. package/dist/commands/diagram.js.map +1 -0
  12. package/dist/commands/eval.d.ts +2 -0
  13. package/dist/commands/eval.js +25 -0
  14. package/dist/commands/eval.js.map +1 -0
  15. package/dist/commands/format.js +14 -4
  16. package/dist/commands/format.js.map +1 -1
  17. package/dist/commands/fs.d.ts +2 -0
  18. package/dist/commands/fs.js +19 -0
  19. package/dist/commands/fs.js.map +1 -0
  20. package/dist/commands/harness.d.ts +2 -0
  21. package/dist/commands/harness.js +35 -0
  22. package/dist/commands/harness.js.map +1 -0
  23. package/dist/commands/mcp.js +5 -0
  24. package/dist/commands/mcp.js.map +1 -1
  25. package/dist/commands/memory.js +40 -0
  26. package/dist/commands/memory.js.map +1 -1
  27. package/dist/commands/native.js +4 -0
  28. package/dist/commands/native.js.map +1 -1
  29. package/dist/commands/policy.d.ts +2 -0
  30. package/dist/commands/policy.js +25 -0
  31. package/dist/commands/policy.js.map +1 -0
  32. package/dist/commands/release.js +9 -2
  33. package/dist/commands/release.js.map +1 -1
  34. package/dist/commands/run.js +15 -3
  35. package/dist/commands/run.js.map +1 -1
  36. package/dist/commands/skills.js +15 -0
  37. package/dist/commands/skills.js.map +1 -1
  38. package/dist/commands/validate.d.ts +2 -0
  39. package/dist/commands/validate.js +13 -0
  40. package/dist/commands/validate.js.map +1 -0
  41. package/dist/commands/workflow.js +35 -5
  42. package/dist/commands/workflow.js.map +1 -1
  43. package/dist/core/agent-docs-hygiene.d.ts +3 -0
  44. package/dist/core/agent-docs-hygiene.js +83 -0
  45. package/dist/core/agent-docs-hygiene.js.map +1 -0
  46. package/dist/core/agent-exporter.d.ts +3 -1
  47. package/dist/core/agent-exporter.js +136 -12
  48. package/dist/core/agent-exporter.js.map +1 -1
  49. package/dist/core/agent-profile.d.ts +1 -1
  50. package/dist/core/agent-registry.js +60 -0
  51. package/dist/core/agent-registry.js.map +1 -1
  52. package/dist/core/agent-runtime.d.ts +57 -0
  53. package/dist/core/agent-runtime.js +371 -0
  54. package/dist/core/agent-runtime.js.map +1 -0
  55. package/dist/core/config.d.ts +20 -0
  56. package/dist/core/config.js +39 -2
  57. package/dist/core/config.js.map +1 -1
  58. package/dist/core/context-intelligence.d.ts +47 -0
  59. package/dist/core/context-intelligence.js +283 -0
  60. package/dist/core/context-intelligence.js.map +1 -0
  61. package/dist/core/diagram-rail.d.ts +31 -0
  62. package/dist/core/diagram-rail.js +235 -0
  63. package/dist/core/diagram-rail.js.map +1 -0
  64. package/dist/core/diagram-validator.d.ts +10 -0
  65. package/dist/core/diagram-validator.js +53 -0
  66. package/dist/core/diagram-validator.js.map +1 -0
  67. package/dist/core/evaluation-suite.d.ts +28 -0
  68. package/dist/core/evaluation-suite.js +333 -0
  69. package/dist/core/evaluation-suite.js.map +1 -0
  70. package/dist/core/evidence-pack.d.ts +4 -0
  71. package/dist/core/evidence-pack.js +139 -0
  72. package/dist/core/evidence-pack.js.map +1 -0
  73. package/dist/core/format-compare.d.ts +12 -0
  74. package/dist/core/format-compare.js +68 -0
  75. package/dist/core/format-compare.js.map +1 -0
  76. package/dist/core/fs-evidence.d.ts +25 -0
  77. package/dist/core/fs-evidence.js +96 -0
  78. package/dist/core/fs-evidence.js.map +1 -0
  79. package/dist/core/harness-rail.d.ts +34 -0
  80. package/dist/core/harness-rail.js +158 -0
  81. package/dist/core/harness-rail.js.map +1 -0
  82. package/dist/core/json-validator.d.ts +24 -0
  83. package/dist/core/json-validator.js +138 -0
  84. package/dist/core/json-validator.js.map +1 -0
  85. package/dist/core/mcp-exposure.d.ts +20 -0
  86. package/dist/core/mcp-exposure.js +48 -0
  87. package/dist/core/mcp-exposure.js.map +1 -0
  88. package/dist/core/memory-rail.d.ts +37 -0
  89. package/dist/core/memory-rail.js +142 -0
  90. package/dist/core/memory-rail.js.map +1 -0
  91. package/dist/core/policy-rail.d.ts +27 -0
  92. package/dist/core/policy-rail.js +102 -0
  93. package/dist/core/policy-rail.js.map +1 -0
  94. package/dist/core/rail-utils.d.ts +10 -0
  95. package/dist/core/rail-utils.js +58 -0
  96. package/dist/core/rail-utils.js.map +1 -0
  97. package/dist/core/release-preflight.js +1 -1
  98. package/dist/core/release-preflight.js.map +1 -1
  99. package/dist/core/run-workspace.d.ts +38 -0
  100. package/dist/core/run-workspace.js +108 -0
  101. package/dist/core/run-workspace.js.map +1 -0
  102. package/dist/core/skill-routing.d.ts +2 -0
  103. package/dist/core/skill-routing.js +51 -0
  104. package/dist/core/skill-routing.js.map +1 -0
  105. package/dist/core/version.d.ts +1 -1
  106. package/dist/core/version.js +1 -1
  107. package/dist/core/workflow-store.d.ts +68 -0
  108. package/dist/core/workflow-store.js +360 -6
  109. package/dist/core/workflow-store.js.map +1 -1
  110. package/docs/agent-docs-hygiene.md +175 -0
  111. package/docs/agents.md +190 -2
  112. package/docs/benchmarking.md +213 -2
  113. package/docs/comparisons.md +195 -11
  114. package/docs/context-intelligence.md +127 -0
  115. package/docs/context-packs.md +237 -1
  116. package/docs/deep-agents-patterns.md +188 -0
  117. package/docs/diagram-rail.md +125 -0
  118. package/docs/ecosystem-influences.md +435 -0
  119. package/docs/evaluation-suite.md +196 -0
  120. package/docs/filesystem-evidence-rail.md +119 -0
  121. package/docs/future-rails-index.md +209 -0
  122. package/docs/harness-rail.md +117 -0
  123. package/docs/licensing-strategy.md +135 -0
  124. package/docs/mcp.md +96 -0
  125. package/docs/memory-rail.md +189 -0
  126. package/docs/metrics.md +136 -1
  127. package/docs/migration-v0.5.md +89 -0
  128. package/docs/policy-rail.md +184 -0
  129. package/docs/release-checklist.md +14 -0
  130. package/docs/release-workflow.md +34 -1
  131. package/docs/releases/README.md +27 -0
  132. package/docs/releases/RELEASE_NOTES_v0.2.1.md +19 -0
  133. package/docs/releases/RELEASE_NOTES_v0.2.2.md +48 -0
  134. package/docs/releases/RELEASE_NOTES_v0.2.3.md +36 -0
  135. package/docs/releases/RELEASE_NOTES_v0.3.0.md +42 -0
  136. package/docs/releases/RELEASE_NOTES_v0.3.1.md +37 -0
  137. package/docs/releases/RELEASE_NOTES_v0.3.2.md +33 -0
  138. package/docs/releases/RELEASE_NOTES_v0.3.3.md +31 -0
  139. package/docs/releases/RELEASE_NOTES_v0.4.0.md +35 -0
  140. package/docs/releases/RELEASE_NOTES_v0.4.1.md +37 -0
  141. package/docs/releases/RELEASE_NOTES_v0.5.0.md +21 -0
  142. package/docs/releases/RELEASE_NOTES_v0.5.1.md +19 -0
  143. package/docs/releases/RELEASE_NOTES_v0.5.2.md +27 -0
  144. package/docs/releases/RELEASE_NOTES_v0.6.0.md +33 -0
  145. package/docs/releases/RELEASE_NOTES_v0.6.1.md +37 -0
  146. package/docs/releases/RELEASE_NOTES_v0.7.0.md +33 -0
  147. package/docs/roadmap-agent-runtime-addendum.md +304 -0
  148. package/docs/roadmap-harness-diagram-payload-addendum.md +300 -0
  149. package/docs/rules.md +56 -0
  150. package/docs/security-model.md +56 -0
  151. package/docs/skill-rail.md +57 -0
  152. package/docs/spec-driven-workflow.md +49 -9
  153. package/docs/structured-payload-rail.md +251 -0
  154. package/docs/tutorial-antigravity.md +20 -0
  155. package/docs/tutorial-claude-code.md +23 -0
  156. package/docs/tutorial-codex.md +22 -0
  157. package/docs/tutorial-context-formats.md +28 -0
  158. package/docs/tutorial-cursor.md +23 -0
  159. package/docs/tutorial-deep-agents-role-packs.md +24 -0
  160. package/docs/tutorial-diagram-spec.md +26 -0
  161. package/docs/tutorial-gemini-cli.md +21 -0
  162. package/docs/tutorial-harness-workflow.md +25 -0
  163. package/docs/workflow-rail.md +98 -14
  164. package/examples/agents/README.md +13 -0
  165. package/package.json +2 -2
@@ -0,0 +1,283 @@
1
+ import { promises as fs } from "node:fs";
2
+ import path from "node:path";
3
+ import { ensureWorkspace, getWorkspacePaths, loadConfig, readJsonl, relativeToRoot, writeJson } from "./config.js";
4
+ import { scanRepository } from "./file-scanner.js";
5
+ import { RawStore } from "./raw-store.js";
6
+ import { keywordScore, makeRailId, redactProbableSecrets, summarizeText } from "./rail-utils.js";
7
+ import { estimateTokens, tokenEstimateNote } from "./token-estimator.js";
8
+ const roleDefinitions = {
9
+ planner: {
10
+ purpose: "Plan work from roadmap, specs, constraints, previous decisions and workflow state.",
11
+ include: ["README.md", "ROADMAP.md", "docs/", ".soturail/memory/consolidated.jsonl", ".soturail/workflows/"],
12
+ omit: ["raw logs", "large generated artifacts", "secret-like files"]
13
+ },
14
+ executor: {
15
+ purpose: "Execute a local task with target files, repo map, failing tests and safe commands.",
16
+ include: [".soturail/indexes/tree.txt", "target files", "tests/", ".soturail/context/selections/"],
17
+ omit: ["unrelated long docs", "raw logs unless explicitly restored"]
18
+ },
19
+ reviewer: {
20
+ purpose: "Review diffs, tests, rules, acceptance criteria and security notes.",
21
+ include: ["git diff", "tests/", ".soturail/rules/", ".soturail/harness/failures.jsonl"],
22
+ omit: ["unchanged dependency trees", "local secrets"]
23
+ },
24
+ "release-manager": {
25
+ purpose: "Prepare release evidence from version, changelog, release notes, package verification and registry state.",
26
+ include: ["package.json", "CHANGELOG.md", "docs/releases/RELEASE_NOTES_*.md", "docs/release-workflow.md"],
27
+ omit: ["npm tokens", "browser auth secrets", "raw package caches"]
28
+ },
29
+ researcher: {
30
+ purpose: "Collect local docs, ecosystem notes, comparison constraints and citation reminders.",
31
+ include: ["docs/", "examples/", "README.md", "ROADMAP.md"],
32
+ omit: ["uncited claims", "provider secrets", "raw logs"]
33
+ }
34
+ };
35
+ export async function selectContext(query, limit = 10, root = process.cwd()) {
36
+ await ensureWorkspace(root);
37
+ const paths = getWorkspacePaths(root);
38
+ const config = await loadConfig(root);
39
+ const repo = await scanRepository(root, config);
40
+ const route = routeContext(query);
41
+ const fileItems = await rankFiles(repo.files, query, root);
42
+ const memoryItems = (await readJsonl(paths.memoryRecordsFile)).map((record) => {
43
+ const score = keywordScore(query, `${record.text} ${record.tags.join(" ")}`);
44
+ return {
45
+ kind: "memory",
46
+ id: record.id,
47
+ score: score.score,
48
+ reason: score.reason,
49
+ summary: record.text,
50
+ estimatedTokens: estimateTokens(record.text)
51
+ };
52
+ });
53
+ const selection = {
54
+ schemaVersion: "soturail.context.selection.v1",
55
+ id: makeRailId("ctx", query),
56
+ createdAt: new Date().toISOString(),
57
+ query,
58
+ limit,
59
+ expert: route.expert,
60
+ role: route.role,
61
+ items: [...fileItems, ...memoryItems]
62
+ .filter((item) => item.score > 0)
63
+ .sort((left, right) => right.score - left.score)
64
+ .slice(0, limit)
65
+ };
66
+ await writeJson(path.join(paths.contextSelectionsDir, `${selection.id}.json`), selection);
67
+ return selection;
68
+ }
69
+ export function renderSelection(selection) {
70
+ const lines = [
71
+ "SotuRail context select",
72
+ `query: ${selection.query}`,
73
+ `selection_id: ${selection.id}`,
74
+ `expert: ${selection.expert}`,
75
+ `role: ${selection.role}`,
76
+ `items_count: ${selection.items.length}`,
77
+ ""
78
+ ];
79
+ for (const item of selection.items) {
80
+ const source = item.path ?? item.id ?? "unknown";
81
+ lines.push(`- ${item.kind}: ${source}`, ` Score: ${item.score}`, ` Reason: ${item.reason}`, ` Estimated tokens: ${item.estimatedTokens}`, ` Summary: ${item.summary}`, ` Recovery: ${item.kind === "file" ? `open ${source}` : `soturail memory recall "${selection.query}"`}`, "");
82
+ }
83
+ return `${lines.join("\n").trimEnd()}\n`;
84
+ }
85
+ export async function pruneContext(query, budget = 8000, root = process.cwd()) {
86
+ const selection = await selectContext(query, 20, root);
87
+ let used = 0;
88
+ const included = [];
89
+ const omitted = [];
90
+ for (const item of selection.items) {
91
+ if (used + item.estimatedTokens <= budget) {
92
+ included.push(item);
93
+ used += item.estimatedTokens;
94
+ }
95
+ else {
96
+ omitted.push(item);
97
+ }
98
+ }
99
+ const lines = [
100
+ "SotuRail context prune",
101
+ `query: ${query}`,
102
+ `budget_tokens: ${budget}`,
103
+ `estimated_tokens_used: ${used}`,
104
+ `selection_id: ${selection.id}`,
105
+ "",
106
+ "Included context:"
107
+ ];
108
+ for (const item of included) {
109
+ lines.push(`- ${item.kind}: ${item.path ?? item.id} (${item.estimatedTokens} tokens)`, ` Reason: ${item.reason}`, ` Summary: ${item.summary}`, ` Recovery: ${item.kind === "file" ? `open ${item.path}` : `soturail memory recall "${query}"`}`);
110
+ }
111
+ lines.push("", "Omitted context:");
112
+ for (const item of omitted) {
113
+ lines.push(`- ${item.kind}: ${item.path ?? item.id} (${item.estimatedTokens} tokens)`, " Recovery: rerun with a larger --budget or use context restore/offload pointers.");
114
+ }
115
+ lines.push("", "Recovery pointers:", `- Full selection: .soturail/context/selections/${selection.id}.json`, "- Long content: soturail context offload <raw-id-or-file>", "- Restore offload: soturail context restore <offload-id>");
116
+ return `${lines.join("\n")}\n`;
117
+ }
118
+ export async function offloadContext(input, root = process.cwd()) {
119
+ await ensureWorkspace(root);
120
+ const paths = getWorkspacePaths(root);
121
+ let source = input;
122
+ let content = null;
123
+ const filePath = path.resolve(root, input);
124
+ try {
125
+ content = await fs.readFile(filePath);
126
+ source = relativeToRoot(root, filePath);
127
+ }
128
+ catch {
129
+ content = await new RawStore(root).readRaw(input);
130
+ if (!content)
131
+ throw new Error(`Could not find local file or raw_id: ${input}`);
132
+ source = `raw_id:${input}`;
133
+ }
134
+ const text = redactProbableSecrets(content.toString("utf8"));
135
+ const id = makeRailId("offload", source);
136
+ const contentPath = path.join(paths.contextOffloadDir, `${id}.txt`);
137
+ await fs.writeFile(contentPath, text, "utf8");
138
+ const record = {
139
+ schemaVersion: "soturail.context.offload.v1",
140
+ id,
141
+ createdAt: new Date().toISOString(),
142
+ source,
143
+ path: contentPath,
144
+ summary: summarizeText(text, 600),
145
+ bytes: Buffer.byteLength(text, "utf8"),
146
+ estimatedTokens: estimateTokens(text)
147
+ };
148
+ await writeJson(path.join(paths.contextOffloadDir, `${id}.json`), { ...record, path: relativeToRoot(root, contentPath) });
149
+ return record;
150
+ }
151
+ export async function restoreOffload(id, root = process.cwd()) {
152
+ const contentPath = path.join(getWorkspacePaths(root).contextOffloadDir, `${id}.txt`);
153
+ return fs.readFile(contentPath, "utf8").catch((error) => {
154
+ if (error.code === "ENOENT")
155
+ throw new Error(`Offload not found: ${id}`);
156
+ throw error;
157
+ });
158
+ }
159
+ export async function contextBudget(target = "generic", explain = false, root = process.cwd()) {
160
+ await ensureWorkspace(root);
161
+ const paths = getWorkspacePaths(root);
162
+ const drivers = [
163
+ await driver("root_agent_docs", root, ["CLAUDE.md", "AGENTS.md", "GEMINI.md"]),
164
+ await driver("role_packs", root, [relativeToRoot(root, paths.contextRolePacksDir)]),
165
+ await driver("memory", root, [relativeToRoot(root, paths.memoryRecordsFile), relativeToRoot(root, paths.memoryConsolidatedFile)]),
166
+ await driver("skills", root, [relativeToRoot(root, paths.skillsDir)]),
167
+ await driver("mcp_exposure", root, [relativeToRoot(root, paths.mcpExportsDir)]),
168
+ await driver("raw_logs", root, [relativeToRoot(root, paths.rawIndex)]),
169
+ await driver("offloaded_logs", root, [relativeToRoot(root, paths.contextOffloadDir)]),
170
+ await driver("context_packs", root, [relativeToRoot(root, paths.contextDir)]),
171
+ await driver("run_workspace_evidence", root, [relativeToRoot(root, paths.runsDir), relativeToRoot(root, paths.reportsDir)])
172
+ ];
173
+ const total = drivers.reduce((sum, item) => sum + item.estimatedTokens, 0);
174
+ const lines = [
175
+ "SotuRail context budget",
176
+ `target: ${target}`,
177
+ `estimated_total_tokens: ${total}`,
178
+ tokenEstimateNote(),
179
+ "",
180
+ "Drivers:",
181
+ ...drivers.map((item) => `- ${item.name}: ${item.estimatedTokens} tokens (${item.paths.join(", ") || "none"})`)
182
+ ];
183
+ if (explain) {
184
+ lines.push("", "Recommendations:", "- Keep root agent docs short and reference richer docs.", "- Use `soturail context pack --role <role>` for scoped planner/executor/reviewer/release-manager/researcher handoffs.", "- Use `soturail context prune` for task handoff.", "- Use `soturail context offload` for long logs and generated artifacts.", "- Keep run workspace evidence local unless a specific artifact is selected.");
185
+ }
186
+ return `${lines.join("\n")}\n`;
187
+ }
188
+ export function routeContext(query) {
189
+ const lower = query.toLowerCase();
190
+ const candidates = [
191
+ ["security", "reviewer", /(secret|token|auth|vulnerab|audit|policy|permission|risk)/, "security and policy keyword"],
192
+ ["release", "release-manager", /(release|publish|npm|version|changelog|tag|github release|pack)/, "release keyword"],
193
+ ["code", "executor", /(bug|fix|test|build|typescript|code|source|file|function|class|error)/, "code keyword"],
194
+ ["research", "researcher", /(research|compare|ecosystem|citation)/, "research keyword"],
195
+ ["docs", "researcher", /(doc|readme|guide|example|copy|wording|tutorial)/, "documentation keyword"],
196
+ ["workflow", "planner", /(workflow|task|plan|worktree|verify|handoff|run workspace)/, "workflow keyword"],
197
+ ["memory", "planner", /(memory|remember|recall|decision|fact)/, "memory keyword"]
198
+ ];
199
+ const match = candidates.find(([, , pattern]) => pattern.test(lower));
200
+ return match ? { expert: match[0], role: match[1], reason: match[3] } : { expert: "code", role: "executor", reason: "default local code routing" };
201
+ }
202
+ export async function buildRolePack(role, root = process.cwd()) {
203
+ await ensureWorkspace(root);
204
+ const definition = roleDefinitions[role];
205
+ if (!definition)
206
+ throw new Error(`Unknown role "${role}".`);
207
+ const content = [
208
+ `# SotuRail Role Pack: ${role}`,
209
+ "",
210
+ "schemaVersion: soturail.context.role-pack.v1",
211
+ `createdAt: ${new Date().toISOString()}`,
212
+ "",
213
+ "## Purpose",
214
+ definition.purpose,
215
+ "",
216
+ "## Included Sources",
217
+ ...definition.include.map((item) => `- ${item}`),
218
+ "",
219
+ "## Omitted Sources",
220
+ ...definition.omit.map((item) => `- ${item}`),
221
+ "",
222
+ "## Estimated Tokens",
223
+ `${estimateTokens(definition.purpose + definition.include.join(" ") + definition.omit.join(" "))}`,
224
+ "",
225
+ "## Recovery Pointers",
226
+ "- Regenerate target context packs with `soturail context pack --target all`.",
227
+ "- Restore offloaded content with `soturail context restore <offload-id>`.",
228
+ "- Recover raw command output with `soturail expand <raw_id>`.",
229
+ "",
230
+ "## Safety Notes",
231
+ "- Raw logs and secret-like files are not included by default.",
232
+ "- Use policy approval for publish, global config writes, destructive commands or raw expansion.",
233
+ ""
234
+ ].join("\n");
235
+ const output = path.join(getWorkspacePaths(root).contextRolePacksDir, `${role}.md`);
236
+ await fs.writeFile(output, content, "utf8");
237
+ return { path: output, content };
238
+ }
239
+ export function parseRolePack(value) {
240
+ if (Object.prototype.hasOwnProperty.call(roleDefinitions, value))
241
+ return value;
242
+ throw new Error(`Unknown role "${value}". Supported roles: ${Object.keys(roleDefinitions).join(", ")}.`);
243
+ }
244
+ async function rankFiles(files, query, root) {
245
+ const items = [];
246
+ for (const file of files) {
247
+ const score = keywordScore(query, `${file.path} ${file.language} ${file.symbols.map((symbol) => symbol.name).join(" ")}`);
248
+ if (score.score <= 0)
249
+ continue;
250
+ const preview = await fs
251
+ .readFile(path.resolve(root, file.path), "utf8")
252
+ .then((raw) => summarizeText(redactProbableSecrets(raw), 300))
253
+ .catch(() => `${file.language}, ${file.size_bytes} bytes`);
254
+ items.push({
255
+ kind: "file",
256
+ path: file.path,
257
+ score: score.score,
258
+ reason: score.reason,
259
+ summary: preview,
260
+ estimatedTokens: estimateTokens(preview)
261
+ });
262
+ }
263
+ return items;
264
+ }
265
+ async function driver(name, root, inputs) {
266
+ let estimatedTokens = 0;
267
+ const present = [];
268
+ for (const input of inputs) {
269
+ const absolute = path.resolve(root, input);
270
+ const stat = await fs.stat(absolute).catch(() => null);
271
+ if (!stat)
272
+ continue;
273
+ present.push(input);
274
+ if (stat.isDirectory()) {
275
+ estimatedTokens += (await fs.readdir(absolute).catch(() => [])).length * 40;
276
+ }
277
+ else {
278
+ estimatedTokens += estimateTokens(await fs.readFile(absolute, "utf8").catch(() => ""));
279
+ }
280
+ }
281
+ return { name, paths: present, estimatedTokens };
282
+ }
283
+ //# sourceMappingURL=context-intelligence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-intelligence.js","sourceRoot":"","sources":["../../src/core/context-intelligence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { type DiagramValidationReport } from "./diagram-validator.js";
2
+ export interface DiagramAuditReport {
3
+ schemaVersion: "soturail.diagram.audit.v1";
4
+ file: string;
5
+ exists: boolean;
6
+ containsMermaid: boolean;
7
+ fenceOk: boolean;
8
+ hasSpec: boolean;
9
+ workflowStateReferenced: boolean;
10
+ validation: DiagramValidationReport;
11
+ }
12
+ export declare function initDiagramRail(root?: string): Promise<string>;
13
+ export declare function createDiagram(feature: string, root?: string): Promise<{
14
+ diagramPath: string;
15
+ specPath: string;
16
+ output: string;
17
+ }>;
18
+ export declare function auditDiagram(file: string, root?: string): Promise<{
19
+ report: DiagramAuditReport;
20
+ output: string;
21
+ }>;
22
+ export declare function validateDiagrams(root?: string): Promise<{
23
+ reports: DiagramAuditReport[];
24
+ path: string;
25
+ output: string;
26
+ }>;
27
+ export declare function diagramFromWorkflow(id: string, root?: string): Promise<{
28
+ diagramPath: string;
29
+ specPath: string;
30
+ output: string;
31
+ }>;
@@ -0,0 +1,235 @@
1
+ import { promises as fs } from "node:fs";
2
+ import path from "node:path";
3
+ import { ensureWorkspace, getWorkspacePaths, relativeToRoot, writeJson } from "./config.js";
4
+ import { validateMermaidDiagram } from "./diagram-validator.js";
5
+ import { readWorkflow } from "./workflow-store.js";
6
+ export async function initDiagramRail(root = process.cwd()) {
7
+ await ensureWorkspace(root);
8
+ const paths = getWorkspacePaths(root);
9
+ const docsDir = path.join(root, "docs", "diagrams");
10
+ await fs.mkdir(paths.diagramsDir, { recursive: true });
11
+ await fs.mkdir(docsDir, { recursive: true });
12
+ if (!(await exists(paths.diagramsIndexFile))) {
13
+ await writeJson(paths.diagramsIndexFile, { schemaVersion: "soturail.diagram.index.v1", diagrams: [] });
14
+ }
15
+ await writeFileIfMissing(path.join(docsDir, "README.md"), [
16
+ "# Diagrams",
17
+ "",
18
+ "SotuRail Diagram Rail stores text-based Mermaid diagrams and `.spec.md` visual contracts here.",
19
+ ""
20
+ ].join("\n"));
21
+ return [
22
+ "SotuRail diagram init",
23
+ `diagrams_dir: ${relativeToRoot(root, paths.diagramsDir)}`,
24
+ `docs_diagrams_dir: ${relativeToRoot(root, docsDir)}`,
25
+ `index: ${relativeToRoot(root, paths.diagramsIndexFile)}`,
26
+ "next_commands:",
27
+ "- soturail diagram new <feature>",
28
+ "- soturail diagram validate"
29
+ ].join("\n") + "\n";
30
+ }
31
+ export async function createDiagram(feature, root = process.cwd()) {
32
+ await initDiagramRail(root);
33
+ const slug = slugify(feature);
34
+ const title = titleCase(feature);
35
+ const docsDir = path.join(root, "docs", "diagrams");
36
+ const diagramPath = path.join(docsDir, `${slug}.md`);
37
+ const specPath = path.join(docsDir, `${slug}.spec.md`);
38
+ await writeFileIfMissing(diagramPath, diagramTemplate(title));
39
+ await writeFileIfMissing(specPath, specTemplate(title, diagramPath, root));
40
+ await refreshDiagramIndex(root);
41
+ return {
42
+ diagramPath,
43
+ specPath,
44
+ output: [
45
+ "SotuRail diagram new",
46
+ `feature: ${title}`,
47
+ `diagram: ${relativeToRoot(root, diagramPath)}`,
48
+ `spec: ${relativeToRoot(root, specPath)}`
49
+ ].join("\n") + "\n"
50
+ };
51
+ }
52
+ export async function auditDiagram(file, root = process.cwd()) {
53
+ const filePath = path.resolve(root, file);
54
+ const existsFile = await exists(filePath);
55
+ const raw = existsFile ? await fs.readFile(filePath, "utf8") : "";
56
+ const specPath = matchingSpecPath(filePath);
57
+ const report = {
58
+ schemaVersion: "soturail.diagram.audit.v1",
59
+ file: relativeToRoot(root, filePath),
60
+ exists: existsFile,
61
+ containsMermaid: /```mermaid/i.test(raw),
62
+ fenceOk: countMatches(raw, /```/g) % 2 === 0,
63
+ hasSpec: await exists(specPath),
64
+ workflowStateReferenced: /\b(draft|planned|active|verifying|ready_for_review|closed|blocked)\b/i.test(raw),
65
+ validation: validateMermaidDiagram(raw)
66
+ };
67
+ return { report, output: renderAudit(report) };
68
+ }
69
+ export async function validateDiagrams(root = process.cwd()) {
70
+ await initDiagramRail(root);
71
+ const docsDir = path.join(root, "docs", "diagrams");
72
+ const entries = await listMarkdownFiles(docsDir);
73
+ const reports = [];
74
+ for (const entry of entries.filter((file) => !file.endsWith(".spec.md") && path.basename(file) !== "README.md")) {
75
+ reports.push((await auditDiagram(entry, root)).report);
76
+ }
77
+ const outputPath = path.join(getWorkspacePaths(root).diagramsDir, "validation.json");
78
+ await writeJson(outputPath, { schemaVersion: "soturail.diagram.validation-run.v1", reports });
79
+ return {
80
+ reports,
81
+ path: outputPath,
82
+ output: [
83
+ "SotuRail diagram validate",
84
+ `diagrams_count: ${reports.length}`,
85
+ `valid_count: ${reports.filter((report) => report.validation.valid && report.fenceOk && report.containsMermaid).length}`,
86
+ `report: ${relativeToRoot(root, outputPath)}`,
87
+ "",
88
+ ...reports.map((report) => `- ${report.file}: ${report.validation.valid && report.fenceOk && report.containsMermaid ? "valid" : "warn"}`)
89
+ ].join("\n") + "\n"
90
+ };
91
+ }
92
+ export async function diagramFromWorkflow(id, root = process.cwd()) {
93
+ await initDiagramRail(root);
94
+ const workflow = await readWorkflow(id, root);
95
+ const slug = slugify(workflow.id);
96
+ const title = `Workflow ${workflow.title}`;
97
+ const docsDir = path.join(root, "docs", "diagrams");
98
+ const diagramPath = path.join(docsDir, `${slug}.md`);
99
+ const specPath = path.join(docsDir, `${slug}.spec.md`);
100
+ const diagram = [
101
+ `# ${title}`,
102
+ "",
103
+ "```mermaid",
104
+ "stateDiagram-v2",
105
+ " [*] --> draft",
106
+ " draft --> planned",
107
+ " planned --> active",
108
+ " active --> verifying",
109
+ " verifying --> ready_for_review",
110
+ " ready_for_review --> closed",
111
+ " verifying --> blocked",
112
+ ` ${workflow.state} --> ${workflow.state}`,
113
+ "```",
114
+ "",
115
+ `workflow_id: ${workflow.id}`,
116
+ `current_state: ${workflow.state}`,
117
+ ""
118
+ ].join("\n");
119
+ await fs.writeFile(diagramPath, diagram, "utf8");
120
+ await writeFileIfMissing(specPath, specTemplate(title, diagramPath, root));
121
+ await refreshDiagramIndex(root);
122
+ return {
123
+ diagramPath,
124
+ specPath,
125
+ output: [
126
+ "SotuRail diagram from-workflow",
127
+ `workflow_id: ${workflow.id}`,
128
+ `diagram: ${relativeToRoot(root, diagramPath)}`,
129
+ `spec: ${relativeToRoot(root, specPath)}`
130
+ ].join("\n") + "\n"
131
+ };
132
+ }
133
+ function renderAudit(report) {
134
+ return [
135
+ "SotuRail diagram audit",
136
+ `file: ${report.file}`,
137
+ `exists: ${report.exists}`,
138
+ `contains_mermaid: ${report.containsMermaid}`,
139
+ `fence_ok: ${report.fenceOk}`,
140
+ `matching_spec: ${report.hasSpec}`,
141
+ `workflow_state_referenced: ${report.workflowStateReferenced}`,
142
+ `valid: ${report.validation.valid}`,
143
+ "",
144
+ ...(report.validation.findings.length > 0 ? report.validation.findings.map((finding) => `- ${finding.severity}: ${finding.message}`) : ["No validation findings."])
145
+ ].join("\n") + "\n";
146
+ }
147
+ async function refreshDiagramIndex(root) {
148
+ const docsDir = path.join(root, "docs", "diagrams");
149
+ const diagrams = (await listMarkdownFiles(docsDir)).filter((file) => !file.endsWith(".spec.md"));
150
+ await writeJson(getWorkspacePaths(root).diagramsIndexFile, { schemaVersion: "soturail.diagram.index.v1", diagrams });
151
+ }
152
+ async function listMarkdownFiles(dir) {
153
+ const entries = await fs.readdir(dir, { withFileTypes: true }).catch(() => []);
154
+ return entries
155
+ .filter((entry) => entry.isFile() && entry.name.endsWith(".md"))
156
+ .map((entry) => path.join(dir, entry.name))
157
+ .sort((left, right) => left.localeCompare(right));
158
+ }
159
+ function diagramTemplate(title) {
160
+ return [
161
+ `# Diagram: ${title}`,
162
+ "",
163
+ "```mermaid",
164
+ "stateDiagram-v2",
165
+ " [*] --> Draft",
166
+ " Draft --> Planned",
167
+ " Planned --> Active",
168
+ " Active --> Verifying",
169
+ " Verifying --> ReadyForReview",
170
+ " ReadyForReview --> Closed",
171
+ " Verifying --> Blocked",
172
+ "```",
173
+ ""
174
+ ].join("\n");
175
+ }
176
+ function specTemplate(title, diagramPath, root) {
177
+ return [
178
+ `# Visual Contract: ${title}`,
179
+ "",
180
+ "## Required nodes",
181
+ "",
182
+ "- Draft",
183
+ "- Planned",
184
+ "- Active",
185
+ "- Verifying",
186
+ "- ReadyForReview",
187
+ "- Closed",
188
+ "- Blocked",
189
+ "",
190
+ "## Required transitions",
191
+ "",
192
+ "- Draft -> Planned",
193
+ "- Planned -> Active",
194
+ "- Active -> Verifying",
195
+ "- Verifying -> ReadyForReview",
196
+ "- ReadyForReview -> Closed",
197
+ "",
198
+ "## Evidence links",
199
+ "",
200
+ `- Diagram: ${relativeToRoot(root, diagramPath)}`,
201
+ "- Workflow evidence: run `soturail workflow evidence <id>` when available.",
202
+ "",
203
+ "## Validation checklist",
204
+ "",
205
+ "- [ ] Mermaid block is present.",
206
+ "- [ ] Verification transition is present.",
207
+ "- [ ] Tests and evidence are linked before release.",
208
+ "",
209
+ "## Known gaps",
210
+ "",
211
+ "- Add feature-specific states and acceptance evidence.",
212
+ ""
213
+ ].join("\n");
214
+ }
215
+ function matchingSpecPath(filePath) {
216
+ return filePath.endsWith(".spec.md") ? filePath : filePath.replace(/\.md$/i, ".spec.md");
217
+ }
218
+ function countMatches(value, pattern) {
219
+ return [...value.matchAll(pattern)].length;
220
+ }
221
+ async function writeFileIfMissing(filePath, content) {
222
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
223
+ if (!(await exists(filePath)))
224
+ await fs.writeFile(filePath, content, "utf8");
225
+ }
226
+ async function exists(filePath) {
227
+ return fs.access(filePath).then(() => true).catch(() => false);
228
+ }
229
+ function slugify(input) {
230
+ return input.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 64) || "diagram";
231
+ }
232
+ function titleCase(input) {
233
+ return input.trim().replace(/\s+/g, " ").replace(/\b\w/g, (match) => match.toUpperCase()) || "Diagram";
234
+ }
235
+ //# sourceMappingURL=diagram-rail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagram-rail.js","sourceRoot":"","sources":["../../src/core/diagram-rail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface DiagramValidationFinding {
2
+ severity: "error" | "warning";
3
+ message: string;
4
+ }
5
+ export interface DiagramValidationReport {
6
+ schemaVersion: "soturail.diagram.validation.v1";
7
+ valid: boolean;
8
+ findings: DiagramValidationFinding[];
9
+ }
10
+ export declare function validateMermaidDiagram(input: string): DiagramValidationReport;
@@ -0,0 +1,53 @@
1
+ export function validateMermaidDiagram(input) {
2
+ const findings = [];
3
+ const text = extractMermaid(input);
4
+ if (!text.trim()) {
5
+ findings.push({ severity: "error", message: "No Mermaid content found." });
6
+ return { schemaVersion: "soturail.diagram.validation.v1", valid: false, findings };
7
+ }
8
+ if (!/^\s*(stateDiagram-v2|flowchart\s+(TD|LR|BT|RL)|graph\s+(TD|LR|BT|RL))/m.test(text)) {
9
+ findings.push({ severity: "error", message: "Diagram must start with a supported Mermaid stateDiagram, flowchart, or graph declaration." });
10
+ }
11
+ if (/stateDiagram-v2/.test(text)) {
12
+ if (!/\[\*\]\s*-->/.test(text))
13
+ findings.push({ severity: "warning", message: "State diagram is missing an initial transition." });
14
+ if (!/-->\s*Verifying|Verifying\s*-->/.test(text))
15
+ findings.push({ severity: "warning", message: "State diagram is missing a verification transition." });
16
+ const states = collectStateNames(text);
17
+ const targets = collectTargetStateNames(text);
18
+ for (const state of states) {
19
+ if (!targets.has(state) && !/Draft|Start|\[\*\]/i.test(state)) {
20
+ findings.push({ severity: "warning", message: `State may be unreachable: ${state}` });
21
+ }
22
+ }
23
+ }
24
+ if (/flowchart|graph/.test(text) && /Publish|Release|NpmPublish|GitHubRelease/i.test(text) && !/Test|Audit|Pack|Verify/i.test(text)) {
25
+ findings.push({ severity: "warning", message: "Release diagram should include test/audit/pack verification before publish/release." });
26
+ }
27
+ return {
28
+ schemaVersion: "soturail.diagram.validation.v1",
29
+ valid: findings.every((finding) => finding.severity !== "error"),
30
+ findings
31
+ };
32
+ }
33
+ function extractMermaid(input) {
34
+ const match = input.match(/```mermaid\s*([\s\S]*?)```/i);
35
+ return match?.[1] ?? input;
36
+ }
37
+ function collectStateNames(text) {
38
+ const states = new Set();
39
+ for (const match of text.matchAll(/^\s*([A-Za-z][\w-]*)\s*-->/gm)) {
40
+ if (match[1])
41
+ states.add(match[1]);
42
+ }
43
+ return states;
44
+ }
45
+ function collectTargetStateNames(text) {
46
+ const states = new Set();
47
+ for (const match of text.matchAll(/-->\s*([A-Za-z][\w-]*)/g)) {
48
+ if (match[1])
49
+ states.add(match[1]);
50
+ }
51
+ return states;
52
+ }
53
+ //# sourceMappingURL=diagram-validator.js.map