v0.7.0
v0.7.0 - 2026-06-12
Changed
- The coding-agent prompt now comes at the end of setup — after your first pipeline run — and the agent's AI workbench files are laid down as the final step, so you see the pipeline work before picking your editor. Passing
--agentstill skips the prompt. (Internally, the two-phase plan/execute split was collapsed into a single linear flow.) - A non-empty target no longer stops with a "Directory not empty" error. Instead
dlthub-startscaffolds into a free directory and tells you where it landed: with no argument it initializes in the current directory when empty, otherwise into aplaygroundsubdirectory (playground-1,playground-2, … if that's taken too); an explicit name that's occupied falls back to<name>-1,<name>-2, …. The original directory's contents are never touched. (TheWorkspaceDirectoryNotEmptyError/ exit-code-2path remains only as a defensive guard against races.) - A directory that holds only benign cruft — editor/OS files (
.idea,.vscode,.DS_Store,Thumbs.db), tool caches (__pycache__,.ruff_cache,.mypy_cache,.pytest_cache), and a bare.git— now counts as empty, so a freshlygit init'd or IDE-touched directory still initializes in place instead of falling back. Anything the scaffold itself ships (e.g..gitignore,.dlt) still counts as content, so the user's copy is never clobbered. - The first pipeline run now streams its
--followlogs live instead of hiding them behind a spinner. The step flags a "streaming live logs" note, then prints the run's output line by line — recolored uniformly (dim cyan) so it reads as nested, live output. A spinner and streamed output can't share the terminal (Rich's live spinner fights the child for the cursor), so the spinner is dropped for this step; the run always streams regardless of--verbose. --yes/-yand--skip-uv-syncare now hidden, non-interactive shortcuts for tests/CI only — both are removed from--helpand print a stderr notice when used, because they cut the guided setup short (--yesskips the prompts and the first run;--skip-uv-syncalso skips dependency sync), leaving the workspace scaffolded but never run. The interactive flow (no flag) is now the only documented path. The flags still work when explicitly passed, so nothing breaks for automated callers.- Bumped
dlthub-clientfrom0.27.6to0.27.7in the minimal workspace'suv.lock. - The post-setup panel is trimmed to the hand-off: after the first run it shows the prompt to give your agent (with a "copied to your clipboard" confirmation) and a link to the docs — nothing else. The "Created" file tree now prints during scaffolding (right under
Created <dir>) instead of in the final panel. The bundled workspaceREADME.mdis now a few lines so it doesn't compete with the guided flow. - The agent picker labels
codexascodex (or other agents, e.g. Copilot)since its.agents/layout is a cross-agent convention. - Improved the styling and wording of the guided setup output to make the flow clearer.
- Hardened error handling: unexpected failures now print a one-line message (full traceback only with
--verbose) instead of a raw stack trace; filesystem problems while creating the workspace reportCouldn't read/write <path>; and best-effort steps degrade gracefully — a failed first pipeline run, an agent with no terminal launcher, or a clipboard miss now warn and continue instead of aborting setup. (Known gap: a remote run that fails but exits 0 still reports success — tracked for a follow-up.)
Added
- After laying down its workbench files,
dlthub-startnow launches your chosen coding agent right in the workspace — seeded with the starter promptBuild a dlt pipeline for the [API name] API and load [endpoint/data] into DuckDB.— so you land in a session with the skills and MCP server already in scope. Claude and Codex launch via their CLIs (claude/codex); an agent with no terminal launcher (e.g. the Cursor app) falls back to printing that prompt and copying it to your clipboard. Skipped under--yes, since the launch is interactive. - The minimal workspace now ships a committed
uv.lock, souv syncinstalls from pinned versions instead of resolving against the PyPI index on every workspace creation — faster, reproducible, and resilient to intermittentpypi.org/simple/outages. Renaming a generated workspace rewrites the root package name inuv.lockin lock-step withpyproject.toml, so the two never diverge — otherwise uv would treat the bundled lock as out of date and fall back to a full re-resolution againstpypi.org/simple/, defeating the purpose of shipping the lock.