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.
- package/README.md +60 -13
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/agents.js +37 -7
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/feature.d.ts +2 -0
- package/dist/commands/feature.js +28 -0
- package/dist/commands/feature.js.map +1 -0
- package/dist/commands/handoff.d.ts +2 -0
- package/dist/commands/handoff.js +14 -0
- package/dist/commands/handoff.js.map +1 -0
- package/dist/commands/harness.js +20 -0
- package/dist/commands/harness.js.map +1 -1
- package/dist/commands/mcp.js +10 -1
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/report.js +14 -3
- package/dist/commands/report.js.map +1 -1
- package/dist/commands/session.d.ts +2 -0
- package/dist/commands/session.js +17 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/core/agent-exporter.d.ts +39 -2
- package/dist/core/agent-exporter.js +290 -24
- package/dist/core/agent-exporter.js.map +1 -1
- package/dist/core/agent-profile.d.ts +1 -1
- package/dist/core/agent-registry.js +12 -0
- package/dist/core/agent-registry.js.map +1 -1
- package/dist/core/agent-runtime.d.ts +15 -1
- package/dist/core/agent-runtime.js +120 -14
- package/dist/core/agent-runtime.js.map +1 -1
- package/dist/core/code-health.js +3 -0
- package/dist/core/code-health.js.map +1 -1
- package/dist/core/config.d.ts +7 -0
- package/dist/core/config.js +8 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/harness-lifecycle.d.ts +63 -0
- package/dist/core/harness-lifecycle.js +397 -0
- package/dist/core/harness-lifecycle.js.map +1 -0
- package/dist/core/harness-rail.js +1 -0
- package/dist/core/harness-rail.js.map +1 -1
- package/dist/core/mcp-resources.d.ts +27 -0
- package/dist/core/mcp-resources.js +104 -1
- package/dist/core/mcp-resources.js.map +1 -1
- package/dist/core/release-preflight.js +3 -0
- package/dist/core/release-preflight.js.map +1 -1
- package/dist/core/report-rail.d.ts +1 -1
- package/dist/core/report-rail.js +33 -8
- package/dist/core/report-rail.js.map +1 -1
- package/dist/core/schema-readiness.js +12 -1
- package/dist/core/schema-readiness.js.map +1 -1
- package/dist/core/skill-schema.d.ts +2 -2
- package/dist/core/version.d.ts +1 -1
- package/dist/core/version.js +1 -1
- package/docs/agent-export-contract.md +42 -0
- package/docs/agent-governance-rail.md +89 -0
- package/docs/agent-harness-synthesis-2026.md +101 -0
- package/docs/agent-hosts.md +24 -5
- package/docs/agent-qa-rail.md +92 -0
- package/docs/agents.md +31 -12
- package/docs/assets/demos/README.md +3 -0
- package/docs/assets/screenshots/agents-matrix.svg +35 -0
- package/docs/assets/screenshots/host-doctor.svg +21 -0
- package/docs/assets/screenshots/status-json.svg +30 -0
- package/docs/benchmarking.md +2 -2
- package/docs/conductor-mode.md +44 -0
- package/docs/context-packs.md +18 -0
- package/docs/dashboard-rail.md +6 -0
- package/docs/ecosystem-influences.md +65 -0
- package/docs/eval-datasets.md +40 -0
- package/docs/evaluation-suite.md +6 -0
- package/docs/evidence-provenance-rail.md +70 -0
- package/docs/external-projects-audit.md +29 -0
- package/docs/future-rails-index.md +75 -17
- package/docs/golden-agent-tests.md +44 -0
- package/docs/governance-cost-rail.md +10 -0
- package/docs/harness-lifecycle-rail.md +95 -0
- package/docs/harness-rail.md +27 -0
- package/docs/host-compatibility-rail.md +30 -6
- package/docs/host-matrix-schema.md +43 -0
- package/docs/host-router-rail.md +73 -0
- package/docs/knowledge-rail.md +76 -0
- package/docs/llm-as-judge-policy.md +45 -0
- package/docs/mcp-host-manifest.md +33 -0
- package/docs/mcp-report-resources.md +9 -0
- package/docs/mcp.md +4 -0
- package/docs/media-guide.md +27 -0
- package/docs/multi-agent-workflow-templates.md +63 -0
- package/docs/observability-rail.md +36 -0
- package/docs/quickstart.md +1 -1
- package/docs/rate-limit-and-fallback-policy.md +45 -0
- package/docs/release-workflow.md +12 -1
- package/docs/releases/README.md +3 -0
- package/docs/releases/RELEASE_NOTES_v1.1.0.md +55 -0
- package/docs/releases/RELEASE_NOTES_v1.2.0.md +43 -0
- package/docs/repo-docs-audit-2026-06-05.md +55 -0
- package/docs/report-rail.md +12 -0
- package/docs/resilience-rail.md +48 -0
- package/docs/schema-contracts.md +20 -0
- package/docs/security-boundaries.md +34 -0
- package/docs/skill-rail-2.md +11 -0
- package/docs/stable-command-surface.md +16 -1
- package/docs/tasklet-rail.md +62 -0
- package/docs/tutorial-antigravity.md +7 -2
- package/docs/tutorial-deep-agents-role-packs.md +4 -0
- package/docs/tutorial-gemini-cli.md +4 -0
- package/docs/tutorial-opencode.md +37 -0
- package/docs/v1-contract.md +5 -3
- package/docs/workflow-rail.md +12 -0
- package/examples/agents/README.md +6 -1
- package/examples/agents/opencode.md +26 -0
- 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
|
}
|