Skip to content

Auto-name projects + declutter the file list#2

Merged
deehw merged 2 commits into
mainfrom
feat/project-naming-and-file-list
Jun 2, 2026
Merged

Auto-name projects + declutter the file list#2
deehw merged 2 commits into
mainfrom
feat/project-naming-and-file-list

Conversation

@deehw

@deehw deehw commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Two related project-UX fixes, one commit each.

1. Auto-name projects from the first plan turn

Projects stayed "New project" forever: project_list waits for Claude Code's ai-title lines, which headless claude -p never writes. Now Panda generates the title itself — on the plan phase, a quick isolated claude -p call turns the first message into a short title and writes it to project.json just before TurnEnd (where the frontend already refreshes). Default model (no --model) so a future proxy can route it. Verified live: "New project" → "Macbook Riser With Airflow Holes".

2. Declutter the file list + fix empty vendored cadpy

A single part surfaced ~9 files. Now scan_workspace hides auxiliary files (.json sidecars, .png renders, underscore .py helpers) so the list shows only the mains: source .py + .step/.stl/.glb. Sibling/sidecar resolution still works (reads disk).

Root cause of the temps: the vendored cadpy ships empty (nothing ran build-skill-runtimes.sh), so the cadcode generator falls back to hand-written _export.py/_render.py + QA PNGs. Wired the vendor step into dev.sh + build-app.sh (with an empty-cadpy guard), and fixed the vendor script's rsync --delete deleting the tracked .gitignore.

Note: in dev the host python3 also lacks cadpy's deps (OCP/trimesh/pygltflib) — the model used uv run --with. Clean generation fully lands in packaged builds (Python sidecar); the catalog change hides temps regardless.

Tests

cargo test → 94 passed, 0 failed (incl. new hides_helper_scripts_renders_and_sidecars, sanitize_title, needs_autoname, set_name_if_placeholder).

🤖 Generated with Claude Code

deehw and others added 2 commits June 2, 2026 17:30
Headless `claude -p` never writes Claude Code's own `ai-title` lines, so
`project_list`'s self-heal reader never fired and every project stayed
"New project". Generate a title ourselves: on the plan phase, a quick
isolated `claude -p` call (no session/tools, default model so a future
proxy can route it) turns the first message into a short title, written
to project.json just before TurnEnd where the frontend already refreshes.

- project.rs: needs_autoname + set_name_if_placeholder helpers (re-check
  guards against clobbering a real name / double-writes).
- claude_driver.rs: sanitize_title (pure) + generate_project_title
  (20s cap, best-effort), kicked off concurrently and landed before
  TurnEnd. Adds an ignored live end-to-end test.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
A single part surfaced ~9 files (helper scripts, QA render PNGs, JSON
sidecars) in the file list. Two fixes:

- catalog.rs: scan_workspace now skips auxiliary files (.json sidecars,
  .png renders, underscore-prefixed .py helpers) so the list shows only
  the main deliverables (source .py + .step/.stl/.glb). path_index still
  covers every file, so .step->.py sibling detection and sidecar artifact
  URLs resolve from disk. Adds a test.

- Root cause of the temps: the vendored cadpy ships empty (nothing ran
  build-skill-runtimes.sh), so the cadcode generator can't run and the
  model hand-writes _export.py/_render.py + QA PNGs. Wire the vendor step
  into dev.sh and build-app.sh (with an empty-cadpy guard), and fix the
  vendor script's rsync --delete nuking the tracked .gitignore.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@deehw deehw merged commit 82f6820 into main Jun 2, 2026
3 checks passed
@deehw deehw deleted the feat/project-naming-and-file-list branch June 2, 2026 10:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant