soturail 1.0.1 → 1.2.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 (110) hide show
  1. package/README.md +60 -13
  2. package/dist/cli.js +6 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/agents.js +37 -7
  5. package/dist/commands/agents.js.map +1 -1
  6. package/dist/commands/feature.d.ts +2 -0
  7. package/dist/commands/feature.js +28 -0
  8. package/dist/commands/feature.js.map +1 -0
  9. package/dist/commands/handoff.d.ts +2 -0
  10. package/dist/commands/handoff.js +14 -0
  11. package/dist/commands/handoff.js.map +1 -0
  12. package/dist/commands/harness.js +20 -0
  13. package/dist/commands/harness.js.map +1 -1
  14. package/dist/commands/mcp.js +10 -1
  15. package/dist/commands/mcp.js.map +1 -1
  16. package/dist/commands/report.js +14 -3
  17. package/dist/commands/report.js.map +1 -1
  18. package/dist/commands/session.d.ts +2 -0
  19. package/dist/commands/session.js +17 -0
  20. package/dist/commands/session.js.map +1 -0
  21. package/dist/core/agent-exporter.d.ts +39 -2
  22. package/dist/core/agent-exporter.js +290 -24
  23. package/dist/core/agent-exporter.js.map +1 -1
  24. package/dist/core/agent-profile.d.ts +1 -1
  25. package/dist/core/agent-registry.js +12 -0
  26. package/dist/core/agent-registry.js.map +1 -1
  27. package/dist/core/agent-runtime.d.ts +15 -1
  28. package/dist/core/agent-runtime.js +120 -14
  29. package/dist/core/agent-runtime.js.map +1 -1
  30. package/dist/core/code-health.js +3 -0
  31. package/dist/core/code-health.js.map +1 -1
  32. package/dist/core/config.d.ts +7 -0
  33. package/dist/core/config.js +8 -0
  34. package/dist/core/config.js.map +1 -1
  35. package/dist/core/harness-lifecycle.d.ts +63 -0
  36. package/dist/core/harness-lifecycle.js +397 -0
  37. package/dist/core/harness-lifecycle.js.map +1 -0
  38. package/dist/core/harness-rail.js +1 -0
  39. package/dist/core/harness-rail.js.map +1 -1
  40. package/dist/core/mcp-resources.d.ts +27 -0
  41. package/dist/core/mcp-resources.js +104 -1
  42. package/dist/core/mcp-resources.js.map +1 -1
  43. package/dist/core/release-preflight.js +3 -0
  44. package/dist/core/release-preflight.js.map +1 -1
  45. package/dist/core/report-rail.d.ts +1 -1
  46. package/dist/core/report-rail.js +33 -8
  47. package/dist/core/report-rail.js.map +1 -1
  48. package/dist/core/schema-readiness.js +12 -1
  49. package/dist/core/schema-readiness.js.map +1 -1
  50. package/dist/core/skill-schema.d.ts +2 -2
  51. package/dist/core/version.d.ts +1 -1
  52. package/dist/core/version.js +1 -1
  53. package/docs/agent-export-contract.md +42 -0
  54. package/docs/agent-governance-rail.md +89 -0
  55. package/docs/agent-harness-synthesis-2026.md +101 -0
  56. package/docs/agent-hosts.md +24 -5
  57. package/docs/agent-qa-rail.md +92 -0
  58. package/docs/agents.md +31 -12
  59. package/docs/assets/demos/README.md +3 -0
  60. package/docs/assets/screenshots/agents-matrix.svg +35 -0
  61. package/docs/assets/screenshots/host-doctor.svg +21 -0
  62. package/docs/assets/screenshots/status-json.svg +30 -0
  63. package/docs/benchmarking.md +2 -2
  64. package/docs/conductor-mode.md +44 -0
  65. package/docs/context-packs.md +18 -0
  66. package/docs/dashboard-rail.md +6 -0
  67. package/docs/ecosystem-influences.md +65 -0
  68. package/docs/eval-datasets.md +40 -0
  69. package/docs/evaluation-suite.md +6 -0
  70. package/docs/evidence-provenance-rail.md +70 -0
  71. package/docs/external-projects-audit.md +29 -0
  72. package/docs/future-rails-index.md +75 -17
  73. package/docs/golden-agent-tests.md +44 -0
  74. package/docs/governance-cost-rail.md +10 -0
  75. package/docs/harness-lifecycle-rail.md +95 -0
  76. package/docs/harness-rail.md +27 -0
  77. package/docs/host-compatibility-rail.md +30 -6
  78. package/docs/host-matrix-schema.md +43 -0
  79. package/docs/host-router-rail.md +73 -0
  80. package/docs/knowledge-rail.md +76 -0
  81. package/docs/llm-as-judge-policy.md +45 -0
  82. package/docs/mcp-host-manifest.md +33 -0
  83. package/docs/mcp-report-resources.md +9 -0
  84. package/docs/mcp.md +4 -0
  85. package/docs/media-guide.md +27 -0
  86. package/docs/multi-agent-workflow-templates.md +63 -0
  87. package/docs/observability-rail.md +36 -0
  88. package/docs/quickstart.md +1 -1
  89. package/docs/rate-limit-and-fallback-policy.md +45 -0
  90. package/docs/release-workflow.md +12 -1
  91. package/docs/releases/README.md +3 -0
  92. package/docs/releases/RELEASE_NOTES_v1.1.0.md +55 -0
  93. package/docs/releases/RELEASE_NOTES_v1.2.0.md +43 -0
  94. package/docs/repo-docs-audit-2026-06-05.md +55 -0
  95. package/docs/report-rail.md +12 -0
  96. package/docs/resilience-rail.md +48 -0
  97. package/docs/schema-contracts.md +20 -0
  98. package/docs/security-boundaries.md +34 -0
  99. package/docs/skill-rail-2.md +11 -0
  100. package/docs/stable-command-surface.md +16 -1
  101. package/docs/tasklet-rail.md +62 -0
  102. package/docs/tutorial-antigravity.md +7 -2
  103. package/docs/tutorial-deep-agents-role-packs.md +4 -0
  104. package/docs/tutorial-gemini-cli.md +4 -0
  105. package/docs/tutorial-opencode.md +37 -0
  106. package/docs/v1-contract.md +5 -3
  107. package/docs/workflow-rail.md +12 -0
  108. package/examples/agents/README.md +6 -1
  109. package/examples/agents/opencode.md +26 -0
  110. package/package.json +2 -2
@@ -0,0 +1,397 @@
1
+ import { execFile } 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
+ import { ensureWorkspace, getWorkspacePaths, relativeToRoot, writeFileIfMissing, writeJson } from "./config.js";
6
+ import { makeRailId } from "./rail-utils.js";
7
+ const execFileAsync = promisify(execFile);
8
+ export async function initHarnessLifecycle(root = process.cwd(), options = {}) {
9
+ await ensureWorkspace(root);
10
+ const paths = getWorkspacePaths(root);
11
+ const created = [];
12
+ const skipped = [];
13
+ const files = new Map([
14
+ [path.join(paths.harnessDir, "AGENTS.md"), harnessAgentsTemplate()],
15
+ [path.join(paths.harnessDir, "instructions.md"), instructionsTemplate()],
16
+ [path.join(paths.harnessDir, "verification.md"), verificationTemplate()],
17
+ [path.join(paths.harnessDir, "scope.md"), scopeTemplate()],
18
+ [path.join(paths.harnessDir, "lifecycle.md"), lifecycleTemplate()],
19
+ [paths.featureListFile, `${JSON.stringify(emptyFeatureList(), null, 2)}\n`],
20
+ [paths.progressFile, "# Progress\n\nNo lifecycle progress recorded yet.\n"],
21
+ [paths.sessionHandoffFile, handoffTemplate()]
22
+ ]);
23
+ for (const [filePath, contents] of files) {
24
+ const display = relativeToRoot(root, filePath);
25
+ if (options.force) {
26
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
27
+ await fs.writeFile(filePath, contents, "utf8");
28
+ created.push(display);
29
+ continue;
30
+ }
31
+ const result = await writeFileIfMissing(filePath, contents);
32
+ (result === "created" ? created : skipped).push(display);
33
+ }
34
+ return { created, skipped };
35
+ }
36
+ export async function auditHarnessLifecycle(root = process.cwd()) {
37
+ await ensureWorkspace(root);
38
+ const paths = getWorkspacePaths(root);
39
+ const checks = [
40
+ await auditFiles(root, "instructions", "Instructions", [
41
+ path.join(paths.harnessDir, "AGENTS.md"),
42
+ path.join(paths.harnessDir, "instructions.md")
43
+ ], "Run: soturail harness init"),
44
+ await auditFiles(root, "state", "State", [
45
+ paths.featureListFile,
46
+ paths.progressFile,
47
+ paths.sessionHandoffFile
48
+ ], "Run: soturail harness init"),
49
+ await auditFiles(root, "verification", "Verification", [
50
+ path.join(paths.harnessDir, "verification.md")
51
+ ], "Document required checks in .soturail/harness/verification.md"),
52
+ await auditFiles(root, "scope", "Scope", [
53
+ path.join(paths.harnessDir, "scope.md")
54
+ ], "Document in-scope and out-of-scope work"),
55
+ await auditFiles(root, "session-lifecycle", "Session Lifecycle", [
56
+ path.join(paths.harnessDir, "lifecycle.md"),
57
+ paths.sessionHandoffFile
58
+ ], "Run: soturail session start \"objective\""),
59
+ await auditFiles(root, "host-compatibility", "Host Compatibility", [
60
+ path.join(paths.harnessDir, "AGENTS.md")
61
+ ], "Run: soturail agents doctor --all"),
62
+ await auditFiles(root, "evidence-reports", "Evidence/Reports", [
63
+ path.join(paths.harnessDir, "verification.md"),
64
+ paths.progressFile
65
+ ], "Record verification evidence before marking a feature done"),
66
+ await auditFiles(root, "security-boundaries", "Security Boundaries", [
67
+ path.join(paths.harnessDir, "scope.md")
68
+ ], "Review docs/security-boundaries.md and keep local safe defaults")
69
+ ];
70
+ const passed = checks.filter((check) => check.status === "passed").length;
71
+ const score = Math.round((passed / checks.length) * 100);
72
+ const warnings = checks
73
+ .filter((check) => check.status === "warning")
74
+ .map((check) => `${check.title}: ${check.recommendation ?? "review missing evidence"}`);
75
+ const report = {
76
+ schemaVersion: "soturail.harness.audit.v1",
77
+ createdAt: new Date().toISOString(),
78
+ status: warnings.length === 0 ? "passed" : "warning",
79
+ score,
80
+ checks,
81
+ warnings,
82
+ nextCommands: [
83
+ "soturail harness init",
84
+ "soturail feature list",
85
+ "soturail handoff generate",
86
+ "soturail agents doctor --all"
87
+ ]
88
+ };
89
+ await writeJson(paths.harnessAuditJson, report);
90
+ await fs.writeFile(paths.harnessAuditMd, renderHarnessAudit(report), "utf8");
91
+ return report;
92
+ }
93
+ export function renderHarnessAudit(report) {
94
+ return [
95
+ "# SotuRail Harness Lifecycle Audit",
96
+ "",
97
+ `status: ${report.status}`,
98
+ `score: ${report.score}`,
99
+ "",
100
+ "## Checks",
101
+ "",
102
+ ...report.checks.map((check) => `- ${check.title}: ${check.status}${check.recommendation ? ` - ${check.recommendation}` : ""}`),
103
+ "",
104
+ "## Safety",
105
+ "",
106
+ "- Commands run by audit: none",
107
+ "- Local files are inspected without uploading telemetry.",
108
+ "",
109
+ "## Next Commands",
110
+ "",
111
+ ...report.nextCommands.map((command) => `- \`${command}\``),
112
+ ""
113
+ ].join("\n");
114
+ }
115
+ export async function addFeature(title, definitionOfDone = [], root = process.cwd()) {
116
+ const list = await loadFeatureList(root);
117
+ const now = new Date().toISOString();
118
+ const feature = {
119
+ id: makeRailId("feature", title),
120
+ title,
121
+ status: "planned",
122
+ definition_of_done: definitionOfDone,
123
+ evidence: [],
124
+ created_at: now,
125
+ updated_at: now
126
+ };
127
+ list.features.push(feature);
128
+ await saveFeatureList(root, list);
129
+ await appendProgress(root, `Feature added: ${feature.id} - ${feature.title}`);
130
+ return feature;
131
+ }
132
+ export async function startFeature(id, root = process.cwd()) {
133
+ const list = await loadFeatureList(root);
134
+ if (list.active && list.active !== id) {
135
+ throw new Error(`Feature already active: ${list.active}. Mark it done before starting another feature.`);
136
+ }
137
+ const feature = requireFeature(list, id);
138
+ feature.status = "active";
139
+ feature.updated_at = new Date().toISOString();
140
+ list.active = feature.id;
141
+ await saveFeatureList(root, list);
142
+ await appendProgress(root, `Feature started: ${feature.id} - ${feature.title}`);
143
+ return feature;
144
+ }
145
+ export async function completeFeature(id, evidence = [], root = process.cwd()) {
146
+ const list = await loadFeatureList(root);
147
+ const feature = requireFeature(list, id);
148
+ feature.status = "done";
149
+ feature.updated_at = new Date().toISOString();
150
+ feature.evidence = [...new Set([...feature.evidence, ...evidence])];
151
+ if (list.active === feature.id)
152
+ list.active = null;
153
+ await saveFeatureList(root, list);
154
+ await appendProgress(root, `Feature completed: ${feature.id} - ${feature.title}`);
155
+ return feature;
156
+ }
157
+ export async function loadFeatureList(root = process.cwd()) {
158
+ await initHarnessLifecycle(root);
159
+ const raw = await fs.readFile(getWorkspacePaths(root).featureListFile, "utf8");
160
+ const parsed = JSON.parse(raw);
161
+ if (parsed.schemaVersion !== "soturail.feature-list.v1" || !Array.isArray(parsed.features)) {
162
+ throw new Error("Invalid feature list. Expected schemaVersion soturail.feature-list.v1 and a features array.");
163
+ }
164
+ return {
165
+ schemaVersion: "soturail.feature-list.v1",
166
+ active: typeof parsed.active === "string" ? parsed.active : null,
167
+ features: parsed.features
168
+ };
169
+ }
170
+ export function renderFeatureList(list) {
171
+ return [
172
+ "SotuRail feature lifecycle",
173
+ `active: ${list.active ?? "none"}`,
174
+ `features_count: ${list.features.length}`,
175
+ ...list.features.map((feature) => `- ${feature.id}: ${feature.title} [${feature.status}]`)
176
+ ].join("\n") + "\n";
177
+ }
178
+ export async function startSession(objective, root = process.cwd()) {
179
+ await initHarnessLifecycle(root);
180
+ const paths = getWorkspacePaths(root);
181
+ const current = await readSession(root);
182
+ if (current?.status === "active")
183
+ throw new Error(`Session already active: ${current.id}`);
184
+ const session = {
185
+ schemaVersion: "soturail.session.v1",
186
+ id: makeRailId("session", objective),
187
+ objective,
188
+ status: "active",
189
+ startedAt: new Date().toISOString()
190
+ };
191
+ await writeJson(paths.sessionFile, session);
192
+ await appendProgress(root, `Session started: ${session.id} - ${objective}`);
193
+ return session;
194
+ }
195
+ export async function endSession(summary, root = process.cwd()) {
196
+ const session = await readSession(root);
197
+ if (!session || session.status !== "active")
198
+ throw new Error("No active session. Run: soturail session start \"objective\"");
199
+ session.status = "ended";
200
+ session.endedAt = new Date().toISOString();
201
+ if (summary)
202
+ session.summary = summary;
203
+ await writeJson(getWorkspacePaths(root).sessionFile, session);
204
+ await appendProgress(root, `Session ended: ${session.id}${summary ? ` - ${summary}` : ""}`);
205
+ await generateHandoff(summary ? { objective: session.objective, completed: summary } : { objective: session.objective }, root);
206
+ return session;
207
+ }
208
+ export async function generateHandoff(options = {}, root = process.cwd()) {
209
+ await initHarnessLifecycle(root);
210
+ const paths = getWorkspacePaths(root);
211
+ const session = await readSession(root);
212
+ const features = await loadFeatureList(root);
213
+ const latestDone = [...features.features].reverse().find((feature) => feature.status === "done");
214
+ const changedFiles = await gitChangedFiles(root);
215
+ const content = [
216
+ "# SotuRail Session Handoff",
217
+ "",
218
+ "## Current objective",
219
+ "",
220
+ options.objective ?? session?.objective ?? featureTitle(features, features.active) ?? "No active objective recorded.",
221
+ "",
222
+ "## Last completed work",
223
+ "",
224
+ options.completed ?? session?.summary ?? latestDone?.title ?? "No completed work recorded.",
225
+ "",
226
+ "## Files changed",
227
+ "",
228
+ ...(changedFiles.length > 0 ? changedFiles.map((file) => `- ${file}`) : ["- No Git working-tree changes detected."]),
229
+ "",
230
+ "## Verification status",
231
+ "",
232
+ "- Handoff generation does not run verification commands.",
233
+ "- Review `.soturail/harness/verification.md` and attach evidence before marking work complete.",
234
+ "",
235
+ "## Known blockers",
236
+ "",
237
+ options.blocker ?? "No blockers recorded.",
238
+ "",
239
+ "## Next recommended steps",
240
+ "",
241
+ `- ${options.next ?? "Run `soturail harness audit` and the documented verification commands."}`,
242
+ "- Review changed files and evidence before handing work to another host.",
243
+ ""
244
+ ].join("\n");
245
+ await fs.writeFile(paths.sessionHandoffFile, content, "utf8");
246
+ return content;
247
+ }
248
+ async function readSession(root) {
249
+ const raw = await fs.readFile(getWorkspacePaths(root).sessionFile, "utf8").catch(() => "");
250
+ if (!raw)
251
+ return null;
252
+ return JSON.parse(raw);
253
+ }
254
+ async function saveFeatureList(root, list) {
255
+ await writeJson(getWorkspacePaths(root).featureListFile, list);
256
+ }
257
+ async function appendProgress(root, text) {
258
+ const filePath = getWorkspacePaths(root).progressFile;
259
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
260
+ await fs.appendFile(filePath, `\n- ${new Date().toISOString()} ${text}\n`, "utf8");
261
+ }
262
+ async function auditFiles(root, id, title, files, recommendation) {
263
+ const evidence = [];
264
+ for (const file of files) {
265
+ if (await exists(file))
266
+ evidence.push(relativeToRoot(root, file));
267
+ }
268
+ const complete = evidence.length === files.length;
269
+ return {
270
+ id,
271
+ title,
272
+ status: complete ? "passed" : "warning",
273
+ evidence,
274
+ ...(complete ? {} : { recommendation })
275
+ };
276
+ }
277
+ function requireFeature(list, id) {
278
+ const feature = list.features.find((item) => item.id === id);
279
+ if (!feature)
280
+ throw new Error(`Feature not found: ${id}`);
281
+ return feature;
282
+ }
283
+ function featureTitle(list, id) {
284
+ return id ? list.features.find((feature) => feature.id === id)?.title : undefined;
285
+ }
286
+ async function gitChangedFiles(root) {
287
+ try {
288
+ const { stdout } = await execFileAsync("git", ["status", "--short"], {
289
+ cwd: root,
290
+ timeout: 3000,
291
+ windowsHide: true
292
+ });
293
+ return stdout.split(/\r?\n/).filter(Boolean).map((line) => line.slice(3).trim()).filter(Boolean);
294
+ }
295
+ catch {
296
+ return [];
297
+ }
298
+ }
299
+ async function exists(filePath) {
300
+ try {
301
+ await fs.access(filePath);
302
+ return true;
303
+ }
304
+ catch {
305
+ return false;
306
+ }
307
+ }
308
+ function emptyFeatureList() {
309
+ return { schemaVersion: "soturail.feature-list.v1", active: null, features: [] };
310
+ }
311
+ function harnessAgentsTemplate() {
312
+ return `# SotuRail Harness Instructions
313
+
314
+ SotuRail is a local-first Context OS and harness layer for coding agents. It is not an autonomous agent runtime.
315
+
316
+ - Read scope and lifecycle notes before work.
317
+ - Keep MCP resources read-only unless a reviewed project policy says otherwise.
318
+ - Record verification evidence before marking work complete.
319
+ - Do not expose secrets or promise destructive shell execution.
320
+ `;
321
+ }
322
+ function instructionsTemplate() {
323
+ return `# Instructions
324
+
325
+ - Preserve user work and existing project conventions.
326
+ - Use the smallest useful context and keep evidence paths.
327
+ - Prefer deterministic local checks.
328
+ - Require human approval for publish, release, destructive or external actions.
329
+ `;
330
+ }
331
+ function verificationTemplate() {
332
+ return `# Verification
333
+
334
+ Document the project-specific checks required before completion.
335
+
336
+ \`\`\`bash
337
+ npm run typecheck
338
+ npm run build
339
+ npm test
340
+ \`\`\`
341
+
342
+ Harness audit validates this file but does not execute commands.
343
+ `;
344
+ }
345
+ function scopeTemplate() {
346
+ return `# Scope And Security Boundaries
347
+
348
+ ## In scope
349
+
350
+ - Local context, state, evidence, reports, workflows and host handoffs.
351
+
352
+ ## Out of scope
353
+
354
+ - Cloud telemetry, mandatory servers, autonomous edit loops and destructive MCP tools.
355
+ - Secret exposure, unreviewed publishing and arbitrary shell execution through MCP.
356
+ `;
357
+ }
358
+ function lifecycleTemplate() {
359
+ return `# Harness Lifecycle
360
+
361
+ 1. Start a session with a clear objective.
362
+ 2. Add and start one feature.
363
+ 3. Record progress and evidence.
364
+ 4. Audit the harness and run project verification.
365
+ 5. Mark the feature done.
366
+ 6. Generate a handoff and end the session.
367
+ `;
368
+ }
369
+ function handoffTemplate() {
370
+ return `# SotuRail Session Handoff
371
+
372
+ ## Current objective
373
+
374
+ No active objective recorded.
375
+
376
+ ## Last completed work
377
+
378
+ No completed work recorded.
379
+
380
+ ## Files changed
381
+
382
+ - No Git working-tree changes detected.
383
+
384
+ ## Verification status
385
+
386
+ - Not run.
387
+
388
+ ## Known blockers
389
+
390
+ No blockers recorded.
391
+
392
+ ## Next recommended steps
393
+
394
+ - Run \`soturail harness audit\`.
395
+ `;
396
+ }
397
+ //# sourceMappingURL=harness-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-lifecycle.js","sourceRoot":"","sources":["../../src/core/harness-lifecycle.ts"],"names":[],"mappings":"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"}
@@ -68,6 +68,7 @@ export async function harnessDoctor(root = process.cwd()) {
68
68
  lines.push("workflow_connection: workflow verify/evidence reads harness contracts and failures.");
69
69
  lines.push("brain_connection: repeated failures can become brain bugs, draft rules or workflow checks after `soturail brain scan`.");
70
70
  lines.push("brain_next_commands: soturail brain consolidate --dry-run; soturail rules from-brain");
71
+ lines.push("lifecycle_next_commands: soturail harness init; soturail harness audit; soturail handoff generate");
71
72
  return `${lines.join("\n")}\n`;
72
73
  }
73
74
  export async function initHarnessContract(root = process.cwd()) {
@@ -1 +1 @@
1
- {"version":3,"file":"harness-rail.js","sourceRoot":"","sources":["../../src/core/harness-rail.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"harness-rail.js","sourceRoot":"","sources":["../../src/core/harness-rail.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,28 @@ export interface McpResourceInfo {
4
4
  mimeType: string;
5
5
  description: string;
6
6
  }
7
+ export interface McpHostManifestResource {
8
+ id: string;
9
+ uri: string;
10
+ path: string;
11
+ mimeType: string;
12
+ description: string;
13
+ exists: boolean;
14
+ redacted: boolean;
15
+ }
16
+ export interface McpHostManifest {
17
+ schemaVersion: "soturail.mcp.host-manifest.v1";
18
+ createdAt: string;
19
+ version: string;
20
+ host: string;
21
+ status: "passed" | "warning";
22
+ mode: "read-only";
23
+ mutationAllowed: false;
24
+ arbitraryShellExecutionExposed: false;
25
+ resources: McpHostManifestResource[];
26
+ warnings: string[];
27
+ nextCommands: string[];
28
+ }
7
29
  export declare const mcpResources: McpResourceInfo[];
8
30
  export declare function listMcpResources(): Promise<McpResourceInfo[]>;
9
31
  export declare function readMcpResource(uri: string, root?: string): Promise<{
@@ -15,3 +37,8 @@ export declare function writeReportResourceManifest(root?: string): Promise<{
15
37
  path: string;
16
38
  output: string;
17
39
  }>;
40
+ export declare function writeHostResourceManifest(root?: string, hostValue?: string): Promise<{
41
+ path: string;
42
+ manifest: McpHostManifest;
43
+ output: string;
44
+ }>;
@@ -1,5 +1,6 @@
1
1
  import { promises as fs } from "node:fs";
2
2
  import path from "node:path";
3
+ import { parseAgentId } from "./agent-registry.js";
3
4
  import { getWorkspacePaths, readJsonl, relativeToRoot, writeJson } from "./config.js";
4
5
  import { redactText } from "./report-redaction.js";
5
6
  import { SOTURAIL_VERSION } from "./version.js";
@@ -18,7 +19,8 @@ export const mcpResources = [
18
19
  { uri: "soturail://bench/latest", name: "Benchmark Rail Latest", mimeType: "application/json", description: "Latest Benchmark Rail 2 report." },
19
20
  { uri: "soturail://native/candidates", name: "Native Candidates", mimeType: "application/json", description: "Latest benchmark-gated native candidate report." },
20
21
  { uri: "soturail://baseline/latest", name: "Baseline Snapshot", mimeType: "application/json", description: "Latest baseline snapshot report." },
21
- { uri: "soturail://observability/timeline", name: "Observability Timeline", mimeType: "application/json", description: "Local observability timeline." }
22
+ { uri: "soturail://observability/timeline", name: "Observability Timeline", mimeType: "application/json", description: "Local observability timeline." },
23
+ { uri: "soturail://agents/host-manifest", name: "Agent Host Manifest", mimeType: "application/json", description: "Read-only host-specific MCP resource manifest." }
22
24
  ];
23
25
  export async function listMcpResources() {
24
26
  return mcpResources;
@@ -59,6 +61,8 @@ export async function readMcpResource(uri, root = process.cwd()) {
59
61
  return resource(uri, "application/json", await readOptional(path.join(paths.workspace, "baselines", "latest.json"), "{}"));
60
62
  case "soturail://observability/timeline":
61
63
  return resource(uri, "application/json", await readOptional(path.join(paths.workspace, "observability", "timeline.json"), "{}"));
64
+ case "soturail://agents/host-manifest":
65
+ return resource(uri, "application/json", await readOptional(path.join(paths.workspace, "mcp", "host-manifest.json"), "{}"));
62
66
  default:
63
67
  throw new Error(`Unknown MCP resource: ${uri}`);
64
68
  }
@@ -96,9 +100,108 @@ export async function writeReportResourceManifest(root = process.cwd()) {
96
100
  ].join("\n") + "\n"
97
101
  };
98
102
  }
103
+ export async function writeHostResourceManifest(root = process.cwd(), hostValue = "generic") {
104
+ const parsed = parseAgentId(hostValue);
105
+ if (parsed === "all")
106
+ throw new Error("Use a single host for mcp resources host-manifest.");
107
+ const paths = getWorkspacePaths(root);
108
+ const dir = path.join(paths.workspace, "mcp");
109
+ const hostDir = path.join(dir, "host-manifests");
110
+ await fs.mkdir(hostDir, { recursive: true });
111
+ const hostResources = await buildHostManifestResources(root, parsed);
112
+ const missing = hostResources.filter((resourceInfo) => !resourceInfo.exists);
113
+ const manifest = {
114
+ schemaVersion: "soturail.mcp.host-manifest.v1",
115
+ createdAt: new Date().toISOString(),
116
+ version: SOTURAIL_VERSION,
117
+ host: parsed,
118
+ status: missing.length > 0 ? "warning" : "passed",
119
+ mode: "read-only",
120
+ mutationAllowed: false,
121
+ arbitraryShellExecutionExposed: false,
122
+ resources: hostResources,
123
+ warnings: [
124
+ ...(missing.length > 0 ? [`${missing.length} resource artifact(s) are missing; run the recommended commands to generate them.`] : []),
125
+ "Host manifests expose redacted local summaries only and do not grant write access."
126
+ ],
127
+ nextCommands: [
128
+ "soturail status --json",
129
+ "soturail report build",
130
+ `soturail report agent --agent ${reportAgentName(parsed)}`,
131
+ `soturail agents export --agent ${parsed}`,
132
+ `soturail agents doctor --host ${parsed}`
133
+ ]
134
+ };
135
+ const hostPath = path.join(hostDir, `${parsed}.json`);
136
+ const latestPath = path.join(dir, "host-manifest.json");
137
+ await writeJson(hostPath, manifest);
138
+ await writeJson(latestPath, manifest);
139
+ return {
140
+ path: latestPath,
141
+ manifest,
142
+ output: [
143
+ "SotuRail MCP host manifest",
144
+ `host: ${parsed}`,
145
+ `resources: ${hostResources.length}`,
146
+ `missing: ${missing.length}`,
147
+ `manifest: ${relativeToRoot(root, latestPath)}`,
148
+ "mode: read-only",
149
+ "mutation_allowed: false",
150
+ "arbitrary_shell_execution_exposed: false"
151
+ ].join("\n") + "\n"
152
+ };
153
+ }
99
154
  function resource(uri, mimeType, text) {
100
155
  return { uri, mimeType, text: redactText(sanitizeMcpResourceText(text)).text };
101
156
  }
157
+ async function buildHostManifestResources(root, host) {
158
+ const paths = getWorkspacePaths(root);
159
+ const items = [
160
+ hostResource(root, "status-json", "soturail://status/latest", path.join(paths.workspace, "status", "latest.json"), "application/json", "Latest unified status JSON."),
161
+ hostResource(root, "status-agent", "soturail://status/agent", path.join(paths.workspace, "status", "agent.md"), "text/markdown", "Concise agent-safe status."),
162
+ hostResource(root, "report-json", "soturail://reports/latest/json", path.join(paths.reportsDir, "latest.json"), "application/json", "Latest local report JSON."),
163
+ hostResource(root, "report-md", "soturail://reports/latest/md", path.join(paths.reportsDir, "latest.md"), "text/markdown", "Latest local report Markdown."),
164
+ hostResource(root, "report-html", "soturail://reports/latest/html", path.join(paths.reportsDir, "latest.html"), "text/html", "Static local report HTML."),
165
+ hostResource(root, "agent-report", `soturail://reports/agent/${host}`, path.join(paths.reportsDir, `agent-${reportAgentName(host)}.md`), "text/markdown", "Host-oriented agent report."),
166
+ hostResource(root, "brain-brief", `soturail://brain/export/${host}`, path.join(paths.brainExportsDir, `${brainExportName(host)}.md`), "text/markdown", "Project Brain host brief when available."),
167
+ hostResource(root, "schema-check", "soturail://schemas/check", path.join(paths.workspace, "schemas", "check.json"), "application/json", "Schema compatibility check."),
168
+ hostResource(root, "v1-readiness", "soturail://readiness/v1", path.join(paths.workspace, "readiness", "v1.json"), "application/json", "v1 readiness report."),
169
+ hostResource(root, "bench-latest", "soturail://bench/latest", path.join(paths.workspace, "bench", "latest.json"), "application/json", "Latest benchmark report."),
170
+ hostResource(root, "native-candidates", "soturail://native/candidates", path.join(paths.workspace, "native", "candidates.json"), "application/json", "Native candidate report."),
171
+ hostResource(root, "baseline-latest", "soturail://baseline/latest", path.join(paths.workspace, "baselines", "latest.json"), "application/json", "Baseline snapshot report."),
172
+ hostResource(root, "dashboard", "soturail://dashboard/index", path.join(paths.workspace, "dashboard", "index.html"), "text/html", "Static local dashboard."),
173
+ hostResource(root, "host-export", `soturail://agents/${host}/export`, path.join(paths.workspace, "agents", host), "inode/directory", "Host-specific v1.1 export directory."),
174
+ hostResource(root, "host-doctor", `soturail://agents/${host}/doctor`, path.join(paths.workspace, "agents", host, "doctor.json"), "application/json", "Host doctor report.")
175
+ ];
176
+ return Promise.all(items.map(async (item) => {
177
+ const { fullPath, ...publicItem } = item;
178
+ return { ...publicItem, exists: await exists(fullPath) };
179
+ }));
180
+ }
181
+ function hostResource(root, id, uri, filePath, mimeType, description) {
182
+ return {
183
+ id,
184
+ uri,
185
+ path: relativeToRoot(root, filePath).replace(/\\/g, "/"),
186
+ fullPath: filePath,
187
+ mimeType,
188
+ description,
189
+ redacted: true
190
+ };
191
+ }
192
+ function reportAgentName(host) {
193
+ if (host === "amp" || host === "kiro")
194
+ return "generic";
195
+ return host;
196
+ }
197
+ function brainExportName(host) {
198
+ if (host === "claude" || host === "codex" || host === "gemini" || host === "cursor" || host === "generic")
199
+ return host;
200
+ return "generic";
201
+ }
202
+ async function exists(filePath) {
203
+ return fs.access(filePath).then(() => true).catch(() => false);
204
+ }
102
205
  async function readOptional(filePath, fallback) {
103
206
  return fs.readFile(filePath, "utf8").catch(() => fallback);
104
207
  }