@rubytech/taskmaster 1.24.0 → 1.26.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.
@@ -161,7 +161,7 @@ export function buildSystemPrompt(params) {
161
161
  },
162
162
  });
163
163
  const ttsHint = params.config ? buildTtsSystemPromptHint(params.config) : undefined;
164
- return buildAgentSystemPrompt({
164
+ const prompt = buildAgentSystemPrompt({
165
165
  workspaceDir: params.workspaceDir,
166
166
  defaultThinkLevel: params.defaultThinkLevel,
167
167
  extraSystemPrompt: params.extraSystemPrompt,
@@ -178,6 +178,11 @@ export function buildSystemPrompt(params) {
178
178
  contextFiles: params.contextFiles,
179
179
  ttsHint,
180
180
  });
181
+ return {
182
+ prompt,
183
+ bootstrapFiles: params.bootstrapFiles ?? [],
184
+ skillsPrompt: params.skillsPrompt ?? "",
185
+ };
181
186
  }
182
187
  export function normalizeCliModel(modelId, backend) {
183
188
  const trimmed = modelId.trim();
@@ -10,7 +10,9 @@ import { makeBootstrapWarn, resolveBootstrapContextForRun } from "./bootstrap-fi
10
10
  import { resolveCliBackendConfig } from "./cli-backends.js";
11
11
  import { appendImagePathsToPrompt, buildCliArgs, buildSystemPrompt, cleanupResumeProcesses, cleanupSuspendedCliProcesses, enqueueCliRun, normalizeCliModel, parseCliJson, parseCliJsonl, resolvePromptInput, resolveSessionIdToSend, resolveSystemPromptUsage, writeCliImages, } from "./cli-runner/helpers.js";
12
12
  import { FailoverError, resolveFailoverStatus } from "./failover-error.js";
13
- import { classifyFailoverReason, isFailoverErrorMessage } from "./pi-embedded-helpers.js";
13
+ import { classifyFailoverReason, isFailoverErrorMessage, resolveBootstrapMaxChars, } from "./pi-embedded-helpers.js";
14
+ import { buildSystemPromptReport } from "./system-prompt-report.js";
15
+ import { writeSystemPromptLog } from "./system-prompt-log.js";
14
16
  const log = createSubsystemLogger("agent/claude-cli");
15
17
  export async function runCliAgent(params) {
16
18
  const started = Date.now();
@@ -31,7 +33,7 @@ export async function runCliAgent(params) {
31
33
  .filter(Boolean)
32
34
  .join("\n");
33
35
  const sessionLabel = params.sessionKey ?? params.sessionId;
34
- const { contextFiles } = await resolveBootstrapContextForRun({
36
+ const { bootstrapFiles, contextFiles } = await resolveBootstrapContextForRun({
35
37
  workspaceDir,
36
38
  config: params.config,
37
39
  sessionKey: params.sessionKey,
@@ -51,7 +53,7 @@ export async function runCliAgent(params) {
51
53
  cwd: process.cwd(),
52
54
  moduleUrl: import.meta.url,
53
55
  });
54
- const systemPrompt = buildSystemPrompt({
56
+ const { prompt: systemPrompt, skillsPrompt } = buildSystemPrompt({
55
57
  workspaceDir,
56
58
  config: params.config,
57
59
  defaultThinkLevel: params.thinkLevel,
@@ -63,7 +65,28 @@ export async function runCliAgent(params) {
63
65
  contextFiles,
64
66
  modelDisplay,
65
67
  agentId: sessionAgentId,
68
+ bootstrapFiles,
66
69
  });
70
+ const systemPromptReport = buildSystemPromptReport({
71
+ source: "run",
72
+ generatedAt: Date.now(),
73
+ sessionId: params.sessionId,
74
+ sessionKey: params.sessionKey,
75
+ provider: params.provider,
76
+ model: modelId,
77
+ workspaceDir,
78
+ bootstrapMaxChars: resolveBootstrapMaxChars(params.config),
79
+ systemPrompt,
80
+ bootstrapFiles,
81
+ injectedFiles: contextFiles,
82
+ skillsPrompt,
83
+ tools: [],
84
+ });
85
+ // Fire-and-forget: log full system prompt to disk
86
+ const sessionKeyForLog = params.sessionKey ?? params.sessionId;
87
+ if (sessionKeyForLog) {
88
+ writeSystemPromptLog(sessionKeyForLog, systemPrompt).catch(() => { });
89
+ }
67
90
  const { sessionId: cliSessionIdToSend, isNew } = resolveSessionIdToSend({
68
91
  backend,
69
92
  cliSessionId: params.cliSessionId,
@@ -219,6 +242,7 @@ export async function runCliAgent(params) {
219
242
  model: modelId,
220
243
  usage: output.usage,
221
244
  },
245
+ systemPromptReport,
222
246
  },
223
247
  };
224
248
  }
@@ -32,6 +32,7 @@ import { acquireSessionWriteLock } from "../../session-write-lock.js";
32
32
  import { applySkillEnvOverrides, applySkillEnvOverridesFromSnapshot, loadWorkspaceSkillEntries, resolveSkillsPromptForRun, } from "../../skills.js";
33
33
  import { DEFAULT_BOOTSTRAP_FILENAME } from "../../workspace.js";
34
34
  import { buildSystemPromptReport } from "../../system-prompt-report.js";
35
+ import { writeSystemPromptLog } from "../../system-prompt-log.js";
35
36
  import { resolveDefaultModelForAgent } from "../../model-selection.js";
36
37
  import { isAbortError } from "../abort.js";
37
38
  import { buildEmbeddedExtensionPaths } from "../extensions.js";
@@ -326,6 +327,11 @@ export async function runEmbeddedAttempt(params) {
326
327
  tools,
327
328
  });
328
329
  const systemPrompt = createSystemPromptOverride(appendPrompt);
330
+ // Fire-and-forget: log the full system prompt text to disk
331
+ const sessionKeyForLog = params.sessionKey ?? params.sessionId;
332
+ if (sessionKeyForLog) {
333
+ writeSystemPromptLog(sessionKeyForLog, appendPrompt).catch(() => { });
334
+ }
329
335
  const sessionLock = await acquireSessionWriteLock({
330
336
  sessionFile: params.sessionFile,
331
337
  });
@@ -0,0 +1,24 @@
1
+ import fs from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { createSubsystemLogger } from "../logging/subsystem.js";
5
+ const log = createSubsystemLogger("system-prompt-log");
6
+ const DEFAULT_DIR = path.join(os.homedir(), ".taskmaster", "logs", "system-prompts");
7
+ const MAX_KEY_LENGTH = 128;
8
+ export function sanitiseSessionKey(key) {
9
+ const cleaned = key.replace(/[:/\\]/g, "_").trim();
10
+ if (!cleaned)
11
+ return "_unknown_";
12
+ return cleaned.slice(0, MAX_KEY_LENGTH);
13
+ }
14
+ export async function writeSystemPromptLog(sessionKey, systemPrompt, dir = DEFAULT_DIR) {
15
+ try {
16
+ const fileName = `${sanitiseSessionKey(sessionKey)}.txt`;
17
+ await fs.mkdir(dir, { recursive: true });
18
+ await fs.writeFile(path.join(dir, fileName), systemPrompt, "utf-8");
19
+ }
20
+ catch (err) {
21
+ const message = err instanceof Error ? err.message : String(err);
22
+ log.warn(`Failed to write system prompt log: ${message}`);
23
+ }
24
+ }
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.24.0",
3
- "commit": "83d5e346e0e5015508f4c0771f27c53e03f49fa8",
4
- "builtAt": "2026-03-07T09:26:50.521Z"
2
+ "version": "1.26.0",
3
+ "commit": "8fe244579eb316eb5a817602d0853e9d3fdedddc",
4
+ "builtAt": "2026-03-07T13:34:48.450Z"
5
5
  }