Files
better-claude-config/HANDOFF.md
T
AJ e0eb3c2d1b
CI / Lint (ruff) (push) Successful in 7s
CI / Tests (py3.10) (push) Successful in 7s
CI / Tests (py3.12) (push) Successful in 7s
docs: add HANDOFF.md — backlog workflow for local agent + Gitea supervision
2026-07-02 00:35:46 -04:00

87 lines
4.8 KiB
Markdown

# HANDOFF — BCC feature backlog implementation
For the Claude Code agent working in this repo. Read this whole file, then
CLAUDE.md, before touching code. A supervising Claude session watches this
project through the Gitea MCP (issues, PRs, CI runs on git.avezzano.io), so
keep all state in Gitea where it can be seen: issues for work items, PRs for
changes, comments for decisions.
## Step 0 — sync state
`main` may contain local commits that aren't on origin yet (the previous
session couldn't push). Run `git status` / `git log origin/main..main`; if
there are unpushed commits, **push them first** and confirm CI goes green
before starting anything.
## Step 1 — file the backlog as issues
Create one Gitea issue per item in the backlog table below (`tea` CLI or the
API — you have full credentials). Prefix titles with the ID (e.g.
"[#2] Stdio server spawn-test"). Create labels P0/P1/P2 first if they don't
exist. Copy each item's full section from `../bcc-feature-requests.md`
(sibling of this repo folder) into the issue body — it has problem statements,
evidence, proposed fixes, and acceptance criteria.
**Corrections to that document — do not re-implement:**
- "Doc correction: README Claude Code path" — DONE (commit `b16c0fd`).
- Item 1 (secret masking) — MOSTLY DONE (commit `6dee318`): env/header values
masked via delegate + Show-secrets toggle, Add-dialog password echo,
diagnostics args redaction (`redact_args`). **Only remainder:** the warning
badge when a secret-shaped value sits in `args` instead of `env`. File the
issue scoped to just that.
## Step 2 — work the backlog
| Order | ID | Item | Priority | Notes |
|---|---|---|---|---|
| 1 | 2 | Stdio server spawn-test | P0 | Spawn with timeout, capture stderr; core logic in bcc_core (GUI-free, testable) |
| 2 | 3 | Backup restore UI | P0 | List `.bcc_backups/`, preview/diff, restore through normal atomic-write path |
| 3 | 4 | Stale-file protection | P0 | mtime/hash at load, re-check before write, prompt on conflict |
| 4 | 1r | Secret-in-args warning badge | P0 | Remainder of item 1; `is_secret_key`/`_is_secret_value` already exist in bcc_core |
| 5 | 8 | Duplicate-name conflict on paste/import | P1 | VERIFY FIRST: check `paste_json`/`dropEvent` in bcc.py for silent overwrite; file findings on the issue before coding |
| 6 | 5 | Cross-client support (Cursor/Windsurf/VS Code) | P1 | VS Code uses `servers` not `mcpServers` — needs a read/write adapter, not just paths |
| 7 | 6 | In-app MCP log viewer | P1 | Platform log paths in the doc |
| 8 | 7 | Windows MSIX path detection | P1 | Can't test locally on macOS — unit-test the detection logic, note that in the PR |
| 9 | 9 | Restart Claude Desktop button | P1 | Platform-specific process handling; scope to Desktop only |
| 10 | 10 | Server catalog / one-click add | P2 | Design pass first — post a proposal as an issue comment before building |
## Workflow rules
- **Branch per issue** off `main`: `feat/<issue-number>-short-slug` (or
`fix/`). One issue per PR. Reference the issue in the PR description
(`Closes #N`).
- **Before every commit:** `python -m pytest` (all green), `ruff check .`,
`ruff format .`. CI enforces all three.
- **Conventional commits** (`feat:`, `fix:`, `test:`, `docs:`, `chore:`) —
match the existing history's style: body explains the why.
- **Merge only with green CI.** If the supervising session has flagged
something on the PR, resolve it before merging.
## Architecture guardrails (violating these fails review)
1. **The cardinal rule:** config writes only ever touch `mcpServers` and
`_disabledMcpServers`. Every other key is preserved verbatim, in order.
This matters extra for `~/.claude.json`, which holds conversation history
and project state.
2. **Core/GUI split:** all logic in `bcc_core.py` (no GUI imports, unit-
testable); `bcc.py` stays a thin PySide6 shell. New logic gets tests in
`tests/` — they run without PySide6, keep it that way.
3. **No new runtime dependencies** without posting the justification on the
issue first. PySide6 is currently the only one.
4. **Writes are atomic + backed up** — route any new disk writes through
`write_config()`.
5. Secrets never appear in diagnostics output or logs — use `redact_args`/
`is_secret_key` from bcc_core.
## Current state (as of this handoff)
- 58 tests in `tests/`, ruff clean, CI = lint + pytest (py3.10/3.12) on push/PR.
- Recent features you should know exist: lenient JSON repair
(`repair_json_text`, `parse_pasted_json_verbose`, `repair_config_file` +
RepairDialog), ArgsEdit numbered gutter + `split_suspicious_args`,
resizable splitters with QSettings persistence, secret masking, Claude Code
profile at `~/.claude.json` (settings.json only as "legacy" when it holds
parked servers).
- GUI can't be smoke-tested in CI; note in each PR whether you ran
`python bcc.py` locally and what you checked.