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,
.gitlast, verified afterwards, rolled back whole on any failure, and resumable with--resumeif 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.
.gitignoreandCLAUDE.mdtake 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.mdrecords every move, every merge, every kept-both copy, every app left alone, and the command that reverses it.torta adopt <dir> --undois 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.