Repository: PrefectHQ/prefect

Issue:
`prefect init` CLI command plus choosing "No, I'll use the default deployment configuration." errors
### First check

- [X] I added a descriptive title to this issue.
- [X] I used the GitHub search to find a similar issue and didn't find it.
- [X] I searched the Prefect documentation for this issue.
- [X] I checked that this issue is related to Prefect and not one of its dependencies.

### Bug summary

`prefect init` CLI command plus choosing "No, I'll use the default deployment configuration." errors

### Reproduction

```python3
`prefect init` 

Then arrow down to  "No, I'll use the default deployment configuration."
```


### Error

```python3
(qa) jeffhale demos/qa $ prefect init
? You haven't specified a deployment configuration recipe. Would you like to see a list of 
available recipes? [Use arrows to move; enter to select]
┏━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃    ┃ Name         ┃ Description                                                                ┃
┡━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│    │ s3           │ Store code within an S3 bucket                                             │
│    │ docker       │ Store code within a custom docker image alongside its runtime environment  │
│    │ docker-s3    │ Store code within S3 and build a custom docker image for runtime           │
│    │ docker-azure │ Store code within an Azure Blob Storage container and build a custom       │
│    │              │ docker image for runtime                                                   │
│    │ azure        │ Store code within an Azure Blob Storage container                          │
│    │ docker-gcs   │ Store code within GCS and build a custom docker image for runtime          │
│    │ docker-git   │ Store code within a git repository and build a custom docker image for     │
│    │              │ runtime                                                                    │
│    │ local        │ Store code on a local filesystem                                           │
│    │ git          │ Store code within git repository                                           │
│    │ gcs          │ Store code within a GCS bucket                                             │
└────┴──────────────┴────────────────────────────────────────────────────────────────────────────┘
  > No, I'll use the default deployment configuration.
Traceback (most recent call last):
  File "/Users/jeffhale/miniforge3/envs/qa/lib/python3.11/site-packages/prefect/cli/_utilities.py", line 41, in wrapper
    return fn(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^
  File "/Users/jeffhale/miniforge3/envs/qa/lib/python3.11/site-packages/prefect/utilities/asyncutils.py", line 255, in coroutine_wrapper
    return call()
           ^^^^^^
  File "/Users/jeffhale/miniforge3/envs/qa/lib/python3.11/site-packages/prefect/_internal/concurrency/calls.py", line 383, in __call__
    return self.result()
           ^^^^^^^^^^^^^
  File "/Users/jeffhale/miniforge3/envs/qa/lib/python3.11/site-packages/prefect/_internal/concurrency/calls.py", line 283, in result
    return self.future.result(timeout=timeout)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/jeffhale/miniforge3/envs/qa/lib/python3.11/site-packages/prefect/_internal/concurrency/calls.py", line 169, in result
    return self.__get_result()
           ^^^^^^^^^^^^^^^^^^^
  File "/Users/jeffhale/miniforge3/envs/qa/lib/python3.11/concurrent/futures/_base.py", line 401, in __get_result
    raise self._exception
  File "/Users/jeffhale/miniforge3/envs/qa/lib/python3.11/site-packages/prefect/_internal/concurrency/calls.py", line 346, in _run_async
    result = await coro
             ^^^^^^^^^^
  File "/Users/jeffhale/miniforge3/envs/qa/lib/python3.11/site-packages/prefect/cli/project.py", line 140, in init
    if recipe and (recipe_paths / recipe / "prefect.yaml").exists():
                   ~~~~~~~~~~~~~^~~~~~~~
TypeError: unsupported operand type(s) for /: 'PosixPath' and 'dict'
An exception occurred.
```


### Versions

```Text
Version:             2.10.14
API version:         0.8.4
Python version:      3.11.4
Git commit:          ee4fc4ac
Built:               Thu, Jun 15, 2023 4:51 PM
OS/Arch:             darwin/arm64
Profile:             qawork
Server type:         cloud
```


### Additional context

_No response_


Discussion:

Resolving patch:
diff --git a/src/prefect/cli/project.py b/src/prefect/cli/project.py
--- a/src/prefect/cli/project.py
+++ b/src/prefect/cli/project.py
@@ -114,18 +114,15 @@ async def init(
                     recipe_description = recipe_data.get(
                         "description", "(no description available)"
                     )
-                    recipe = {
+                    recipe_dict = {
                         "name": recipe_name,
                         "description": recipe_description,
                     }
-                    recipes.append(recipe)
+                    recipes.append(recipe_dict)
 
         selected_recipe = prompt_select_from_table(
             app.console,
-            (
-                "You haven't specified a deployment configuration recipe. Would you"
-                " like to see a list of available recipes?"
-            ),
+            "Would you like to initialize your deployment configuration with a recipe?",
             columns=[
                 {"header": "Name", "key": "name"},
                 {"header": "Description", "key": "description"},


Test patch:
diff --git a/tests/cli/test_project.py b/tests/cli/test_project.py
--- a/tests/cli/test_project.py
+++ b/tests/cli/test_project.py
@@ -1,17 +1,37 @@
 from pathlib import Path
+import sys
 from tempfile import TemporaryDirectory
 from unittest.mock import MagicMock
 
 import pytest
 import readchar
+from typer import Exit
 import yaml
 from prefect.server import models
 from prefect.client import schemas
-from test_cloud import interactive_console  # noqa
 
 from prefect.testing.cli import invoke_and_assert
 
 
+@pytest.fixture
+def interactive_console(monkeypatch):
+    monkeypatch.setattr("prefect.cli.project.is_interactive", lambda: True)
+
+    # `readchar` does not like the fake stdin provided by typer isolation so we provide
+    # a version that does not require a fd to be attached
+    def readchar():
+        sys.stdin.flush()
+        position = sys.stdin.tell()
+        if not sys.stdin.read():
+            print("TEST ERROR: CLI is attempting to read input but stdin is empty.")
+            raise Exit(-2)
+        else:
+            sys.stdin.seek(position)
+        return sys.stdin.read(1)
+
+    monkeypatch.setattr("readchar._posix_read.readchar", readchar)
+
+
 @pytest.fixture
 async def deployment_with_pull_step(
     session,
@@ -204,6 +224,28 @@ def test_project_init_with_unknown_recipe(self):
         assert result.exit_code == 1
         assert "prefect init" in result.output
 
+    @pytest.mark.usefixtures("interactive_console")
+    def test_project_init_opt_out_of_recipe(self):
+        with TemporaryDirectory() as tempdir:
+            result = invoke_and_assert(
+                "init --name test_project",
+                temp_dir=str(tempdir),
+                user_input=(readchar.key.DOWN * 10) + readchar.key.ENTER,
+            )
+            assert result.exit_code == 0
+            assert any(Path(tempdir).rglob("prefect.yaml"))
+
+    @pytest.mark.usefixtures("interactive_console")
+    def test_project_init_use_first_recipe(self):
+        with TemporaryDirectory() as tempdir:
+            result = invoke_and_assert(
+                "init --name test_project",
+                temp_dir=str(tempdir),
+                user_input=readchar.key.DOWN + readchar.key.ENTER,
+            )
+            assert result.exit_code == 0
+            assert any(Path(tempdir).rglob("prefect.yaml"))
+
 
 class TestProjectClone:
     def test_clone_with_no_options(self):