Skip to content
ttorta docs

Release Notes

0.6.0

Adoption shipped: point torta at a Flutter app you already have, and the wizard opens on a door.


Published as torta-app and torta-ai 0.6.0.

This page describes 0.6.0 as it shipped. Adoption was reshaped in 0.7.0: the Flutter gate, the platform question, the consent step and --inspect are all gone. Read that page for how adoption works now.

The wizard opens on a door

Page one now asks what are we setting up?, and there are two answers: something new, or a folder that already has code in it. Creating is seven pages (the door, the same five questions, the summary) in the same order it always was. Adopting is nine: what is in that folder, which is a read, and which platform does each app build are inserted after the location.

One flat list of pages carries both doors. Each page names the door it belongs to, and one function reads that, so a page belonging to the other door is not hidden: it is not in the flow, and cannot be counted, stepped onto or validated.

torta adopt

The command that was reserved and exited 2 is built. Point it at a Flutter app you already have and that folder becomes the workspace root, with the app moved under .projects/frontend/ carrying its own repository, history and remote.

Start with the flag that writes nothing:

torta adopt ~/Documents/projects/my-flutter-app --dry-run

It prints what moves and where to, what stays where it is, what is already there and how it will be kept, which repository is reused, and the command that reverses all of it. The wizard’s summary page shows the same answer from the same function, so the two doors cannot disagree.

  • Nothing is copied and nothing is rewritten. One rename per entry, journalled before it happens, .git last, verified afterwards, rolled back whole on any failure, and resumable with --resume if it is interrupted.
  • Nothing is deleted on this path, ever. The delete that removes a half-made new workspace is unreachable from adoption, and a test holds that shape.
  • Nothing already in the folder is overwritten. .gitignore and CLAUDE.md take a marked section that leaves your lines alone; a name torta will not touch is skipped; anything else keeps both copies with a pointer to the one in force.
  • ADOPTED.md records every move, every merge, every kept-both copy, every app left alone, and the command that reverses it. torta adopt <dir> --undo is that command, and it now works.

Where an adopted app lands

One rule, settled in the engine and obeyed by both doors. One app on its own is kept whole in frontend/core, which is the tree torta init would have built. Several split by platform into mobile, web and desktop, at most one app each, and core stays empty.

Declining is an answer, not a gap. An app given --as none, or the last option on the wizard’s assign page, is left exactly where it is: not moved, not written into, given no repository. The dry run, the summary and ADOPTED.md each name it. At least one app still has to be adopted.

Reading a folder costs nothing

The probes are local: a bounded directory walk, a pubspec.yaml read line by line, a handful of git questions. They classify a folder as exactly one of flutter, not-flutter, empty or unclear, and they start no session and spend nothing.

--inspect, or the wizard’s button, reads a folder the probes cannot settle with a Claude Code session on your own login. It prints what that costs and asks first, and it refuses without a terminal rather than take consent from a script. Its answer is advisory: it may narrow the one undecided verdict, and it authorises no move.

Said out loud rather than left silent

Flutter only, for now. Anything else is refused by name, and the refusal says what it actually found, before a file is touched. android/ moves with the code and torta will not build or ship it, which the found page, the dry run and ADOPTED.md each say. A dirty working tree is a warning rather than a refusal, and it is recorded in the report.

See adopt a project and the CLI reference.