Skip to content

Commit c8ade4f

Browse files
docs(bootcamp): split Unit 1 into parallel CLI + Embedded setup tracks
Unit 1 was the only unit with material shape-divergence (install + wire-up). From Unit 2 on, the workbench UI is identical regardless of how Bowire got mounted, so threading Path A/B inline through every later lesson was duplication for nothing. Now: Unit 0 ends by pointing at two parallel tracks -- units/unit-1-cli/ for the bowire --url two-process shape and units/unit-1-embedded/ for the AddBowire()/MapBowire() in-process shape. Each track is two lessons (first call + multi-protocol). Learners walk one track, the other is a deliberate diff target. Samples move to units/unit-1-samples/ so both tracks reference the same HelloApi/HelloGrpc projects without duplication; the embedded track instructs learners to add Kuestenlogik.Bowire and wire it up. LEARNING_PATHS, units-overview, Unit 0 next-step, and the prereq headers in Units 2-5 all updated to point at 'pick your track' instead of the old monolithic Unit 1 link.
1 parent 729defc commit c8ade4f

31 files changed

Lines changed: 630 additions & 526 deletions

File tree

.docfx/docfx.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
"files": [
66
"units/**/README.md",
77
"units/**/INSTRUCTIONS.md",
8-
"units/**/cli.md",
9-
"units/**/embedded.md",
108
"units/**/toc.yml",
119
"capstone/**/README.md",
1210
"capstone/**/REQUIREMENTS.md",
@@ -19,6 +17,9 @@
1917
"toc.yml",
2018
"index.md"
2119
],
20+
"exclude": [
21+
"units/unit-1-samples/**"
22+
],
2223
"src": ".."
2324
}
2425
],

LEARNING_PATHS.md

Lines changed: 23 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
# Learning Paths
22

3-
Six role-based paths through the Bowire Bootcamp. Or, complete all units in order for the full picture (~3 hours).
3+
Five role-based paths through the Bowire Bootcamp. Or, complete all units in order for the full picture (~3 hours).
44

55
Every path lists its **path-level prerequisites** (the toolchain you need before starting any of its units). Individual lessons also list their own prerequisites — those are subsets of the path-level list.
66

7-
> **First decision — pick your deployment shape.** Bowire ships in two: standalone **CLI** (point at any URL) and **embedded** (`AddBowire()` + `MapBowire()` in your own ASP.NET service). [Unit 0 → Lesson 0.1](units/unit-0/lesson-1/README.md) breaks the choice down with diagrams. Most paths below work with either shape; **Path #6 (Embedded Backend Workflow)** is the embedded-native walkthrough for backend devs mounting the workbench inside their service.
7+
> **First decision — pick your deployment shape.** Unit 0 introduces the two:
8+
>
9+
> - **CLI (two-process)**`bowire --url <service>` from a terminal. Bowire is its own process; your service is untouched.
10+
> - **Embedded (single-process)**`AddBowire()` + `MapBowire()` inside your ASP.NET host. Workbench mounts at `/bowire` on the host's own port.
11+
>
12+
> Unit 1 splits into two parallel **setup tracks**[CLI](units/unit-1-cli/README.md) or [Embedded](units/unit-1-embedded/README.md). Pick one based on the shape that matches your deployment.
13+
>
14+
> From Unit 2 onwards the tracks merge — the workbench UI is identical regardless of how Bowire got mounted, so recording, mocking, AI integration, plugin authoring, and CI work are shared.
815
916
---
1017

@@ -17,11 +24,12 @@ Every path lists its **path-level prerequisites** (the toolchain you need before
1724
**Prerequisites:**
1825
- [.NET 10 SDK](https://dotnet.microsoft.com/download) — for the sample REST + gRPC backends.
1926
- A modern web browser — workbench UI runs in-browser, opens automatically.
27+
- Either the `bowire` CLI installed (CLI track) **or** an ASP.NET host you can `dotnet add package Kuestenlogik.Bowire` into (Embedded track).
2028

2129
| # | Unit | Why it matters |
2230
|---|------|----------------|
23-
| 1 | [Unit 0: Introduction](units/unit-0/README.md) | What Bowire is, how it positions vs Postman/Insomnia/Bruno, install verification |
24-
| 2 | [Unit 1: Workbench Basics](units/unit-1/README.md) | First REST call, multi-protocol session (REST + gRPC discovered side-by-side) |
31+
| 1 | [Unit 0: Introduction](units/unit-0/README.md) | What Bowire is, how it positions vs Postman/Insomnia/Bruno, install verification, **pick your setup track** |
32+
| 2 | Unit 1[CLI track](units/unit-1-cli/README.md) **or** [Embedded track](units/unit-1-embedded/README.md) | First REST call + multi-protocol session (REST + gRPC), walked through your chosen setup track |
2533
| 3 | [Unit 2.1: Record & Replay](units/unit-2/lesson-1/README.md) | Capture a session, save as `.bwr`, replay through `bowire mock` |
2634

2735
---
@@ -34,7 +42,7 @@ Every path lists its **path-level prerequisites** (the toolchain you need before
3442

3543
**Prerequisites:**
3644
- [.NET 10 SDK](https://dotnet.microsoft.com/download) — the bootcamp's sample backend uses it; production frontend devs can swap in their own.
37-
- Bowire CLI: `dotnet tool install --global Kuestenlogik.Bowire.Tool`.
45+
- Bowire CLI: `dotnet tool install --global Kuestenlogik.Bowire.Tool`. (Mock-server is a CLI-only feature, so this path defaults to the CLI shape regardless of what your backend team uses.)
3846

3947
| # | Unit | Why it matters |
4048
|---|------|----------------|
@@ -50,13 +58,13 @@ Every path lists its **path-level prerequisites** (the toolchain you need before
5058
**Units:** 2
5159

5260
**Prerequisites:**
53-
- [.NET 10 SDK](https://dotnet.microsoft.com/download) + Bowire CLI.
61+
- [.NET 10 SDK](https://dotnet.microsoft.com/download) + Bowire CLI (or embedded host).
5462
- **Claude Desktop** or **Cursor** installed (any other MCP-aware host also works — the config snippet is portable).
5563

5664
| # | Unit | Why it matters |
5765
|---|------|----------------|
58-
| 1 | [Unit 1: Workbench Basics](units/unit-1/README.md) | Understand Bowire's discovery + invoke surface first (the toolset the agent will drive) |
59-
| 2 | [Unit 3.1: AI-Agent Integration](units/unit-3/lesson-1/README.md) | `bowire mcp serve` over stdio, wire it into the agent's MCP config, drive REST + gRPC from a chat window |
66+
| 1 | Unit 1[CLI track](units/unit-1-cli/README.md) **or** [Embedded track](units/unit-1-embedded/README.md) | Understand Bowire's discovery + invoke surface first (the toolset the agent will drive) |
67+
| 2 | [Unit 3.1: AI-Agent Integration](units/unit-3/lesson-1/README.md) | `bowire mcp serve` over stdio (CLI shape), or `MapBowireMcpAdapter()` HTTP MCP (embedded shape) — wire it into the agent's MCP config, drive REST + gRPC from a chat window |
6068

6169
---
6270

@@ -67,14 +75,14 @@ Every path lists its **path-level prerequisites** (the toolchain you need before
6775
**Units:** 3
6876

6977
**Prerequisites:**
70-
- [.NET 10 SDK](https://dotnet.microsoft.com/download) + Bowire CLI.
78+
- [.NET 10 SDK](https://dotnet.microsoft.com/download) + Bowire CLI (or embedded host).
7179
- **Python 3.10+** + `pip` — only for the Unit 4.2 sidecar lesson. Unit 4.1 (.NET plugin) needs nothing beyond the SDK.
7280
- [`dotnet new bowire-plugin`](https://github.com/Kuestenlogik/Bowire.Templates) template installed: `dotnet new install Kuestenlogik.Bowire.Templates`.
7381

7482
| # | Unit | Why it matters |
7583
|---|------|----------------|
76-
| 1 | [Unit 1: Workbench Basics](units/unit-1/README.md) | Understand how the host discovers and renders a protocol (REST + gRPC reference) |
77-
| 2 | [Unit 4.1: .NET Protocol Plugin](units/unit-4/lesson-1/README.md) | Implement `IBowireProtocol`, `dotnet pack`, `bowire plugin install` |
84+
| 1 | Unit 1[CLI track](units/unit-1-cli/README.md) **or** [Embedded track](units/unit-1-embedded/README.md) | Understand how the host discovers and renders a protocol (REST + gRPC reference) |
85+
| 2 | [Unit 4.1: .NET Protocol Plugin](units/unit-4/lesson-1/README.md) | Implement `IBowireProtocol`, `dotnet pack`, install via `bowire plugin install` (CLI) or `PackageReference` (Embedded) |
7886
| 3 | [Unit 4.2: Python Sidecar Plugin](units/unit-4/lesson-2/README.md) | Same surface, polyglot — `BowirePlugin` subclass, JSON-RPC stdio, ship as a zip |
7987

8088
---
@@ -86,7 +94,7 @@ Every path lists its **path-level prerequisites** (the toolchain you need before
8694
**Units:** 2
8795

8896
**Prerequisites:**
89-
- [.NET 10 SDK](https://dotnet.microsoft.com/download) + Bowire CLI.
97+
- [.NET 10 SDK](https://dotnet.microsoft.com/download) + Bowire CLI. (CI workflows always run the CLI shape — there's no in-process host to mount the workbench into at CI time.)
9098
- **Docker** (for the CI examples that run the mock as a service container — optional in local dev).
9199
- A **GitHub repository** you can push the sample workflow to (any other CI runner works analogously; the lesson examples are GitHub Actions).
92100

@@ -97,48 +105,18 @@ Every path lists its **path-level prerequisites** (the toolchain you need before
97105

98106
---
99107

100-
## 6. Embedded Backend Workflow
101-
102-
**For:** Backend developers and internal-tools teams who mount the workbench *inside* their own ASP.NET service via `AddBowire()` + `MapBowire()` — workbench inherits the host's DI container, `[Authorize]` policies, `IOptions<T>` config, and logging providers, so what the workbench discovers is exactly what production exposes.
103-
**Duration:** ~50 min
104-
**Units:** 3
105-
106-
**Prerequisites:**
107-
- [.NET 10 SDK](https://dotnet.microsoft.com/download).
108-
- An ASP.NET host to mount Bowire into — either your own service, or scaffold a fresh one with `dotnet new web` (Lesson 0.2 walks the scaffold).
109-
- `Kuestenlogik.Bowire` NuGet referenced from the host (`dotnet add package Kuestenlogik.Bowire`). No separate `bowire` CLI install required for this path, though the CLI is handy to keep around for external targets.
110-
111-
| # | Unit | Why it matters |
112-
|---|------|----------------|
113-
| 1 | [Unit 0: Introduction](units/unit-0/README.md) | Pick Path B in Lesson 0.2; mount the workbench in two lines |
114-
| 2 | [Unit 1: Workbench Basics](units/unit-1/README.md) | First call against your own in-process service — same workbench surface as the CLI path, no separate process |
115-
| 3 | [Unit 2.1: Record & Replay](units/unit-2/lesson-1/README.md) | Capture sessions against your own service; replay through `bowire mock` (CLI) for downstream consumers |
116-
117-
**Where embedded beats CLI:**
118-
- The workbench inherits your auth pipeline. A method behind `[Authorize(Policy="…")]` needs the same token; no parallel credentials store.
119-
- Discovery reads gRPC reflection / OpenAPI document provider / SignalR hub registry directly through DI — faster, no schema-version drift.
120-
- Ship a debug UI *with* your binary — no separate distribution, no companion container.
121-
122-
**Where CLI still beats embedded:**
123-
- External targets you don't control.
124-
- Air-gapped or CI environments where adding a NuGet to the host isn't an option.
125-
- MCP agents driving many services simultaneously — one CLI instance, many `--url` targets.
126-
127-
> **Coverage status.** Unit 0 is the only one with full Path-A / Path-B coverage today. Other units still write samples for the CLI path by default; [Kuestenlogik/Bowire#55](https://github.com/Kuestenlogik/Bowire/issues/55) tracks bringing the embedded path to lesson-by-lesson parity. The embedded code path is fully supported in the product — the bootcamp just hasn't finished documenting every variant yet.
128-
129-
---
130-
131108
## Or: the full bootcamp
132109

133110
Complete every unit in order — ~3 hours, ~9 lessons, plus the capstone.
134111

135112
**Prerequisites (everything):**
136113
- [.NET 10 SDK](https://dotnet.microsoft.com/download)
137-
- Bowire CLI: `dotnet tool install --global Kuestenlogik.Bowire.Tool`
114+
- For the **CLI track of Unit 1** *and* Unit 5 (always CLI): Bowire CLI — `dotnet tool install --global Kuestenlogik.Bowire.Tool`
115+
- For the **Embedded track of Unit 1**: ASP.NET host (own, or scaffold via `dotnet new web`) + `dotnet add package Kuestenlogik.Bowire`
138116
- `dotnet new bowire-plugin` template: `dotnet new install Kuestenlogik.Bowire.Templates`
139117
- **Python 3.10+** (Unit 4.2 only)
140118
- **Claude Desktop** or **Cursor** (Unit 3.1 only)
141119
- **Docker** (Unit 5.1 only — optional in local dev)
142120
- A **GitHub repository** (Unit 5.1 only)
143121

144-
- [Unit 0](units/unit-0/README.md)[Unit 1](units/unit-1/README.md)[Unit 2](units/unit-2/README.md)[Unit 3](units/unit-3/README.md)[Unit 4](units/unit-4/README.md)[Unit 5](units/unit-5/README.md)[Capstone](capstone/README.md)
122+
[Unit 0](units/unit-0/README.md) → Unit 1 ([CLI](units/unit-1-cli/README.md) or [Embedded](units/unit-1-embedded/README.md)) → [Unit 2](units/unit-2/README.md)[Unit 3](units/unit-3/README.md)[Unit 4](units/unit-4/README.md)[Unit 5](units/unit-5/README.md)[Capstone](capstone/README.md)

README.md

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,15 +78,24 @@ Understand what Bowire is and verify your environment.
7878
| [0.2](units/unit-0/lesson-2/README.md) | Setup | Install the bowire CLI, the bundled plugins, the workbench host |
7979
| [0.3](units/unit-0/lesson-3/README.md) | Hello Bowire | Launch the workbench, point it at a public REST API, invoke your first method |
8080

81-
### Unit 1: Workbench Basics
82-
*Time: ~15 minutes*
81+
### Unit 1: Workbench Basics — pick your setup track
82+
*Time: ~15 minutes per track (you only walk one)*
83+
84+
Drive Bowire's discovery and invoke surface across two protocols at once. Two parallel tracks based on your deployment shape — pick one and the rest of the bootcamp (Unit 2+) is shared.
85+
86+
**[CLI track](units/unit-1-cli/README.md)** — for the `bowire --url <service>` two-process shape:
87+
88+
| Lesson | Topic | What You'll Build |
89+
|--------|-------|-------------------|
90+
| [1.1](units/unit-1-cli/lesson-1/README.md) | First call (REST + OpenAPI) | A REST sample API, discovered through its OpenAPI doc, invoked from the workbench |
91+
| [1.2](units/unit-1-cli/lesson-2/README.md) | Multi-protocol session (REST + gRPC) | A gRPC sample side-by-side with REST via repeated `--url`, server-streaming demo |
8392

84-
Drive Bowire's discovery and invoke surface across two protocols at once.
93+
**[Embedded track](units/unit-1-embedded/README.md)** — for the `AddBowire()` / `MapBowire()` in-process shape:
8594

8695
| Lesson | Topic | What You'll Build |
8796
|--------|-------|-------------------|
88-
| [1.1](units/unit-1/lesson-1/README.md) | First call (REST + OpenAPI) | A REST sample API, discovered through its OpenAPI doc, invoked from the workbench |
89-
| [1.2](units/unit-1/lesson-2/README.md) | Multi-protocol session (REST + gRPC) | A gRPC sample side-by-side with REST, both discovered automatically, server-streaming demo |
97+
| [1.1](units/unit-1-embedded/lesson-1/README.md) | Mount the workbench in your host | `AddBowire()` + `MapBowire()` in `Program.cs`, workbench at `/bowire` on the host's port |
98+
| [1.2](units/unit-1-embedded/lesson-2/README.md) | Add a second protocol (gRPC) | gRPC co-hosted in the same ASP.NET process; the workbench picks both up through DI |
9099

91100
### Unit 2: Record, Replay, Mock
92101
*Time: ~20 minutes*

units-overview.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
| Unit | Title | Lessons |
66
|------|-------|---------|
77
| [Unit 0](units/unit-0/README.md) | Introduction | 3 |
8-
| [Unit 1](units/unit-1/README.md) | Workbench Basics | 2 |
8+
| Unit 1 — pick one track: [CLI](units/unit-1-cli/README.md) or [Embedded](units/unit-1-embedded/README.md) | Workbench Basics — setup track for your deployment shape | 2 per track |
99

1010
## Record, Replay, Mock (Unit 2)
1111

units/unit-0/README.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,15 @@ Understand what Bowire is, **pick your deployment shape** (standalone CLI vs emb
1616
|--------|-------|-------------------|
1717
| [0.1](lesson-1/README.md) | What is Bowire? | Multi-protocol API workbench, the **two-process** (CLI) and **single-process** (embedded) models, when to pick which |
1818
| [0.2](lesson-2/README.md) | Setup | Path A: install the `bowire` global tool. Path B: scaffold an ASP.NET host + `AddBowire()` / `MapBowire()`. Both paths covered side by side. |
19-
| [0.3](lesson-3/README.md) | Hello Bowire (CLI) | Launch the workbench against a public REST API, invoke your first method. Skipped on Path B[Unit 1.1](../unit-1/lesson-1/README.md) is the embedded equivalent. |
19+
| [0.3](lesson-3/README.md) | Hello Bowire (CLI) | Launch the workbench against a public REST API, invoke your first method. Embedded learners can skim — Unit 1's [Embedded track](../unit-1-embedded/README.md) walks the in-process equivalent. |
2020

2121
## Why this unit
2222

23-
Before you can drive Bowire across protocols, you need a working install and a clear mental model of what it is vs the API-client tools you've used before. The two deployment shapes (CLI vs Embedded) cover meaningfully different jobs, so Unit 0 makes the choice explicit before any code gets written. If you already know the positioning and have at least one path installed, skip straight to [Unit 1](../unit-1/README.md).
23+
Before you can drive Bowire across protocols, you need a working install and a clear mental model of what it is vs the API-client tools you've used before. The two deployment shapes (CLI vs Embedded) cover meaningfully different jobs, so Unit 0 makes the choice explicit before any code gets written. If you already know the positioning and have at least one path installed, head to Unit 1 — pick the [CLI track](../unit-1-cli/README.md) or the [Embedded track](../unit-1-embedded/README.md) based on your shape.
2424

2525
---
2626

27-
**Next:**[Unit 1: Workbench Basics](../unit-1/README.md)
27+
**Next:** Unit 1 — pick your setup track:
28+
29+
- [CLI track](../unit-1-cli/README.md) — for the standalone `bowire --url` shape
30+
- [Embedded track](../unit-1-embedded/README.md) — for the `AddBowire()` / `MapBowire()` in-process shape

units/unit-0/lesson-2/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ If you want to add a plugin that isn't bundled, reference its NuGet next to `Kue
158158
| `bowire plugin list` errors with `Access denied` | A | Check `~/.bowire/plugins/` exists and is writable. The directory is created on first install; manual creation needs `mkdir -p`. |
159159
| Tool install times out behind a corporate proxy | A · B | Configure `dotnet nuget` proxy settings (`dotnet nuget config -s <feed>`) or set `HTTP_PROXY` / `HTTPS_PROXY`. |
160160
| `/bowire` returns 404 in the embedded host | B | Make sure `app.MapBowire()` runs **after** `var app = builder.Build()` but **before** `app.Run()`. ASP.NET ignores route registrations after `Run()` starts the host. |
161-
| Workbench renders but discovers no endpoints | B | The host has no services registered yet. Either add a sample route (`app.MapGet("/api/ping", () => "pong")`) or skip ahead to [Unit 1](../../unit-1/README.md) which adds a discovery target. |
161+
| Workbench renders but discovers no endpoints | B | The host has no services registered yet. Either add a sample route (`app.MapGet("/api/ping", () => "pong")`) or skip ahead to [Unit 1 — Embedded track](../../unit-1-embedded/README.md) which adds a discovery target. |
162162

163163
## Key Takeaways
164164

units/unit-0/lesson-3/README.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66

77
Point your freshly-installed `bowire` at a public REST API, watch the workbench discover it, invoke one method. The smallest end-to-end loop that proves the install works — without writing any code or running any sample server yet.
88

9-
You'll bring your own sample API in [Unit 1.1](../../unit-1/lesson-1/README.md); this lesson uses one that's already on the public web.
9+
You'll bring your own sample API in [Unit 1 — CLI track Lesson 1.1](../../unit-1-cli/lesson-1/README.md); this lesson uses one that's already on the public web.
1010

11-
> **Embedded users (Path B):** This lesson is CLI-native — pointing the workbench at a public URL is the CLI's day job. Skip ahead to [Unit 1.1](../../unit-1/lesson-1/README.md) which walks the equivalent loop against an in-process service. You can come back to this lesson later if you ever want to drive an external target.
11+
> **Embedded users:** This lesson is CLI-native — pointing the workbench at a public URL is the CLI's day job. Skip ahead to [Unit 1 — Embedded track Lesson 1.1](../../unit-1-embedded/lesson-1/README.md) which walks the equivalent loop against an in-process service. You can come back to this lesson later if you ever want to drive an external target.
1212
1313
## Steps
1414

@@ -104,7 +104,10 @@ Petstore's REST endpoints are all unary. To see the streaming-pane shape, point
104104

105105
You're done with Unit 0. Time to bring up your own sample API and drive REST + gRPC side-by-side in the same workbench.
106106

107-
**Continue:**[Unit 1: Workbench Basics](../../unit-1/README.md)
107+
**Continue:** Unit 1 — pick your setup track:
108+
109+
- [CLI track](../../unit-1-cli/README.md)
110+
- [Embedded track](../../unit-1-embedded/README.md)
108111

109112
## Reference
110113

0 commit comments

Comments
 (0)