fix: follow soul.md more closely (#1434)
* Agents: honor SOUL.md persona guidance * fix: harden SOUL.md detection (#1434) (thanks @neooriginal) --------- Co-authored-by: Peter Steinberger <steipete@gmail.com>
This commit is contained in:
@@ -33,6 +33,7 @@ Docs: https://docs.clawd.bot
|
|||||||
- Agents: make OpenAI sessions image-sanitize-only; gate tool-id/repair sanitization by provider.
|
- Agents: make OpenAI sessions image-sanitize-only; gate tool-id/repair sanitization by provider.
|
||||||
- Doctor: honor CLAWDBOT_GATEWAY_TOKEN for auth checks and security audit token reuse. (#1448) Thanks @azade-c.
|
- Doctor: honor CLAWDBOT_GATEWAY_TOKEN for auth checks and security audit token reuse. (#1448) Thanks @azade-c.
|
||||||
- Agents: make tool summaries more readable and only show optional params when set.
|
- Agents: make tool summaries more readable and only show optional params when set.
|
||||||
|
- Agents: honor SOUL.md guidance even when the file is nested or path-qualified. (#1434) Thanks @neooriginal.
|
||||||
- CLI: prefer `~` for home paths in output.
|
- CLI: prefer `~` for home paths in output.
|
||||||
- Mattermost (plugin): enforce pairing/allowlist gating, keep @username targets, and clarify plugin-only docs. (#1428) Thanks @damoahdominic.
|
- Mattermost (plugin): enforce pairing/allowlist gating, keep @username targets, and clarify plugin-only docs. (#1428) Thanks @damoahdominic.
|
||||||
- Agents: centralize transcript sanitization in the runner; keep <final> tags and error turns intact.
|
- Agents: centralize transcript sanitization in the runner; keep <final> tags and error turns intact.
|
||||||
|
|||||||
@@ -237,6 +237,20 @@ describe("buildAgentSystemPrompt", () => {
|
|||||||
expect(prompt).toContain("Bravo");
|
expect(prompt).toContain("Bravo");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("adds SOUL guidance when a soul file is present", () => {
|
||||||
|
const prompt = buildAgentSystemPrompt({
|
||||||
|
workspaceDir: "/tmp/clawd",
|
||||||
|
contextFiles: [
|
||||||
|
{ path: "./SOUL.md", content: "Persona" },
|
||||||
|
{ path: "dir\\SOUL.md", content: "Persona Windows" },
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(prompt).toContain(
|
||||||
|
"If SOUL.md is present, embody its persona and tone. Avoid stiff, generic replies; follow its guidance unless higher-priority instructions override it.",
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
it("summarizes the message tool when available", () => {
|
it("summarizes the message tool when available", () => {
|
||||||
const prompt = buildAgentSystemPrompt({
|
const prompt = buildAgentSystemPrompt({
|
||||||
workspaceDir: "/tmp/clawd",
|
workspaceDir: "/tmp/clawd",
|
||||||
|
|||||||
@@ -517,12 +517,18 @@ export function buildAgentSystemPrompt(params: {
|
|||||||
|
|
||||||
const contextFiles = params.contextFiles ?? [];
|
const contextFiles = params.contextFiles ?? [];
|
||||||
if (contextFiles.length > 0) {
|
if (contextFiles.length > 0) {
|
||||||
|
const hasSoulFile = contextFiles.some((file) => {
|
||||||
|
const normalizedPath = file.path.trim().replace(/\\/g, "/");
|
||||||
|
const baseName = normalizedPath.split("/").pop() ?? normalizedPath;
|
||||||
|
return baseName.toLowerCase() === "soul.md";
|
||||||
|
});
|
||||||
|
lines.push("# Project Context", "", "The following project context files have been loaded:");
|
||||||
|
if (hasSoulFile) {
|
||||||
lines.push(
|
lines.push(
|
||||||
"# Project Context",
|
"If SOUL.md is present, embody its persona and tone. Avoid stiff, generic replies; follow its guidance unless higher-priority instructions override it.",
|
||||||
"",
|
|
||||||
"The following project context files have been loaded:",
|
|
||||||
"",
|
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
lines.push("");
|
||||||
for (const file of contextFiles) {
|
for (const file of contextFiles) {
|
||||||
lines.push(`## ${file.path}`, "", file.content, "");
|
lines.push(`## ${file.path}`, "", file.content, "");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user