Tracking issue for the findings from an unassisted run of seamless init by an agent with no
prior knowledge of the CLI. The verdict was that the tool is drivable only because the source
was available to read: the prompt sequence, the option ordering, and the alias names all had
to come from src/prompts/projectSetup.ts and registry.json. Without that checkout it is a
hard CLI to drive.
What worked, and should not regress
- Errors from
whoami and apps list name the exact command to run next, which is what let
a logged-out state get detected up front instead of halfway through a prompt sequence.
- Every
(recommended) option is also the initialValue or the first option, so a blind
Enter produces the right answer.
discard() plus the SIGINT handler means a half-built scaffold does not block a retry.
- The success output gives exact URLs, exact next steps, and calls out the
OWNER_EMAIL-must-change-before-registering caveat explicitly.
The list
All of it is on main and queued for release in #121 (0.11.0).
What the CLI looks like now
The scenario that opened this issue, driven with no source checkout:
seamless templates list # discover the starters and their flags
seamless init my-app --local --yes \
--email=you@example.com --react-vite --express
Runs unattended, with no pty. Every question has a flag, unspecified values take the
recommended option, and the destructive steps (writing over a non-empty directory, rotating a
service token) still require --force rather than being swept up by --yes. Nothing renders a
prompt to a pipe: every command stops naming the flag that answers the question.
Known limits
Tracking issue for the findings from an unassisted run of
seamless initby an agent with noprior knowledge of the CLI. The verdict was that the tool is drivable only because the source
was available to read: the prompt sequence, the option ordering, and the alias names all had
to come from
src/prompts/projectSetup.tsandregistry.json. Without that checkout it is ahard CLI to drive.
What worked, and should not regress
whoamiandapps listname the exact command to run next, which is what leta logged-out state get detected up front instead of halfway through a prompt sequence.
(recommended)option is also theinitialValueor the first option, so a blindEnter produces the right answer.
discard()plus the SIGINT handler means a half-built scaffold does not block a retry.OWNER_EMAIL-must-change-before-registering caveat explicitly.The list
-h/--helpin every command ahead of its own argument parsing. Shipped in feat: add per-command help #148.seamless templates list [--json], so ids, aliases, and kinds are discoverablewithout a source checkout. Shipped in feat: make init template flags discoverable and validated up front #155.
--react-vitealongside--basic), and givethe api templates a flag at all. Shipped in feat: make init template flags discoverable and validated up front #155.
unrecognized flag routes through an overwrite confirmation on its way to an error.
Shipped in feat: make init template flags discoverable and validated up front #155.
seamless init --yeswith full flag coverage. Shipped in feat: add a non-interactive seamless init #156.initruns without an interactive terminal. Shipped in feat: fail fast when init has no terminal to prompt on #158(feat: fail fast when init has no terminal to prompt on #157 merged into its stacked base rather than
main, so it was re-landed).--force(aliases--yes,-y) answering the destructive confirmations. Shipped in feat: extend the no-terminal guard to every command that prompts #160.All of it is on
mainand queued for release in #121 (0.11.0).What the CLI looks like now
The scenario that opened this issue, driven with no source checkout:
seamless templates list # discover the starters and their flags seamless init my-app --local --yes \ --email=you@example.com --react-vite --expressRuns unattended, with no pty. Every question has a flag, unspecified values take the
recommended option, and the destructive steps (writing over a non-empty directory, rotating a
service token) still require
--forcerather than being swept up by--yes. Nothing renders aprompt to a pipe: every command stops naming the flag that answers the question.
Known limits
loginhas no flag form, since it does not exist until the code issent.
loginis not fully scriptable, which is inherent to OTP.--admin=source([P1]adminMode: "source"scaffolds a broken stack —admin/is never created #82) and--auth=local([P2] "Enable Docker?" confirm is ignored; non-docker success output is unreachable #92) now have flags, but the underlying behavioris still broken. The flags will follow whatever those issues settle on.