Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
261 changes: 261 additions & 0 deletions .plan/build-adapter-skill.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,261 @@
# Plan: `build-adapter` skill for claude-mem

**Goal:** ship a claude-mem skill that, given any target agent/IDE/CLI, produces a merged-quality PR adding a claude-mem adapter for it — in one shot, with minimal user intervention.

**Deliverable:** `plugin/skills/build-adapter/SKILL.md` (single file, ~80 lines). Auto-discovered; no manifest edits.

**Design principle:** the skill is *not* a system. It is **one well-crafted prompt for `/claude-mem:make-plan`** that tells make-plan to run two Phase 0 research tracks in parallel. All the leverage is already in `make-plan` and `do` — this skill just hands them the right assignment.

---

## Why this shape

`make-plan` already:
- Deploys parallel Explore subagents for fact-gathering
- Forces every claim to cite sources (file:line / URL + quote)
- Synthesizes phased plans with verification checklists and anti-pattern guards

`do` already:
- Executes phased plans with fresh subagent contexts per phase
- Requires evidence, runs verification + code review
- Handles branching, committing, PR creation per the ship pattern

So `build-adapter` doesn't need its own workflow, reference files, templates, or interview. It needs to:
1. Tell make-plan to research **both** claude-mem's adapter contract **and** the target platform's extension API, in parallel
2. Pin the authoritative claude-mem source files as anchors
3. Name `src/cli/adapters/cursor.ts` as the copy-from template
4. Hand off to `do` for execution + PR

That's the entire skill.

---

## What the skill does, end-to-end

User types: `/build-adapter <TARGET>` (e.g., `/build-adapter zed`, `/build-adapter "codex CLI"`, `/build-adapter aider`).

1. Skill loads. Contains the dual-track research brief below.
2. Skill invokes `/claude-mem:make-plan` with the brief, substituting `<TARGET>`.
3. `make-plan` fires two Phase 0 subagents in parallel:
- **Track A** reads claude-mem source (adapter interface, HookInput, HTTP routes, DB schema, hook manifest pattern)
- **Track B** researches the target (WebSearch, WebFetch, mcp-deepwiki) for extension API, lifecycle events, tool-use format, session identity, prior art
4. `make-plan` synthesizes a phased implementation plan grounded in both tracks.
5. Skill shows the plan, asks user for approval.
6. On approval, skill invokes `/claude-mem:do` against the plan.
7. `do` writes `src/cli/adapters/<target>.ts`, registers it in `index.ts`, adds hook manifest if applicable, smoke-tests, commits, opens PR.

User appears at two gates: plan approval and PR merge. Everything else is automatic.

---

## Implementation phases

### Phase 0 — Discovery (already done)

The research grounding this plan is complete. Authoritative facts:

| Surface | Location | Role in adapter |
|---|---|---|
| `Adapter` interface | `src/cli/adapters/index.ts` | Normalizer + formatter contract every adapter implements |
Comment on lines +57 to +59
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Incorrect file reference for the Adapter interface.

Line 59 lists the Adapter interface location as src/cli/adapters/index.ts, but the PlatformAdapter interface is actually defined in src/cli/types.ts. The index.ts file contains only the registration pattern (the getPlatformAdapter function and exports), not the interface definition.

This is the same issue flagged in SKILL.md and should be corrected for consistency.

🔧 Proposed fix for the table
 | Surface | Location | Role in adapter |
 |---|---|---|
+| `PlatformAdapter` interface | `src/cli/types.ts:35–42` | Normalizer + formatter contract every adapter implements |
-| `Adapter` interface | `src/cli/adapters/index.ts` | Normalizer + formatter contract every adapter implements |
+| Registration pattern | `src/cli/adapters/index.ts` | getPlatformAdapter switch, imports, exports |
 | Best exemplars | `src/cli/adapters/cursor.ts`, `gemini-cli.ts` | Copy-from templates (NOT `claude-code.ts` — too special-cased) |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.plan/build-adapter-skill.md around lines 57 - 59, The table entry
incorrectly points to the export/registration file rather than where the
interface is declared; update the "Adapter" / "PlatformAdapter" table row so its
Location references the file that actually declares the PlatformAdapter
interface (the file that contains the PlatformAdapter type declaration), not the
file that only exports getPlatformAdapter/registration; ensure the table text
names PlatformAdapter (or Adapter) consistently and remove the misleading
reference to the registration file (where getPlatformAdapter is defined).

| Best exemplars | `src/cli/adapters/cursor.ts`, `gemini-cli.ts` | Copy-from templates (NOT `claude-code.ts` — too special-cased) |
| `HookInput` schema | `src/cli/hook-command.ts:79–81` | Canonical fields adapters must emit |
| Ingestion API | `src/services/worker/http/routes/SessionRoutes.ts:555–748` | `POST /api/sessions/observations`, `POST /api/sessions/summarize`, `GET /api/sessions/status` |
| DB schema | `src/services/sqlite/migrations.ts:217–296` | Tables adapter data ultimately lands in |
| Hook registration example | `plugin/hooks/hooks.json:1–96` | Reference manifest pattern |
| Skill conventions | `plugin/skills/{make-plan,do,mem-search}/SKILL.md` | Frontmatter: `name` + `description` only |
| PR convention | Recent `git log` | `feat(adapter): add <target> adapter` |

**Anti-patterns confirmed:**
- Don't edit `CHANGELOG.md` (auto-generated per `CLAUDE.md:94`)
- Don't add a skills-registry manifest (skills auto-discover from `plugin/skills/`)
- Don't populate `agent_id`/`agent_type` unless target has true subagents
- Don't `--no-verify` / `--amend` / force-push
- Don't invent endpoints beyond SessionRoutes

### Phase 1 — Write `SKILL.md`

**What to implement:** Create `plugin/skills/build-adapter/SKILL.md` with this exact shape:

```markdown
---
name: build-adapter
description: Use when the user wants claude-mem to work with a new agent, IDE,
or CLI (Cursor, Zed, Aider, Codex, custom agents, etc.). Researches both
claude-mem's adapter contract and the target platform's extension API in
parallel via make-plan, executes the plan via do, and opens a PR. Trigger
phrases: "add claude-mem support for X", "build a claude-mem adapter for X",
"integrate claude-mem with X", "make claude-mem work with X".
---

# build-adapter

## When to use
The user names a target agent, IDE, or CLI tool they want claude-mem to work
with. Examples: Zed, Aider, Codex CLI, Continue, a custom in-house agent.

## The one-shot

Invoke `/claude-mem:make-plan` with the brief below, **verbatim**, substituting
`<TARGET>` with the user's target platform name.

make-plan already knows how to orchestrate parallel Phase 0 discovery. This
brief tells it exactly what to research and what anchors to use.

## The brief (paste into make-plan)

> Build a claude-mem adapter for **<TARGET>**.
>
> **Deploy two Phase 0 discovery tracks in parallel.**
>
> ### Track A — claude-mem integration contract
>
> Explore subagent reads and reports file:line facts from:
> - `src/cli/adapters/index.ts` — the `Adapter` interface (normalizeInput,
> formatOutput, registration)
> - `src/cli/adapters/cursor.ts` and `src/cli/adapters/gemini-cli.ts` — use
> these as copy-from templates. Do NOT use `claude-code.ts` (too special-cased).
> - `src/cli/hook-command.ts` — canonical `HookInput` schema
> - `src/services/worker/http/routes/SessionRoutes.ts` — ingestion endpoints
> (`POST /api/sessions/observations`, `POST /api/sessions/summarize`,
> `GET /api/sessions/status`)
> - `src/services/sqlite/migrations.ts` — DB schema the adapter writes into
> - `plugin/hooks/hooks.json` — hook registration pattern (if the
> target has a hook mechanism)
>
> Report must include: exact `Adapter` TS interface, the `HookInput` field
> list, the three ingestion endpoints with request/response shapes, and a
> one-line diff between `cursor.ts` and `gemini-cli.ts` showing what varies
> between adapters.
>
> ### Track B — <TARGET> platform surface
>
> Research subagent uses `WebSearch`, `WebFetch`, and `mcp-deepwiki` (if
> <TARGET> is on GitHub) to report:
> - Extension/plugin/hook mechanism (name, registration location, config
> schema)
> - Lifecycle events it emits (session start, user message, tool use, session
> end)
> - Tool-use message format
> - Session identity — is there a stable session ID the adapter can read?
> - Working-directory / project-context propagation
> - Prior art — existing memory, observability, or logging plugins that
> already hook these events. Copy their patterns.
>
> Report must cite URLs + quoted snippets, not paraphrase. Reject and
> redeploy if the subagent returns conclusions without sources.
>
> ### Synthesis
>
> Plan the implementation as phases that COPY from `cursor.ts` and adjust
> only where Track B says <TARGET> diverges.
>
> - New file: `src/cli/adapters/<target>.ts`
> - Register in `src/cli/adapters/index.ts`
> - If <TARGET> has a hook mechanism, add a manifest under `plugin/` or the
> appropriate location, mirroring `plugin/hooks/hooks.json`
> - If <TARGET> has no hook mechanism, plan uses direct HTTP POSTs to the
> worker instead
> - Tests mirror in `tests/cli/adapters/<target>.test.ts` if test convention
> applies
>
> ### Anti-patterns (MUST NOT)
>
> - Don't invent endpoints not in `SessionRoutes.ts`
> - Don't populate `agent_id` / `agent_type` unless <TARGET> has true subagents
> - Don't edit `CHANGELOG.md` (auto-generated)
> - Don't add a skills-registry manifest
> - Don't `--no-verify` / `--amend` / force-push
> - Don't use `claude-code.ts` as the copy-from template
>
> ### Final phase
>
> - Smoke test: `npm run build-and-sync`, then POST a synthetic observation
> to `/api/sessions/observations`, confirm it lands via `GET /api/sessions/status`
> - `git checkout -b adapter/<target>`
> - Commit: `feat(adapter): add <target> adapter`
> - `gh pr create` against `main` with a body summarizing both research tracks
> and linking the key sources

## After make-plan returns

1. Show the user the plan. Wait for approval.
2. On approval, invoke `/claude-mem:do` on the plan.
3. `do` handles verification, commit, and PR creation per its own contract.

## Stop conditions

- Target has no documented extension API and no public repo → ask the user
for a docs URL before starting Track B
- Track B finds no session-ID mechanism → flag to user; a direct-HTTP
adapter may still be viable but needs explicit session-ID assignment
- `do` verification fails → do NOT open the PR; return control to user
```

**Documentation references:**
- Skill format: `plugin/skills/make-plan/SKILL.md:1–4` (frontmatter pattern)
- Description tone: skill-creator guidance — pushy, explicit triggers, multiple phrasings

**Verification:**
- `head -4 plugin/skills/build-adapter/SKILL.md` shows valid YAML frontmatter
- `wc -l plugin/skills/build-adapter/SKILL.md` ≤ 100
- `grep -c "file:line" plugin/skills/build-adapter/SKILL.md` ≥ 1 (keeps the subagents grounded)

**Anti-pattern guards:**
- Do NOT create `references/` or `templates/` subdirectories — the brief is self-contained
- Do NOT add `scripts/` — this skill runs no code
- Do NOT embed architecture content in the skill body — the brief points at source files, and the subagents read live source

### Phase 2 — Smoke-test against a real target

**What to implement:** run the skill end-to-end against one real target to confirm the one-shot actually works.

1. Pick a real target with solid public docs (suggest: Zed or Aider)
2. Invoke `/build-adapter <target>`
3. Observe that `make-plan` dispatches two Phase 0 subagents in parallel
4. Observe that the returned plan cites both claude-mem file:line anchors and target-docs URLs
5. Approve the plan
6. Observe that `do` writes `src/cli/adapters/<target>.ts`, registers it, and smoke-tests successfully
7. Observe that a PR is opened with the correct title and body

**Documentation references:** the brief inside `SKILL.md` is itself the spec being tested.

**Verification:**
- PR exists on GitHub with title `feat(adapter): add <target> adapter`
- `src/cli/adapters/<target>.ts` exists on the branch
- Registration in `src/cli/adapters/index.ts` is present
- Smoke-test log in the PR body shows a successful round-trip observation

**Anti-pattern guards:**
- Do NOT merge the smoke-test PR as part of verification — close it or leave it for human review
- Do NOT use `/claude-mem:do` against a fake or hypothetical target — use a real one

### Phase 3 — Ship the skill itself

**What to implement:**

1. Branch: `feat/build-adapter-skill`
2. Commit message: `feat: add build-adapter skill for building claude-mem adapters`
3. Push and `gh pr create` against `main` with body:
- Summary: what the skill does, how it leverages make-plan + do
- Test plan: manual checklist — invoke skill, observe parallel Phase 0, approve plan, observe do, observe PR
- Reference: link the smoke-test PR from Phase 2 as evidence the skill produces working adapters

**Documentation references:**
- PR convention: recent merged PRs like `97c7c999` and `2337997c`
- PR body HEREDOC pattern: `plugin/skills/claude-code-plugin-release/SKILL.md` (or `version-bump`)

**Verification:**
- PR opens, `claude-code-review` workflow triggers, CodeRabbit runs
- Address review feedback in additional commits (no amends)
- Merge only after human approval

**Anti-pattern guards:**
- Do NOT auto-merge
- Do NOT bump the claude-mem version for this PR — skill addition is non-breaking and versioning is a separate cut per convention
- Do NOT edit `CHANGELOG.md`

---

## Summary

Three phases. The skill is one file (~80 lines). Its runtime behavior is **invoke `make-plan` with a dual-track research brief → show plan → invoke `do` → PR opens**. Every architecture fact stays in live source; the skill only names anchors and rules. The magic comes from `make-plan` and `do` doing what they already do best — parallel research with citations, phased execution with verification — pointed at the right assignment.
112 changes: 112 additions & 0 deletions plugin/skills/build-adapter/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
---
name: build-adapter
description: Use when the user wants claude-mem to work with a new agent, IDE,
or CLI (Cursor, Zed, Aider, Codex, custom agents, etc.). Researches both
claude-mem's adapter contract and the target platform's extension API in
parallel via make-plan, executes the plan via do, and opens a PR. Trigger
phrases: "add claude-mem support for X", "build a claude-mem adapter for X",
"integrate claude-mem with X", "make claude-mem work with X".
---

# build-adapter

## When to use
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Add blank line above heading.

Markdown formatting convention requires blank lines surrounding headings.

📝 Proposed formatting fix
 description: Use when the user wants claude-mem to work with a new agent, IDE,
   or CLI (Cursor, Zed, Aider, Codex, custom agents, etc.). Researches both
   claude-mem's adapter contract and the target platform's extension API in
   parallel via make-plan, executes the plan via do, and opens a PR. Trigger
   phrases: "add claude-mem support for X", "build a claude-mem adapter for X",
   "integrate claude-mem with X", "make claude-mem work with X".
 ---
+
 # build-adapter
🧰 Tools
🪛 markdownlint-cli2 (0.22.0)

[warning] 13-13: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugin/skills/build-adapter/SKILL.md` at line 13, The "## When to use"
heading in SKILL.md is missing a blank line above it; add a single blank line
immediately before the line containing the heading "## When to use" so the
heading is separated from the previous paragraph/content to follow Markdown
convention.

The user names a target agent, IDE, or CLI tool they want claude-mem to work
with. Examples: Zed, Aider, Codex CLI, Continue, a custom in-house agent.

## The one-shot

Invoke `/claude-mem:make-plan` with the brief below, **verbatim**, substituting
`<TARGET>` with the user's target platform name.

make-plan already knows how to orchestrate parallel Phase 0 discovery. This
brief tells it exactly what to research and what anchors to use.

## The brief (paste into make-plan)

> Build a claude-mem adapter for **<TARGET>**.
>
> **Deploy two Phase 0 discovery tracks in parallel.**
>
> ### Track A — claude-mem integration contract
>
> Explore subagent reads and reports file:line facts from:
> - `src/cli/adapters/index.ts` — the `Adapter` interface (normalizeInput,
> formatOutput, registration)
Comment on lines +33 to +35
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Incorrect file reference for the Adapter interface.

Line 34 instructs Track A to read the Adapter interface from src/cli/adapters/index.ts, but the PlatformAdapter interface is actually defined in src/cli/types.ts (lines 35-42). The index.ts file only contains the registration pattern (getPlatformAdapter function) and imports the interface from ../types.js.

This will cause the Track A subagent to miss the actual interface contract (normalizeInput and formatOutput method signatures), which is critical for implementing a new adapter.

🔧 Proposed fix
 > Explore subagent reads and reports file:line facts from:
+> - `src/cli/types.ts` — the `PlatformAdapter` interface (normalizeInput,
+>   formatOutput signatures)
 > - `src/cli/adapters/index.ts` — the `Adapter` interface (normalizeInput,
->   formatOutput, registration)
+>   registration pattern (getPlatformAdapter function, exports)
 > - `src/cli/adapters/cursor.ts` and `src/cli/adapters/gemini-cli.ts` — use
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
> Explore subagent reads and reports file:line facts from:
> - `src/cli/adapters/index.ts` — the `Adapter` interface (normalizeInput,
> formatOutput, registration)
> Explore subagent reads and reports file:line facts from:
> - `src/cli/types.ts` — the `PlatformAdapter` interface (normalizeInput,
> formatOutput signatures)
> - `src/cli/adapters/index.ts` — the `Adapter` interface registration pattern (getPlatformAdapter function, exports)
> - `src/cli/adapters/cursor.ts` and `src/cli/adapters/gemini-cli.ts` — use
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugin/skills/build-adapter/SKILL.md` around lines 33 - 35, The documentation
points Track A to the wrong place for the Adapter contract; update the doc so it
references the actual interface name PlatformAdapter and its method signatures
normalizeInput and formatOutput instead of pointing to index.ts; specifically
mention that the interface is defined where PlatformAdapter is declared
(imported into the adapter registration code which contains getPlatformAdapter)
so the subagent reads PlatformAdapter to obtain the normalizeInput/formatOutput
signatures rather than the registration-only file.

> - `src/cli/adapters/cursor.ts` and `src/cli/adapters/gemini-cli.ts` — use
> these as copy-from templates. Do NOT use `claude-code.ts` (too special-cased).
> - `src/cli/hook-command.ts` — canonical `HookInput` schema
> - `src/services/worker/http/routes/SessionRoutes.ts` — ingestion endpoints
> (`POST /api/sessions/observations`, `POST /api/sessions/summarize`,
> `GET /api/sessions/status`)
> - `src/services/sqlite/migrations.ts` — DB schema the adapter writes into
> - `plugin/hooks/hooks.json` — hook registration pattern (if the
> target has a hook mechanism)
>
> Report must include: exact `Adapter` TS interface, the `HookInput` field
> list, the three ingestion endpoints with request/response shapes, and a
> one-line diff between `cursor.ts` and `gemini-cli.ts` showing what varies
> between adapters.
>
> ### Track B — <TARGET> platform surface
>
> Research subagent uses `WebSearch`, `WebFetch`, and `mcp-deepwiki` (if
> <TARGET> is on GitHub) to report:
> - Extension/plugin/hook mechanism (name, registration location, config
> schema)
> - Lifecycle events it emits (session start, user message, tool use, session
> end)
> - Tool-use message format
> - Session identity — is there a stable session ID the adapter can read?
> - Working-directory / project-context propagation
> - Prior art — existing memory, observability, or logging plugins that
> already hook these events. Copy their patterns.
>
> Report must cite URLs + quoted snippets, not paraphrase. Reject and
> redeploy if the subagent returns conclusions without sources.
>
> ### Synthesis
>
> Plan the implementation as phases that COPY from `cursor.ts` and adjust
> only where Track B says <TARGET> diverges.
>
> - New file: `src/cli/adapters/<target>.ts`
> - Register in `src/cli/adapters/index.ts`
> - If <TARGET> has a hook mechanism, add a manifest under `plugin/` or the
> appropriate location, mirroring `plugin/hooks/hooks.json`
> - If <TARGET> has no hook mechanism, plan uses direct HTTP POSTs to the
> worker instead
> - Tests mirror in `tests/cli/adapters/<target>.test.ts` if test convention
> applies
>
> ### Anti-patterns (MUST NOT)
>
> - Don't invent endpoints not in `SessionRoutes.ts`
> - Don't populate `agent_id` / `agent_type` unless <TARGET> has true subagents
> - Don't edit `CHANGELOG.md` (auto-generated)
> - Don't add a skills-registry manifest
> - Don't `--no-verify` / `--amend` / force-push
> - Don't use `claude-code.ts` as the copy-from template
>
> ### Final phase
>
> - Smoke test: `npm run build-and-sync`, then POST a synthetic observation
> to `/api/sessions/observations`, confirm it lands via `GET /api/sessions/status`
> - `git checkout -b adapter/<target>`
> - Commit: `feat(adapter): add <target> adapter`
Comment on lines +73 to +96
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 <target> slug normalization not specified

The brief uses <TARGET> (the raw user-provided name) for display contexts and switches to <target> (lowercase) only for file/branch names — but never tells the executing AI how to normalize. For multi-word inputs like "Codex CLI" or "Continue.dev", the unguided AI may emit src/cli/adapters/Codex CLI.ts (space in filename) or branch adapter/Codex CLI (space in git ref), both of which are invalid.

Consider adding a one-line normalization rule at the top of the Synthesis section:

> ### Synthesis
>
> Normalize the target name to a lowercase slug (spaces → hyphens, strip non-alphanumeric except hyphens)
> and use that slug everywhere a filename or git ref is needed. Example: "Codex CLI" → `codex-cli`.
>
> Plan the implementation as phases…

Fix in Claude Code

> - `gh pr create` against `main` with a body summarizing both research tracks
> and linking the key sources

## After make-plan returns

1. Show the user the plan. Wait for approval.
2. On approval, invoke `/claude-mem:do` on the plan.
3. `do` handles verification, commit, and PR creation per its own contract.

## Stop conditions

- Target has no documented extension API and no public repo → ask the user
for a docs URL before starting Track B
- Track B finds no session-ID mechanism → flag to user; a direct-HTTP
adapter may still be viable but needs explicit session-ID assignment
- `do` verification fails → do NOT open the PR; return control to user
Comment on lines +106 to +112
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 No stop condition for missing target argument

The three existing stop conditions handle runtime research failures, but there's no guard for the trivially broken case where the user invokes /build-adapter with no argument. In that state <TARGET> passes through literally to make-plan, producing a prompt about building an adapter for the string "<TARGET>".

A short pre-flight check would close this gap:

Suggested change
## Stop conditions
- Target has no documented extension API and no public repo → ask the user
for a docs URL before starting Track B
- Track B finds no session-ID mechanism → flag to user; a direct-HTTP
adapter may still be viable but needs explicit session-ID assignment
- `do` verification fails → do NOT open the PR; return control to user
## Stop conditions
- No target argument provided → reply "Usage: `/build-adapter <target>` — please specify the agent, IDE, or CLI name." and stop.
- Target has no documented extension API and no public repo → ask the user
for a docs URL before starting Track B
- Track B finds no session-ID mechanism → flag to user; a direct-HTTP
adapter may still be viable but needs explicit session-ID assignment
- `do` verification fails → do NOT open the PR; return control to user

Fix in Claude Code

Loading