feat: Read My Mind phase 1, per-case intent profiles (capture + API + skill)

Per-case profiles of user intent (docs/readmymind-plan.md): user-stated goals
plus the user's recently submitted prompts, captured from the Claude session
transcript behind the new synced readMyMindEnabled setting (default OFF).

- intent-store.ts: keyed by owner + realpath(workingDir), FIFO/size caps,
  consecutive-dupe collapse, atomic 0600 writes to ~/.codeman/intents.json
- transcript-watcher.ts: new transcript:user_prompt event for typed user turns
  (tool_result-only entries stay silent); capture wiring in server.ts is
  claude-only and gated on the setting per event
- readmymind-routes.ts: GET/PUT/DELETE /api/sessions/:id/intent, ownership
  via findSessionOrFail, strict Zod schema
- agent skill: SKILL.md recipe + endpoints.md rows so agents can read and
  record intent (PUT replaces: read + merge; never delete unprompted)
- groundwork for the phase-2 predictor button; nothing is ever auto-sent

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Codeman maintainer
2026-08-09 18:03:13 +02:00
parent 3533c4332b
commit 161f1da2eb
17 changed files with 983 additions and 4 deletions
+18
View File
@@ -392,6 +392,24 @@ is parked resolves it within ~3 s. A session deleted mid-wait resolves in ~1 s.
delete_session "$SID"
```
**Read My Mind: read and record the user's intent.** Each case has an intent
profile: user-stated goals plus the user's recent real prompts (captured
server-side while the opt-in `readMyMindEnabled` setting is on). Read it to
ground your work in what the user actually wants; write it when the user states
an intention worth remembering ("the goal is shipping 1.17"):
```bash
"${CURL[@]}" "$API/api/v1/sessions/$SELF/intent" | jq '.data.intent'
"${CURL[@]}" -X PUT -H 'Content-Type: application/json' \
-d '{"goals":"shipping 1.17; mobile polish next"}' "$API/api/v1/sessions/$SELF/intent"
```
⚠️ PUT **replaces** the whole goals text: read it first and merge, never
blind-write. Never write goals the user did not state, and never delete the
profile (`DELETE .../intent`) unless the user asks: it is their memory, not
yours. Older servers 404 these routes; treat that as "feature absent", not an
error.
Everything else (endpoint tables, per-mode signal table, error codes, capacity
limits, Docker/remote caveats): [reference/endpoints.md](reference/endpoints.md).
Fan-out orchestration and blocked-worker handling: