fix(coding-agent): remove process-cwd tool singletons and use tool-name allowlists

- switch SDK/CLI tool selection to name-based allowlists
- apply allowlists across built-in, extension, and SDK tools
- remove ambient process.cwd defaults from core tooling and resource helpers
- update tests, examples, and TUI callers for explicit cwd plumbing
- add regression coverage for extension tool filtering

closes #3452
closes #2835
This commit is contained in:
Mario Zechner
2026-04-20 21:57:31 +02:00
parent 27c1544839
commit 5a4e22ea44
42 changed files with 254 additions and 201 deletions

View File

@@ -4,10 +4,15 @@
* Shows how to replace or modify the default system prompt.
*/
import { createAgentSession, DefaultResourceLoader, SessionManager } from "@mariozechner/pi-coding-agent";
import { createAgentSession, DefaultResourceLoader, getAgentDir, SessionManager } from "@mariozechner/pi-coding-agent";
const cwd = process.cwd();
const agentDir = getAgentDir();
// Option 1: Replace prompt entirely
const loader1 = new DefaultResourceLoader({
cwd,
agentDir,
systemPromptOverride: () => `You are a helpful assistant that speaks like a pirate.
Always end responses with "Arrr!"`,
// Needed to avoid DefaultResourceLoader appending APPEND_SYSTEM.md from ~/.pi/agent or <cwd>/.pi.
@@ -32,6 +37,8 @@ console.log("\n");
// Option 2: Append instructions to the default prompt
const loader2 = new DefaultResourceLoader({
cwd,
agentDir,
appendSystemPromptOverride: (base) => [
...base,
"## Additional Instructions\n- Always be concise\n- Use bullet points when listing things",

View File

@@ -9,6 +9,7 @@ import {
createAgentSession,
createSyntheticSourceInfo,
DefaultResourceLoader,
getAgentDir,
SessionManager,
type Skill,
} from "@mariozechner/pi-coding-agent";
@@ -24,6 +25,8 @@ const customSkill: Skill = {
};
const loader = new DefaultResourceLoader({
cwd: process.cwd(),
agentDir: getAgentDir(),
skillsOverride: (current) => {
const filteredSkills = current.skills.filter((s) => s.name.includes("browser") || s.name.includes("search"));
return {

View File

@@ -13,12 +13,14 @@
* export default function (pi: ExtensionAPI) { ... }
*/
import { createAgentSession, DefaultResourceLoader, SessionManager } from "@mariozechner/pi-coding-agent";
import { createAgentSession, DefaultResourceLoader, getAgentDir, SessionManager } from "@mariozechner/pi-coding-agent";
// Extensions are discovered automatically from standard locations.
// You can also add paths via settings.json or DefaultResourceLoader options.
const resourceLoader = new DefaultResourceLoader({
cwd: process.cwd(),
agentDir: getAgentDir(),
additionalExtensionPaths: ["./my-logging-extension.ts", "./my-safety-extension.ts"],
extensionFactories: [
(pi) => {

View File

@@ -4,10 +4,12 @@
* Context files provide project-specific instructions loaded into the system prompt.
*/
import { createAgentSession, DefaultResourceLoader, SessionManager } from "@mariozechner/pi-coding-agent";
import { createAgentSession, DefaultResourceLoader, getAgentDir, SessionManager } from "@mariozechner/pi-coding-agent";
// Disable context files entirely by returning an empty list in agentsFilesOverride.
const loader = new DefaultResourceLoader({
cwd: process.cwd(),
agentDir: getAgentDir(),
agentsFilesOverride: (current) => ({
agentsFiles: [
...current.agentsFiles,

View File

@@ -8,6 +8,7 @@ import {
createAgentSession,
createSyntheticSourceInfo,
DefaultResourceLoader,
getAgentDir,
type PromptTemplate,
SessionManager,
} from "@mariozechner/pi-coding-agent";
@@ -26,6 +27,8 @@ const deployTemplate: PromptTemplate = {
};
const loader = new DefaultResourceLoader({
cwd: process.cwd(),
agentDir: getAgentDir(),
promptsOverride: (current) => ({
prompts: [...current.prompts, deployTemplate],
diagnostics: current.diagnostics,

View File

@@ -6,12 +6,14 @@
import { createAgentSession, SessionManager, SettingsManager } from "@mariozechner/pi-coding-agent";
const cwd = process.cwd();
// Load current settings (merged global + project)
const settingsManagerFromDisk = SettingsManager.create();
const settingsManagerFromDisk = SettingsManager.create(cwd);
console.log("Current settings:", JSON.stringify(settingsManagerFromDisk.getGlobalSettings(), null, 2));
// Override specific settings
const settingsManager = SettingsManager.create();
const settingsManager = SettingsManager.create(cwd);
settingsManager.applyOverrides({
compaction: { enabled: false },
retry: { enabled: true, maxRetries: 5, baseDelayMs: 1000 },