feat(FN-3555): document richer onboarding drafts in agents.md and dashboard

Documents richer onboarding drafts in agents.md and updates the dashboard README with a small addition, completing Step 4 of the onboarding feature.

Fusion-Task-Id: FN-3555
This commit is contained in:
Fusion
2026-05-07 11:21:06 -07:00
committed by gsxdsm
parent edbc8b2535
commit af0fc5fc95
9 changed files with 209 additions and 18 deletions

View File

@@ -74,7 +74,7 @@ describe("agent-onboarding", () => {
}
});
it("parses complete summary responses", () => {
it("parses complete summary responses with rich optional draft fields", () => {
const parsed = parseAgentOnboardingResponse(
JSON.stringify({
type: "complete",
@@ -84,6 +84,13 @@ describe("agent-onboarding", () => {
instructionsText: "Review docs for clarity and accuracy.",
thinkingLevel: "medium",
maxTurns: 20,
soul: "Calm and thorough",
memory: "Remember docs conventions",
heartbeatProcedurePath: " .fusion/agents/docs-reviewer/HEARTBEAT.md ",
heartbeatIntervalMs: 30000,
heartbeatEnabled: true,
modelHint: "anthropic/claude-sonnet-4-5",
runtimeHint: "openclaw",
},
}),
);
@@ -92,6 +99,34 @@ describe("agent-onboarding", () => {
if (parsed.type === "complete") {
expect(parsed.data.name).toBe("Docs Reviewer");
expect(parsed.data.maxTurns).toBe(20);
expect(parsed.data.heartbeatProcedurePath).toBe(".fusion/agents/docs-reviewer/HEARTBEAT.md");
expect(parsed.data.heartbeatIntervalMs).toBe(30000);
expect(parsed.data.heartbeatEnabled).toBe(true);
expect(parsed.data.modelHint).toBe("anthropic/claude-sonnet-4-5");
expect(parsed.data.runtimeHint).toBe("openclaw");
}
});
it("parses legacy complete summaries without rich draft fields", () => {
const parsed = parseAgentOnboardingResponse(
JSON.stringify({
type: "complete",
data: {
name: "Legacy Reviewer",
role: "reviewer",
instructionsText: "Review old style drafts",
thinkingLevel: "low",
maxTurns: 10,
},
}),
);
expect(parsed.type).toBe("complete");
if (parsed.type === "complete") {
expect(parsed.data.name).toBe("Legacy Reviewer");
expect(parsed.data.heartbeatProcedurePath).toBeUndefined();
expect(parsed.data.modelHint).toBeUndefined();
expect(parsed.data.runtimeHint).toBeUndefined();
}
});
@@ -112,6 +147,58 @@ describe("agent-onboarding", () => {
).toThrow(/Invalid summary/);
});
it("rejects malformed rich draft fields", () => {
expect(() =>
parseAgentOnboardingResponse(
JSON.stringify({
type: "complete",
data: {
name: "Malformed",
role: "reviewer",
instructionsText: "Valid instructions",
thinkingLevel: "medium",
maxTurns: 20,
heartbeatProcedurePath: "",
},
}),
),
).toThrow("Invalid summary.heartbeatProcedurePath");
expect(() =>
parseAgentOnboardingResponse(
JSON.stringify({
type: "complete",
data: {
name: "Malformed",
role: "reviewer",
instructionsText: "Valid instructions",
thinkingLevel: "medium",
maxTurns: 20,
heartbeatIntervalMs: 0,
},
}),
),
).toThrow("Invalid summary.heartbeatIntervalMs");
expect(() =>
parseAgentOnboardingResponse(
JSON.stringify({
type: "complete",
data: {
name: "Malformed",
role: "reviewer",
instructionsText: "Valid instructions",
thinkingLevel: "medium",
maxTurns: 20,
heartbeatEnabled: "yes",
modelHint: 10,
runtimeHint: { runtime: "openclaw" },
},
}),
),
).toThrow(/Invalid summary\.(heartbeatEnabled|modelHint|runtimeHint)/);
});
it("builds compact onboarding context prompt for create mode", () => {
const prompt = createAgentOnboardingSessionPrompt({
mode: "create",