Skip to content

v0.7.0

Choose a tag to compare

@bjoaquinc bjoaquinc released this 14 Jun 13:11
· 35 commits to devel since this release

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 --agent still 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-start scaffolds into a free directory and tells you where it landed: with no argument it initializes in the current directory when empty, otherwise into a playground subdirectory (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. (The WorkspaceDirectoryNotEmptyError / exit-code-2 path 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 freshly git 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 --follow logs 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/-y and --skip-uv-sync are now hidden, non-interactive shortcuts for tests/CI only — both are removed from --help and print a stderr notice when used, because they cut the guided setup short (--yes skips the prompts and the first run; --skip-uv-sync also 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-client from 0.27.6 to 0.27.7 in the minimal workspace's uv.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 workspace README.md is now a few lines so it doesn't compete with the guided flow.
  • The agent picker labels codex as codex (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 report Couldn'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-start now launches your chosen coding agent right in the workspace — seeded with the starter prompt Build 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, so uv sync installs from pinned versions instead of resolving against the PyPI index on every workspace creation — faster, reproducible, and resilient to intermittent pypi.org/simple/ outages. Renaming a generated workspace rewrites the root package name in uv.lock in lock-step with pyproject.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 against pypi.org/simple/, defeating the purpose of shipping the lock.