bug: UserTask nicht gespeichert - TaskCreate Hook erfasst taskId nicht aus toolOutput #316

Closed
opened 2026-01-25 19:17:34 +00:00 by jack · 0 comments
Owner

Problem

Die user_tasks Tabelle bleibt leer, obwohl Claude Code's TaskCreate/TaskUpdate Tools verwendet werden.

Root Cause

Der TaskCreate Hook in packages/hooks/src/handlers/post-tool-use.ts (Zeile 241-252) parst nur den toolInput, aber die taskId wird von Claude Code im toolOutput zurückgegeben:

// Aktueller Code (packages/hooks/src/handlers/post-tool-use.ts:241-252)
if (input.toolName === 'TaskCreate') {
  const createInput = taskInput as TaskCreateInput;  // ← Nur Input!
  await client.post('/api/hooks/user-task/create', {
    sessionId: input.sessionId,
    project: input.project,
    title: createInput.subject,
    description: createInput.description,
    activeForm: createInput.activeForm,
    workingDirectory: input.cwd,
    gitBranch,
    sourceMetadata: createInput.metadata,
    // ⚠️ FEHLT: externalId aus toolOutput!
  });
}

Erwartetes Verhalten

  1. TaskCreate wird aufgerufen mit Input: { subject: "Fix bug", description: "..." }
  2. Claude Code gibt Output zurück: { taskId: "1", ... }
  3. Unser Hook sollte die taskId aus dem Output extrahieren
  4. UserTask wird mit externalId: "1" gespeichert
  5. TaskUpdate kann später den Task via externalId finden und updaten

Aktuelles Verhalten

  1. TaskCreate wird aufgerufen
  2. Hook ignoriert das toolOutput komplett
  3. UserTask wird ohne externalId erstellt (oder gar nicht, wenn Backend Fehler macht)
  4. TaskUpdate sucht nach external_id = "1" → Nicht gefunden
  5. Es wird entweder ein neuer Task erstellt oder die Update-Operation schlägt still fehl

Betroffene Dateien

  • packages/hooks/src/handlers/post-tool-use.ts - Hook muss toolOutput parsen
  • packages/backend/src/routes/hooks.ts - Backend erwartet bereits externalId

Lösungsansatz

// In post-tool-use.ts:
if (input.toolName === 'TaskCreate') {
  const createInput = JSON.parse(input.toolInput) as TaskCreateInput;
  
  // NEU: Parse toolOutput um taskId zu extrahieren
  let externalId: string | undefined;
  try {
    const output = JSON.parse(input.toolOutput || '{}');
    externalId = output.taskId;
  } catch {
    // toolOutput nicht verfügbar oder nicht parsbar
  }
  
  await client.post('/api/hooks/user-task/create', {
    sessionId: input.sessionId,
    project: input.project,
    externalId,  // ← NEU
    title: createInput.subject,
    // ...
  });
}

Backend-Anpassung

Die Backend-Route muss auch externalId beim Create akzeptieren:

// In hooks.ts userTaskCreate():
const task = await this.deps.userTasks.create({
  externalId,  // ← Hinzufügen
  project,
  title,
  // ...
});

Priorität

Hoch - Feature ist komplett kaputt, keine Tasks werden gespeichert.

Bezug

  • Issue #260 (User Task Tracking Feature)
## Problem Die `user_tasks` Tabelle bleibt leer, obwohl Claude Code's `TaskCreate`/`TaskUpdate` Tools verwendet werden. ### Root Cause Der `TaskCreate` Hook in `packages/hooks/src/handlers/post-tool-use.ts` (Zeile 241-252) parst nur den `toolInput`, aber die `taskId` wird von Claude Code im **`toolOutput`** zurückgegeben: ```typescript // Aktueller Code (packages/hooks/src/handlers/post-tool-use.ts:241-252) if (input.toolName === 'TaskCreate') { const createInput = taskInput as TaskCreateInput; // ← Nur Input! await client.post('/api/hooks/user-task/create', { sessionId: input.sessionId, project: input.project, title: createInput.subject, description: createInput.description, activeForm: createInput.activeForm, workingDirectory: input.cwd, gitBranch, sourceMetadata: createInput.metadata, // ⚠️ FEHLT: externalId aus toolOutput! }); } ``` ### Erwartetes Verhalten 1. `TaskCreate` wird aufgerufen mit Input: `{ subject: "Fix bug", description: "..." }` 2. Claude Code gibt Output zurück: `{ taskId: "1", ... }` 3. **Unser Hook sollte die `taskId` aus dem Output extrahieren** 4. UserTask wird mit `externalId: "1"` gespeichert 5. `TaskUpdate` kann später den Task via `externalId` finden und updaten ### Aktuelles Verhalten 1. `TaskCreate` wird aufgerufen 2. Hook ignoriert das `toolOutput` komplett 3. UserTask wird **ohne** `externalId` erstellt (oder gar nicht, wenn Backend Fehler macht) 4. `TaskUpdate` sucht nach `external_id = "1"` → Nicht gefunden 5. Es wird entweder ein neuer Task erstellt oder die Update-Operation schlägt still fehl ### Betroffene Dateien - `packages/hooks/src/handlers/post-tool-use.ts` - Hook muss `toolOutput` parsen - `packages/backend/src/routes/hooks.ts` - Backend erwartet bereits `externalId` ### Lösungsansatz ```typescript // In post-tool-use.ts: if (input.toolName === 'TaskCreate') { const createInput = JSON.parse(input.toolInput) as TaskCreateInput; // NEU: Parse toolOutput um taskId zu extrahieren let externalId: string | undefined; try { const output = JSON.parse(input.toolOutput || '{}'); externalId = output.taskId; } catch { // toolOutput nicht verfügbar oder nicht parsbar } await client.post('/api/hooks/user-task/create', { sessionId: input.sessionId, project: input.project, externalId, // ← NEU title: createInput.subject, // ... }); } ``` ### Backend-Anpassung Die Backend-Route muss auch `externalId` beim Create akzeptieren: ```typescript // In hooks.ts userTaskCreate(): const task = await this.deps.userTasks.create({ externalId, // ← Hinzufügen project, title, // ... }); ``` ### Priorität **Hoch** - Feature ist komplett kaputt, keine Tasks werden gespeichert. ### Bezug - Issue #260 (User Task Tracking Feature)
jack closed this issue 2026-01-25 20:08:49 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Reference
customable/claude-mem#316
No description provided.