From ac37d4d439391f296257293ed90ba53072057ce8 Mon Sep 17 00:00:00 2001 From: Aliou Diallo Date: Tue, 14 Apr 2026 20:19:11 +0200 Subject: [PATCH] feat(coding-agent): support multiple --append-system-prompt flags (#3171) --- packages/coding-agent/CHANGELOG.md | 4 ++++ packages/coding-agent/src/cli/args.ts | 7 ++++--- packages/coding-agent/src/core/resource-loader.ts | 13 ++++++++----- packages/coding-agent/test/args.test.ts | 7 ++++++- 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index eba7c7a9..d0ca6441 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Added + +- Added support for multiple `--append-system-prompt` flags, each value is appended to the system prompt separated by double newlines ([#3169](https://github.com/badlogic/pi-mono/pull/3169) by [@aliou](https://github.com/aliou)) + ## [0.67.1] - 2026-04-13 ### Telemetry diff --git a/packages/coding-agent/src/cli/args.ts b/packages/coding-agent/src/cli/args.ts index b0c72b84..19464594 100644 --- a/packages/coding-agent/src/cli/args.ts +++ b/packages/coding-agent/src/cli/args.ts @@ -15,7 +15,7 @@ export interface Args { model?: string; apiKey?: string; systemPrompt?: string; - appendSystemPrompt?: string; + appendSystemPrompt?: string[]; thinking?: ThinkingLevel; continue?: boolean; resume?: boolean; @@ -88,7 +88,8 @@ export function parseArgs(args: string[]): Args { } else if (arg === "--system-prompt" && i + 1 < args.length) { result.systemPrompt = args[++i]; } else if (arg === "--append-system-prompt" && i + 1 < args.length) { - result.appendSystemPrompt = args[++i]; + result.appendSystemPrompt = result.appendSystemPrompt ?? []; + result.appendSystemPrompt.push(args[++i]); } else if (arg === "--no-session") { result.noSession = true; } else if (arg === "--session" && i + 1 < args.length) { @@ -216,7 +217,7 @@ ${chalk.bold("Options:")} --model Model pattern or ID (supports "provider/id" and optional ":") --api-key API key (defaults to env vars) --system-prompt System prompt (default: coding assistant prompt) - --append-system-prompt Append text or file contents to the system prompt + --append-system-prompt Append text or file contents to the system prompt (can be used multiple times) --mode Output mode: text (default), json, or rpc --print, -p Non-interactive mode: process prompt and exit --continue, -c Continue previous session diff --git a/packages/coding-agent/src/core/resource-loader.ts b/packages/coding-agent/src/core/resource-loader.ts index 8377eff4..ce71b1ec 100644 --- a/packages/coding-agent/src/core/resource-loader.ts +++ b/packages/coding-agent/src/core/resource-loader.ts @@ -127,7 +127,7 @@ export interface DefaultResourceLoaderOptions { noPromptTemplates?: boolean; noThemes?: boolean; systemPrompt?: string; - appendSystemPrompt?: string; + appendSystemPrompt?: string[]; extensionsOverride?: (base: LoadExtensionsResult) => LoadExtensionsResult; skillsOverride?: (base: { skills: Skill[]; diagnostics: ResourceDiagnostic[] }) => { skills: Skill[]; @@ -164,7 +164,7 @@ export class DefaultResourceLoader implements ResourceLoader { private noPromptTemplates: boolean; private noThemes: boolean; private systemPromptSource?: string; - private appendSystemPromptSource?: string; + private appendSystemPromptSource?: string[]; private extensionsOverride?: (base: LoadExtensionsResult) => LoadExtensionsResult; private skillsOverride?: (base: { skills: Skill[]; diagnostics: ResourceDiagnostic[] }) => { skills: Skill[]; @@ -458,9 +458,12 @@ export class DefaultResourceLoader implements ResourceLoader { ); this.systemPrompt = this.systemPromptOverride ? this.systemPromptOverride(baseSystemPrompt) : baseSystemPrompt; - const appendSource = this.appendSystemPromptSource ?? this.discoverAppendSystemPromptFile(); - const resolvedAppend = resolvePromptInput(appendSource, "append system prompt"); - const baseAppend = resolvedAppend ? [resolvedAppend] : []; + const appendSources = + this.appendSystemPromptSource ?? + (this.discoverAppendSystemPromptFile() ? [this.discoverAppendSystemPromptFile()!] : []); + const baseAppend = appendSources + .map((s) => resolvePromptInput(s, "append system prompt")) + .filter((s): s is string => s !== undefined); this.appendSystemPrompt = this.appendSystemPromptOverride ? this.appendSystemPromptOverride(baseAppend) : baseAppend; diff --git a/packages/coding-agent/test/args.test.ts b/packages/coding-agent/test/args.test.ts index 74b72469..4091295e 100644 --- a/packages/coding-agent/test/args.test.ts +++ b/packages/coding-agent/test/args.test.ts @@ -92,7 +92,12 @@ describe("parseArgs", () => { test("parses --append-system-prompt", () => { const result = parseArgs(["--append-system-prompt", "Additional context"]); - expect(result.appendSystemPrompt).toBe("Additional context"); + expect(result.appendSystemPrompt).toEqual(["Additional context"]); + }); + + test("parses multiple --append-system-prompt flags", () => { + const result = parseArgs(["--append-system-prompt", "Context A", "--append-system-prompt", "Context B"]); + expect(result.appendSystemPrompt).toEqual(["Context A", "Context B"]); }); test("parses --mode", () => {