@harness-lab/cli 0.2.4 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -121,10 +121,10 @@ Workshop commands:
121
121
  harness auth status
122
122
  harness skill install
123
123
  harness workshop status
124
- harness workshop create-instance developer-hackathon-praha-24-4-saturn --event-title "Developer Hackathon Praha"
125
- harness workshop update-instance developer-hackathon-praha-24-4-saturn --room-name Saturn
126
- harness workshop prepare developer-hackathon-praha-24-4-saturn
127
- harness workshop remove-instance developer-hackathon-praha-24-4-saturn
124
+ harness workshop create-instance sample-workshop-demo-orbit --event-title "Sample Workshop Demo"
125
+ harness workshop update-instance sample-workshop-demo-orbit --room-name Orbit
126
+ harness workshop prepare sample-workshop-demo-orbit
127
+ harness workshop remove-instance sample-workshop-demo-orbit
128
128
  harness workshop phase set rotation
129
129
  harness workshop archive --notes "Manual archive"
130
130
  harness auth logout
@@ -18,7 +18,7 @@ allowed-tools:
18
18
 
19
19
  # Workshop
20
20
 
21
- Participant-facing skill for the Harness Lab workshop. Command semantics stay in English, but participant-facing delivery should follow the active workshop `contentLang` when live runtime data is available and fall back to the best reviewed bundled locale otherwise.
21
+ Participant-facing skill for the Harness Lab workshop. Command semantics stay in English, but participant-facing delivery should follow the active workshop `contentLang` when live runtime data is available and otherwise resolve to a reviewed fallback locale instead of inheriting the raw language of whichever supporting doc was opened first.
22
22
 
23
23
  ## Purpose
24
24
 
@@ -27,12 +27,26 @@ This skill is the primary workshop interface for participants in Codex or pi. It
27
27
  The portable install path should make this skill usable from the participant's real working repo without requiring a clone of the Harness Lab source repo.
28
28
 
29
29
  Core mental model:
30
- - dashboard participant surface = orientace během dne
31
- - dashboard facilitator surface = řízení workshop instance
32
- - workshop skill = AI interface ke stejnému workshop systému
33
- - workshop blueprint = veřejná kanonická definice workshop method
34
- - `uiLang` = jazyk product chrome
35
- - `contentLang` = jazyk workshopového obsahu pro participant-facing delivery
30
+ - dashboard participant surface = orientation during the day
31
+ - dashboard facilitator surface = control of the workshop instance
32
+ - workshop skill = AI interface to the same workshop system
33
+ - workshop blueprint = public canonical definition of the workshop method
34
+ - `uiLang` = language of product chrome
35
+ - `contentLang` = language of workshop content for participant-facing delivery
36
+
37
+ ## Language Resolution
38
+
39
+ Command semantics stay in English. Resolve the response language in this order:
40
+
41
+ 1. If live workshop data provides `contentLang` and the command is participant-facing workshop delivery, use that locale.
42
+ 2. Otherwise, match the user's current language when it maps to a reviewed locale in the repo or bundle.
43
+ 3. If there is no clear live or user-language signal, default bundled fallback delivery to English (`en`).
44
+
45
+ Additional rules:
46
+ - facilitator-control commands are operational rather than room-facing delivery, so prefer the user's current language unless the facilitator explicitly asks for another reviewed locale or you are quoting workshop content
47
+ - the authored language of a supporting doc does not decide the reply language by itself
48
+ - if the requested locale has no reviewed variant, fall back to English and say so explicitly
49
+ - do not let a Czech-authored fallback file force a Czech answer when the resolved response locale is English
36
50
 
37
51
  ## Sources Of Truth
38
52
 
@@ -56,8 +70,8 @@ Rule:
56
70
  - if runtime is unavailable, fall back to repo material and say explicitly that the answer is fallback rather than live state
57
71
  - runtime edits do not imply blueprint edits; reusable changes belong back in the repo deliberately
58
72
  - prefer workshop `contentLang` for participant-facing responses in live mode
59
- - if there is no live workshop context, prefer the best reviewed bundled locale and say when the answer is fallback content rather than live workshop state
60
- - for bundled fallback docs, resolve `workshop-skill/locales/<locale>/...` first; if a reviewed localized doc does not exist yet, fall back to the best reviewed bundled locale and say so explicitly
73
+ - if there is no live workshop context, resolve the fallback locale using the Language Resolution rules above and say when the answer is fallback content rather than live workshop state
74
+ - for bundled fallback docs, resolve `workshop-skill/locales/<locale>/...` first; if a reviewed localized doc does not exist yet, fall back to English and say so explicitly
61
75
  - do not translate workshop copy ad hoc when a reviewed locale exists in the repo or bundle
62
76
 
63
77
  ## Commands
@@ -235,6 +249,12 @@ Prefer invoking `harness workshop update-instance` over raw API scripts.
235
249
  Use this when the facilitator wants to correct or refine date, venue, room, address, or event title without resetting the instance.
236
250
  Support `contentLang` changes explicitly so facilitators can choose workshop delivery language per instance without changing admin UI language.
237
251
 
252
+ ### `workshop facilitator reset-instance <instance-id>`
253
+
254
+ Reset one existing workshop instance from the selected blueprint template. Requires facilitator session.
255
+ Prefer invoking `harness workshop reset-instance` over raw API scripts.
256
+ Use this when the facilitator wants fresh canonical agenda, runner, and presenter content for a live instance and accepts that local runtime state will be reinitialized.
257
+
238
258
  ### `workshop facilitator remove-instance`
239
259
 
240
260
  Remove a workshop instance from the active list without deleting its archive history. Requires facilitator session.
@@ -253,6 +273,13 @@ Inspect and edit the local agenda copy for one workshop instance. Requires facil
253
273
 
254
274
  Inspect and edit presenter scenes for one workshop instance. This includes listing scenes for an agenda item, creating a new scene, editing content, changing default scene, reordering scenes, and enabling or hiding scenes. Requires facilitator session.
255
275
 
276
+ Rules for rich scenes:
277
+ - keep scenes agenda-linked and room-facing rather than inventing a freeform slide deck
278
+ - prefer one dominant voice per scene and one main idea per scene
279
+ - use reviewed local blueprint assets for reusable visuals instead of ad hoc remote image URLs
280
+ - treat runtime scene edits as instance-local until a maintainer deliberately publishes them back into the repo
281
+ - when richer scene authoring or promotion is involved, follow `docs/presenter-rich-scene-authoring.md`
282
+
256
283
  ### `workshop facilitator archive`
257
284
 
258
285
  Archive the current workshop instance with optional notes.
@@ -297,7 +324,8 @@ Relevant local files:
297
324
  ## Style
298
325
 
299
326
  - Be concise and directive.
300
- - Use Czech for explanations.
327
+ - Use the resolved response language.
328
+ - English is the default bundled fallback locale when no live or user-language signal overrides it.
301
329
  - Keep command names, file names, and code terms in English.
302
330
  - Prefer actionable next steps over theory during build phases.
303
331
  - Treat tests and executable checks as the default trust boundary once the agent is doing meaningful implementation work.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "manifestVersion": 1,
3
3
  "bundleName": "harness-lab-workshop",
4
- "bundleVersion": "0.2.4",
5
- "contentHash": "9e57d44e4a3f9296f4913cd51eefbf9dff7d6d9da8d4afb1ae5a2ce2a7dc4323",
4
+ "bundleVersion": "0.2.7",
5
+ "contentHash": "db5557fe004d30755c4912015667daf2095c70081780f8a3418bd772e2fb9a49",
6
6
  "files": [
7
7
  {
8
8
  "path": "content/challenge-cards/.gitkeep",
@@ -34,7 +34,7 @@
34
34
  },
35
35
  {
36
36
  "path": "content/facilitation/master-guide.md",
37
- "sha256": "e22f4a811459be1fe23412e7d85c02fe20170e6e6c8534fc97c1616f65b2cfd8"
37
+ "sha256": "f0edc5eef8c7bc0efc67672e184edecce46fa5fd5e9820cfda0b28fbb8cb1a8f"
38
38
  },
39
39
  {
40
40
  "path": "content/project-briefs/.gitkeep",
@@ -98,11 +98,11 @@
98
98
  },
99
99
  {
100
100
  "path": "content/talks/context-is-king.md",
101
- "sha256": "c380947051f4a66cdf47e846d5cc5d60ace0487f75dbc718b03fb7164cb94ef1"
101
+ "sha256": "4d0972fefac067de0b8803698b44bdf8ab0bee64b181d50d1ac5e26a92eb7089"
102
102
  },
103
103
  {
104
104
  "path": "docs/harness-cli-foundation.md",
105
- "sha256": "65b0b2cee7be792ad03f9be794230298d3efe8283e8e73acb033ef401d204e51"
105
+ "sha256": "80b321da32d110f141e1bd6a089ccc84f2a04066d76ba0258f530cc333dbaae4"
106
106
  },
107
107
  {
108
108
  "path": "docs/learner-reference-gallery.md",
@@ -134,7 +134,7 @@
134
134
  },
135
135
  {
136
136
  "path": "SKILL.md",
137
- "sha256": "b25a7730eb123edd941bcb176bd861ad209868189601c49845d1b6892f689647"
137
+ "sha256": "64ddc1bf36265ea8321b2634d34499e83a8c1692e5cb10c6f30b1b07f1d51975"
138
138
  },
139
139
  {
140
140
  "path": "workshop-blueprint/agenda.json",
@@ -146,7 +146,7 @@
146
146
  },
147
147
  {
148
148
  "path": "workshop-blueprint/day-structure.md",
149
- "sha256": "2d2c7a43e959059fe5d3dbb2aae20e6828fee40c700729080677c2c7b6feb0dc"
149
+ "sha256": "4980768b9e8b71d47cec19764b317d99c830908a0298c6f104e8d7bd37320966"
150
150
  },
151
151
  {
152
152
  "path": "workshop-blueprint/edit-boundaries.md",
@@ -182,7 +182,7 @@
182
182
  },
183
183
  {
184
184
  "path": "workshop-skill/facilitator.md",
185
- "sha256": "39dcb46914f19b66fd270627f42702b1f394ceb05dd0f3cf1f0c514becb6dca1"
185
+ "sha256": "ab4721564c1dee2a24c7d4dfda229c2cfa56f5bec89a8b3580b541d9baa13e7f"
186
186
  },
187
187
  {
188
188
  "path": "workshop-skill/follow-up-package.md",
@@ -4,19 +4,55 @@
4
4
 
5
5
  ### Cíl
6
6
 
7
- Nastavit energii dne a jasně pojmenovat, o čem workshop je.
7
+ Spustit den jako room-facing launch pro celý workshop, ne jako provozní brief k dopoledni.
8
8
 
9
9
  ### Klíčová message
10
10
 
11
- > „Dnes nejde o to být nejrychlejší. Jde o to předat práci tak, aby ji cizí tým dokázal převzít a posunout dál.“
11
+ > „Dnes nejde o to být nejrychlejší. Jde o to postavit práci tak, aby ji cizí tým dokázal převzít a posunout dál.“
12
12
 
13
13
  ### Co potřebuje zaznít
14
14
 
15
- - Nejde o soutěž v promptování.
15
+ - Nezačínáme tool demo ani soutěž v promptování.
16
+ - Budeme se učit, stavět, předávat i přebírat. Ten oblouk dne je záměr workshopu.
16
17
  - Jde o práci s agentem tak, aby po vás zůstával použitelný kontext.
17
18
  - Odpolední část prověří, jestli repo opravdu unese převzetí dalším týmem.
18
19
  - Pokud nějaké důležité pravidlo žije jen v hovoru u stolu, ještě neexistuje.
19
20
 
21
+ ### Doporučený sled beatů
22
+
23
+ 1. day-opening promise
24
+ 2. proč na tom záleží právě teď
25
+ 3. analogie typu Lego duck: stejné ingredience, různé použitelné výsledky
26
+ 4. krátká pohybová aktivace podle zkušenosti s AI agenty
27
+ 5. první pracovní kontrakt pro Build fázi 1
28
+
29
+ ### Lego-duck analogie
30
+
31
+ Použijte ji krátce a věcně.
32
+
33
+ Pointa:
34
+
35
+ - stejný agent neznamená stejný výsledek
36
+ - kvalitu neurčuje samotný model
37
+ - kontext, mantinely a ověřování jsou součást výsledku
38
+
39
+ Nevést jako zábavnou odbočku. Vést jako vysvětlení, proč je harness engineering tvůrčí a inženýrská disciplína zároveň.
40
+
41
+ ### Pohybová aktivace
42
+
43
+ Použijte krátké rozdělení místnosti podle aktuální zkušenosti s AI agenty:
44
+
45
+ - používám skoro denně
46
+ - používám, ale opatrně
47
+ - jsem spíš na startu
48
+ - jsem skeptický, ale chci důkaz
49
+
50
+ Pravidla:
51
+
52
+ - ne dělat z toho networking kolo
53
+ - stačí přesun a 2 krátké hlasy
54
+ - pointa není seniorita, ale kalibrace místnosti a signál, že den je participativní
55
+
20
56
  ### Co má facilitátor průběžně vracet
21
57
 
22
58
  - „Kde by to našel další tým bez vás?“
@@ -24,6 +60,61 @@ Nastavit energii dne a jasně pojmenovat, o čem workshop je.
24
60
  - „Je `AGENTS.md` mapa, nebo už se z něj stává dump?“
25
61
  - „Jaký je další bezpečný krok pro cizího člověka nebo agenta?“
26
62
 
63
+ ### První pracovní kontrakt
64
+
65
+ Po launchi potřebuje místnost ještě jednu konkrétní věc:
66
+
67
+ - co má být po prvním build bloku opravdu vidět
68
+ - co nestačí jen slíbit
69
+
70
+ Do oběda má být vidět:
71
+
72
+ - repo a `README`, které dávají smysl cizímu člověku
73
+ - `AGENTS.md` jako krátká mapa
74
+ - plan nebo jasně vedená implementační stopa
75
+ - první explicitní check před dalším generováním
76
+
77
+ ## Context is King talk
78
+
79
+ ### Cíl
80
+
81
+ Proměnit energii z openingu v přesnou tezi a čistý most do Build fáze 1.
82
+
83
+ ### Klíčová message
84
+
85
+ > „Kontext je páka, ne kosmetika.“
86
+
87
+ ### Co potřebuje zaznít
88
+
89
+ - Neučíme se lépe promptovat. Učíme se postavit repo a workflow, ve kterém agent i cizí tým dokážou bezpečně pokračovat.
90
+ - `AGENTS.md`, skills, runbooky a checks jsou týmová infrastruktura, ne polish navíc.
91
+ - Team lead nestojí modelu za zády a nediktuje další větu každých třicet sekund.
92
+ - Po talku se tým vrací k repu s mapou, planem a prvním checkem, ne s lovem na chytřejší prompt.
93
+
94
+ ### Mikro-cvičení
95
+
96
+ Použijte stejný malý task ve dvou podmínkách:
97
+
98
+ 1. prompt blob
99
+ 2. krátké zadání s `Goal`, `Context`, `Constraints`, `Done When`
100
+
101
+ Nenechte to sklouznout do debaty o tom, který model je chytřejší.
102
+
103
+ Pointa:
104
+
105
+ - přenos záměru
106
+ - přenos mantinelů
107
+ - přenos done criteria
108
+
109
+ ### Most do Build fáze 1
110
+
111
+ Na konci talku má být jasné:
112
+
113
+ - teorie tím končí
114
+ - tým se vrací k repu
115
+ - nejdřív vzniká mapa a první explicitní check
116
+ - teprve potom dává smysl další feature motion
117
+
27
118
  ## Build fáze 1
28
119
 
29
120
  ### Viditelný milestone board
@@ -1,8 +1,14 @@
1
1
  # Context is King
2
2
 
3
- ## Otevírací moment
3
+ ## Otevírací modul
4
4
 
5
- Tento workshop skill i dashboard vznikly stejným způsobem, jakým dnes budeme pracovat my: s AI agentem, ale s důrazem na kontext. Nejde mi o prodej nástroje. Jde mi o to ukázat disciplínu, která z nástroje dělá použitelného spolupracovníka.
5
+ Tenhle workshop skill i dashboard vznikly stejným způsobem, jakým dnes budeme pracovat my: s AI agentem, ale s důrazem na kontext. Nejde mi o prodej nástroje. Jde mi o to ukázat disciplínu, která z nástroje dělá použitelného spolupracovníka.
6
+
7
+ Rámec pro room launch:
8
+
9
+ - dnes nezačínáme tool demo ani soutěž v promptování
10
+ - budeme se učit, stavět, předávat i přebírat
11
+ - odpoledne se ukáže, co z práce přežije bez nás
6
12
 
7
13
  ## Klíčová linka
8
14
 
@@ -12,9 +18,26 @@ Moje hlavní věta pro dnešek:
12
18
 
13
19
  > Neučíme se "lépe promptovat". Učíme se postavit repo a workflow, ve kterém agent i cizí tým dokážou bezpečně pokračovat.
14
20
 
21
+ ## Analogický beat
22
+
23
+ Když dáte lidem stejné kostky, nevznikne jedna správná kachna. Stejně tak ze stejného modelu nevzniká jedna správná práce. Rozdíl nedělá jen model. Rozdíl dělá kontext, mantinely, ověřování a představivost týmu.
24
+
25
+ Pointa analogie:
26
+
27
+ - stejný agent neznamená stejný výsledek
28
+ - kvalitu neurčuje samotný model
29
+ - pracovní systém kolem agenta je součást výsledku
30
+
15
31
  ## Mikro-cvičení
16
32
 
17
- Všichni dostanou stejný malý úkol. Jedna varianta bude prompt blob. Druhá varianta bude krátké zadání se 4 prvky a s odkazem na kontext zapsaný v repu. Pak porovnáme výsledky. Nehledáme „nejhezčí prompt“. Hledáme způsob práce, který přenese záměr, omezení a kritéria hotovo i do dalšího kroku.
33
+ Všichni dostanou stejný malý task. Jedna varianta bude prompt blob. Druhá varianta bude krátké zadání se 4 prvky a s odkazem na kontext zapsaný v repu. Pak porovnáme výsledky. Nehledáme „nejhezčí prompt“. Hledáme způsob práce, který přenese záměr, omezení a done criteria i do dalšího kroku.
34
+
35
+ 4 prvky pro druhou variantu:
36
+
37
+ - Goal
38
+ - Context
39
+ - Constraints
40
+ - Done When
18
41
 
19
42
  ## Hlavní teze
20
43
 
@@ -37,6 +60,15 @@ Všichni dostanou stejný malý úkol. Jedna varianta bude prompt blob. Druhá v
37
60
  - Když agent dělá víc, já musím lépe ověřovat.
38
61
  - Handoff není závěr dne. Je to průběžná podmínka celé práce.
39
62
 
63
+ ## Most do Build fáze 1
64
+
65
+ Po tomhle talku se tým nemá vracet k repu s pocitem, že potřebuje jen chytřejší prompt. Má se vracet s jedním jasným očekáváním:
66
+
67
+ - nejdřív krátká mapa v repu
68
+ - potom plan
69
+ - potom první explicitní check
70
+ - teprve potom další feature motion
71
+
40
72
  ## Závěr
41
73
 
42
74
  Odpoledne nezažijete jen to, že „AI někdy funguje a někdy ne“. Zažijete, jak moc výsledek závisí na kvalitě pracovního systému, který kolem agenta postavíte.
@@ -8,7 +8,7 @@ Current implementation in this repo:
8
8
 
9
9
  - lives in the repository `harness-cli/` package and ships publicly as `@harness-lab/cli`
10
10
  - distributes a portable participant workshop skill bundle through `harness skill install`
11
- - covers `auth login/logout/status` plus `workshop status/create-instance/update-instance/prepare/remove-instance/archive/phase set`
11
+ - covers `auth login/logout/status` plus `workshop status/create-instance/update-instance/reset-instance/prepare/remove-instance/archive/phase set`
12
12
  - targets the existing shared dashboard facilitator APIs
13
13
  - is tested for browser/device auth, local-dev Basic Auth fallback, and cookie-backed Neon bootstrap fallback
14
14
  - stores sessions in a local file under `HARNESS_CLI_HOME` or `~/.harness` by default
@@ -41,6 +41,7 @@ Required commands:
41
41
  - `harness workshop status`
42
42
  - `harness workshop create-instance`
43
43
  - `harness workshop update-instance`
44
+ - `harness workshop reset-instance <instance-id>`
44
45
  - `harness workshop archive`
45
46
  - `harness workshop prepare`
46
47
  - `harness workshop remove-instance`
@@ -90,6 +91,7 @@ Current command posture:
90
91
 
91
92
  - explicit target required:
92
93
  - `harness workshop update-instance <instance-id>`
94
+ - `harness workshop reset-instance <instance-id>`
93
95
  - `harness workshop prepare <instance-id>`
94
96
  - `harness workshop remove-instance <instance-id>`
95
97
  - explicit target is the created resource:
@@ -115,6 +117,11 @@ Current step-up posture:
115
117
  - the existing CLI command set (`workshop status/archive/phase set`) may run on a valid brokered device session
116
118
  - future higher-risk commands such as facilitator grant/revoke or destructive instance mutations should require a fresh browser approval window rather than silently reusing an older CLI session
117
119
 
120
+ Content refresh posture:
121
+
122
+ - after changing authored participant-facing sources in `workshop-skill/`, `content/`, or `workshop-blueprint/`, refresh the portable bundle and verify it before shipping facilitator or participant guidance
123
+ - when those changes must land in already-created workshop instances, `workshop reset-instance` is the intended re-import path
124
+
118
125
  ## Session Storage Posture
119
126
 
120
127
  Default storage backend:
@@ -103,6 +103,31 @@ Habit installed:
103
103
  - cleanup and codification are part of delivery
104
104
  - repeated pain should become a better template, check, or runbook
105
105
 
106
+ ## Narrative Spine
107
+
108
+ The day should not feel like separate agenda cards. Each phase should change what the room now understands and what it is ready to do next.
109
+
110
+ - `opening`:
111
+ Shift the room from "AI hackathon energy" to "continuation-quality discipline." The key belief is that handoff without verbal rescue is part of the assignment from the first hour.
112
+ - `talk`:
113
+ Shift the room from a vague sense that context matters to a precise thesis: harness engineering is team infrastructure, not prompt cosmetics.
114
+ - `demo`:
115
+ Shift the room from abstract agreement to an observable workflow. The room should see context, plan, implementation, and review as one repeatable system.
116
+ - `build-1`:
117
+ Shift teams from listening to evidence. Before lunch, the repo needs to show map, plan, one executable check, and one verified step.
118
+ - `intermezzo-1`:
119
+ Shift from isolated table work to shared learning. The room should hear concrete repo signals, not generic progress reporting.
120
+ - `lunch-reset`:
121
+ Shift from local progress to handoff readiness. Going to lunch without a readable next safe step should feel unfinished.
122
+ - `rotation`:
123
+ Shift from authorship to inheritance. The receiving team must read first, diagnose second, and edit only after it can explain the state.
124
+ - `build-2`:
125
+ Shift from frustration to codification. Weak continuation signals should turn into clearer repo guidance, stronger checks, and better runbooks.
126
+ - `intermezzo-2`:
127
+ Shift from anecdotes about the afternoon to concrete continuation evidence. The room should identify which repo signals actually saved time.
128
+ - `reveal`:
129
+ Shift from reflection to adoption. The close should turn signals from the day into next-week practice and into improvements to the reusable workshop blueprint.
130
+
106
131
  ## What Must Survive In The Repo
107
132
 
108
133
  - goal and constraints
@@ -1,49 +1,49 @@
1
1
  # Facilitator Commands
2
2
 
3
- Příkazy pro facilitátory, kteří řídí workshop instance přes AI agenta.
3
+ Commands for facilitators who manage workshop instances through an AI agent.
4
4
 
5
5
  ## Auth
6
6
 
7
- Facilitátor se musí nejdřív přihlásit přes `harness` CLI. Skill nemá být další secret store pro raw credentials ani dlouhodobou session.
7
+ The facilitator must log in through the `harness` CLI first. The skill should not become another secret store for raw credentials or long-lived sessions.
8
8
 
9
9
  ### `/workshop facilitator login`
10
10
 
11
- Pokud není aktivní facilitátorská session, řekni facilitátorovi, aby spustil:
11
+ If no facilitator session is active, tell the facilitator to run:
12
12
 
13
13
  ```bash
14
14
  harness auth login
15
15
  ```
16
16
 
17
- CLI provede browser/device auth flow, uloží session do lokálního file storage a zpřístupní ji pro další privileged příkazy.
17
+ The CLI performs the browser/device auth flow, stores the session in local file storage, and exposes it to subsequent privileged commands.
18
18
 
19
19
  Model:
20
- - `harness auth login` autentizuje facilitátora vůči platformě
21
- - konkrétní workshop instance se vybírá při operaci nebo přes default context
22
- - instance grant se vyhodnocuje při přístupu ke konkrétní akci, ne při samotném loginu
20
+ - `harness auth login` authenticates the facilitator with the platform
21
+ - the specific workshop instance is selected later per operation or via default context
22
+ - the instance grant is evaluated when accessing a specific action, not during login itself
23
23
 
24
- Aktuální praktický path v repu:
24
+ Current practical paths in this repo:
25
25
 
26
26
  - default / browser-device auth:
27
27
  ```bash
28
28
  harness auth login --dashboard-url https://harness-lab-dashboard.vercel.app
29
29
  ```
30
- - file mode / lokální demo fallback:
30
+ - file mode / local demo fallback:
31
31
  ```bash
32
32
  harness auth login --auth basic --dashboard-url http://localhost:3000 --username facilitator --password secret
33
33
  ```
34
- - neon mode / sdílený dashboard bootstrap fallback:
34
+ - neon mode / shared dashboard bootstrap fallback:
35
35
  ```bash
36
36
  harness auth login --auth neon --dashboard-url https://harness-lab-dashboard.vercel.app --email facilitator@example.com
37
37
  ```
38
38
 
39
- Poznámka:
40
- - CLI dnes defaultně používá browser/device auth a ukládá session do lokálního file storage
41
- - Pokud facilitátor chce OS-native storage, může použít `HARNESS_SESSION_STORAGE=keychain`, `credential-manager` nebo `secret-service`
42
- - `--auth basic` a `--auth neon` zůstávají jen jako explicitní fallback pro lokální dev/bootstrap
39
+ Note:
40
+ - the CLI currently defaults to browser/device auth and stores the session in local file storage
41
+ - if the facilitator wants OS-native storage, they can use `HARNESS_SESSION_STORAGE=keychain`, `credential-manager`, or `secret-service`
42
+ - `--auth basic` and `--auth neon` remain explicit fallbacks for local dev/bootstrap
43
43
 
44
44
  ### `/workshop facilitator logout`
45
45
 
46
- Požádej o:
46
+ Ask the facilitator to run:
47
47
 
48
48
  ```bash
49
49
  harness auth logout
@@ -53,23 +53,23 @@ harness auth logout
53
53
 
54
54
  ### `/workshop facilitator status`
55
55
 
56
- Preferovaný path:
56
+ Preferred path:
57
57
 
58
58
  ```bash
59
59
  harness workshop status
60
60
  ```
61
61
 
62
- Zobraz:
63
- - aktivní instanci a její stav
64
- - aktuální fázi
65
- - seznam facilitátorů s rolemi
66
- - počet týmů
62
+ Show:
63
+ - active instance and its status
64
+ - current phase
65
+ - facilitator list with roles
66
+ - team count
67
67
 
68
68
  ### `/workshop facilitator grant <email> <role>`
69
69
 
70
- Použij CLI-backed privileged request path. Skill nemá řešit auth bootstrap sám.
70
+ Use the CLI-backed privileged request path. The skill should not handle auth bootstrap itself.
71
71
 
72
- API capability zůstává:
72
+ The API capability remains:
73
73
 
74
74
  ```http
75
75
  POST {DASHBOARD_URL}/api/admin/facilitators
@@ -78,78 +78,79 @@ Content-Type: application/json
78
78
  { "email": "...", "role": "operator" }
79
79
  ```
80
80
 
81
- Vyžaduje `owner` roli. Vrací info o novém grantu.
81
+ Requires `owner` role. Returns the new grant info.
82
82
 
83
83
  ### `/workshop facilitator revoke <email>`
84
84
 
85
- Nejdřív zavolej `GET /api/admin/facilitators` a najdi grant podle emailu.
86
- Pak:
87
- ```
85
+ Call `GET /api/admin/facilitators` first and find the grant by email.
86
+ Then call:
87
+
88
+ ```http
88
89
  DELETE {DASHBOARD_URL}/api/admin/facilitators/{grantId}
89
90
  ```
90
91
 
91
- Vyžaduje `owner` roli.
92
+ Requires `owner` role.
92
93
 
93
94
  ### `/workshop facilitator create-instance`
94
95
 
95
- Preferovaný path je CLI příkaz nad sdíleným runtime API:
96
+ The preferred path is a CLI command over the shared runtime API:
96
97
 
97
98
  ```bash
98
- harness workshop create-instance developer-hackathon-praha-24-4-saturn \
99
+ harness workshop create-instance sample-workshop-demo-orbit \
99
100
  --template-id blueprint-default \
100
- --content-lang cs \
101
- --event-title "Developer Hackathon Praha" \
102
- --city Praha \
103
- --date-range "24. dubna 2026" \
104
- --venue-name "Seyfor Praha jednička 103" \
105
- --room-name Saturn \
106
- --address-line "CZ, Praha 8, Sokolovska 695/115b" \
107
- --location-details "17 osob + lektor" \
108
- --facilitator-label Ondrej
101
+ --content-lang en \
102
+ --event-title "Sample Workshop Demo" \
103
+ --city "Example City" \
104
+ --date-range "June 15, 2026" \
105
+ --venue-name "Example Campus North" \
106
+ --room-name Orbit \
107
+ --address-line "Example Avenue 123" \
108
+ --location-details "12 participants + facilitator" \
109
+ --facilitator-label Alex
109
110
  ```
110
111
 
111
- Raw API reference zůstává jen jako diagnostická nebo architektonická reference:
112
+ The raw API reference remains diagnostic or architectural reference only:
112
113
 
113
114
  ```http
114
115
  POST {DASHBOARD_URL}/api/workshop/instances
115
116
  Content-Type: application/json
116
117
 
117
118
  {
118
- "id": "developer-hackathon-praha-24-4-saturn",
119
+ "id": "sample-workshop-demo-orbit",
119
120
  "templateId": "blueprint-default",
120
- "contentLang": "cs",
121
- "eventTitle": "Developer Hackathon Praha",
122
- "city": "Praha",
123
- "dateRange": "24. dubna 2026",
124
- "venueName": "Seyfor Praha jednička 103",
125
- "roomName": "Saturn",
126
- "addressLine": "CZ, Praha 8, Sokolovska 695/115b",
127
- "locationDetails": "17 osob + lektor",
128
- "facilitatorLabel": "Ondrej"
121
+ "contentLang": "en",
122
+ "eventTitle": "Sample Workshop Demo",
123
+ "city": "Example City",
124
+ "dateRange": "June 15, 2026",
125
+ "venueName": "Example Campus North",
126
+ "roomName": "Orbit",
127
+ "addressLine": "Example Avenue 123",
128
+ "locationDetails": "12 participants + facilitator",
129
+ "facilitatorLabel": "Alex"
129
130
  }
130
131
  ```
131
132
 
132
- Poznámky pro skill:
133
- - skill preferovat CLI, ne ručně skládané `fetch` skripty
134
- - `id` musí být lowercase slug s písmeny, čísly a pomlčkami
135
- - `contentLang` určuje jazyk workshopového obsahu pro dashboard, presenter a skill delivery; není to totéž jako UI language
136
- - když skill volá create opakovaně se stejným `id`, route vrací `created: false` a existující instance record
137
- - nehádej venue metadata zkráceně, když je facilitátor zná; pošli je rovnou při create
133
+ Notes for the skill:
134
+ - prefer the CLI, not hand-written `fetch` scripts
135
+ - `id` must be a lowercase slug with letters, numbers, and hyphens
136
+ - `contentLang` controls workshop-content language for dashboard, presenter, and skill delivery; it is not the same as UI language
137
+ - when the skill calls create repeatedly with the same `id`, the route returns `created: false` and the existing instance record
138
+ - do not guess venue metadata in abbreviated form if the facilitator already knows it; send it during create
138
139
 
139
140
  ### `/workshop facilitator update-instance <instance-id>`
140
141
 
141
- Preferovaný path:
142
+ Preferred path:
142
143
 
143
144
  ```bash
144
- harness workshop update-instance developer-hackathon-praha-24-4-saturn \
145
+ harness workshop update-instance sample-workshop-demo-orbit \
145
146
  --content-lang en \
146
- --event-title "Developer Hackathon Praha" \
147
- --date-range "24. dubna 2026" \
148
- --venue-name "Seyfor Praha jednička 103" \
149
- --room-name Saturn \
150
- --address-line "CZ, Praha 8, Sokolovska 695/115b" \
151
- --location-details "17 osob + lektor" \
152
- --facilitator-label Ondrej
147
+ --event-title "Sample Workshop Demo" \
148
+ --date-range "June 15, 2026" \
149
+ --venue-name "Example Campus North" \
150
+ --room-name Orbit \
151
+ --address-line "Example Avenue 123" \
152
+ --location-details "12 participants + facilitator" \
153
+ --facilitator-label Alex
153
154
  ```
154
155
 
155
156
  Raw API reference:
@@ -161,27 +162,53 @@ Content-Type: application/json
161
162
  {
162
163
  "action": "update_metadata",
163
164
  "contentLang": "en",
164
- "eventTitle": "Developer Hackathon Praha",
165
- "dateRange": "24. dubna 2026",
166
- "venueName": "Seyfor Praha jednička 103",
167
- "roomName": "Saturn",
168
- "addressLine": "CZ, Praha 8, Sokolovska 695/115b",
169
- "locationDetails": "17 osob + lektor",
170
- "facilitatorLabel": "Ondrej"
165
+ "eventTitle": "Sample Workshop Demo",
166
+ "dateRange": "June 15, 2026",
167
+ "venueName": "Example Campus North",
168
+ "roomName": "Orbit",
169
+ "addressLine": "Example Avenue 123",
170
+ "locationDetails": "12 participants + facilitator",
171
+ "facilitatorLabel": "Alex"
172
+ }
173
+ ```
174
+
175
+ Rules:
176
+ - send only the fields you want to change
177
+ - do not use reset for an ordinary title, venue, or room correction
178
+ - if the route returns `400`, the payload is wrong; if it returns `404`, the instance does not exist
179
+
180
+ ### `/workshop facilitator reset-instance <instance-id>`
181
+
182
+ Preferred path:
183
+
184
+ ```bash
185
+ harness workshop reset-instance sample-workshop-demo-orbit --template-id blueprint-default
186
+ ```
187
+
188
+ Raw API reference:
189
+
190
+ ```http
191
+ PATCH {DASHBOARD_URL}/api/workshop/instances/{instanceId}
192
+ Content-Type: application/json
193
+
194
+ {
195
+ "action": "reset",
196
+ "templateId": "blueprint-default"
171
197
  }
172
198
  ```
173
199
 
174
- Pravidla:
175
- - pošli jen fieldy, které chceš změnit
176
- - nepoužívej reset pro obyčejnou opravu názvu, venue nebo room
177
- - když route vrátí `400`, payload je špatně; když vrátí `404`, instance neexistuje
200
+ Rules:
201
+ - use this when the goal is to re-import fresh blueprint-owned workshop content into an existing instance
202
+ - warn that reset archives current runtime state first and then clears live runtime state for the instance
203
+ - prefer `update-instance` for ordinary metadata corrections; reset is the high-impact operation
204
+ - if the facilitator does not specify a template, keep the current template unless there is a clear reason to switch
178
205
 
179
206
  ### `/workshop facilitator prepare`
180
207
 
181
- Preferovaný path:
208
+ Preferred path:
182
209
 
183
210
  ```bash
184
- harness workshop prepare developer-hackathon-praha-24-4-saturn
211
+ harness workshop prepare sample-workshop-demo-orbit
185
212
  ```
186
213
 
187
214
  Raw API reference:
@@ -190,17 +217,17 @@ Raw API reference:
190
217
  POST {DASHBOARD_URL}/api/workshop
191
218
  Content-Type: application/json
192
219
 
193
- { "action": "prepare", "instanceId": "developer-hackathon-praha-24-4-saturn" }
220
+ { "action": "prepare", "instanceId": "sample-workshop-demo-orbit" }
194
221
  ```
195
222
 
196
- Nastaví instanci do stavu `prepared`, ověří event code.
223
+ This sets the instance to `prepared` state and verifies the event code.
197
224
 
198
225
  ### `/workshop facilitator remove-instance <instance-id>`
199
226
 
200
- Preferovaný path:
227
+ Preferred path:
201
228
 
202
229
  ```bash
203
- harness workshop remove-instance developer-hackathon-praha-24-4-saturn
230
+ harness workshop remove-instance sample-workshop-demo-orbit
204
231
  ```
205
232
 
206
233
  Raw API reference:
@@ -212,13 +239,13 @@ Content-Type: application/json
212
239
  { "action": "remove" }
213
240
  ```
214
241
 
215
- Pravidla:
216
- - remove zůstává owner-only operace
217
- - skill facilitátora upozornit, že jde o destruktivní odebrání z aktivního seznamu, ne o běžnou editaci metadata
242
+ Rules:
243
+ - remove remains an owner-only operation
244
+ - the skill should warn the facilitator that this is destructive removal from the active list, not routine metadata editing
218
245
 
219
246
  ### `/workshop facilitator agenda`
220
247
 
221
- Lokální editace agendy pro konkrétní instanci používá instanční route:
248
+ Local agenda editing for a specific instance uses the per-instance route:
222
249
 
223
250
  ```http
224
251
  GET {DASHBOARD_URL}/api/workshop/instances/{instanceId}/agenda
@@ -227,7 +254,7 @@ POST {DASHBOARD_URL}/api/workshop/instances/{instanceId}/agenda
227
254
  DELETE {DASHBOARD_URL}/api/workshop/instances/{instanceId}/agenda
228
255
  ```
229
256
 
230
- Příklady:
257
+ Examples:
231
258
 
232
259
  ```http
233
260
  PATCH {DASHBOARD_URL}/api/workshop/instances/{instanceId}/agenda
@@ -269,28 +296,36 @@ Content-Type: application/json
269
296
  }
270
297
  ```
271
298
 
272
- Pravidla:
299
+ Rules:
273
300
 
274
- - agenda item je facilitátorský pack, ne jen `title/time/description`
275
- - preferované fieldy jsou `goal`, `roomSummary`, `facilitatorPrompts`, `watchFors`, `checkpointQuestions`
276
- - `description` zůstává compatibility field pro starší surface; pro room-facing shrnutí preferuj `roomSummary`
277
- - používej kanonická agenda ids jako `opening`, `talk`, `demo`, `build-1`, `intermezzo-1`, `rotation`, `build-2`, `intermezzo-2`, `reveal`
278
- - skill nemá vymýšlet vlastní názvy workshop momentů mimo tuto kostru
301
+ - an agenda item is a facilitator pack, not just `title/time/description`
302
+ - preferred fields are `goal`, `roomSummary`, `facilitatorPrompts`, `watchFors`, and `checkpointQuestions`
303
+ - `description` remains a compatibility field for older surfaces; prefer `roomSummary` for room-facing summaries
304
+ - use canonical agenda ids such as `opening`, `talk`, `demo`, `build-1`, `intermezzo-1`, `rotation`, `build-2`, `intermezzo-2`, and `reveal`
305
+ - the skill should not invent custom workshop moment names outside this skeleton
279
306
 
280
307
  ### `/workshop facilitator scenes`
281
308
 
282
- Presenter scenes jsou agenda-linked room-facing výstupy pro facilitátora a projektor. Skill umět:
309
+ Presenter scenes are agenda-linked, room-facing outputs for the facilitator and projector. The skill should be able to:
310
+
311
+ - list scenes for the whole instance or a specific agenda item
312
+ - create a new scene
313
+ - edit content, label, scene type, and CTA
314
+ - change the default scene for a given agenda item
315
+ - reorder scenes
316
+ - hide or re-enable a scene
317
+ - delete a local scene
318
+ - read and optionally edit `facilitatorNotes`, `sourceRefs`, and `blocks`
319
+
320
+ Rich-scene rules:
283
321
 
284
- - vypsat scény pro celou instanci nebo konkrétní agenda item
285
- - vytvořit novou scénu
286
- - upravit obsah, label, scene type a CTA
287
- - změnit default scénu pro danou agenda položku
288
- - přeuspořádat scény
289
- - skrýt nebo znovu povolit scénu
290
- - smazat lokální scénu
291
- - číst a případně upravit `facilitatorNotes`, `sourceRefs` a `blocks`
322
+ - keep presenter scenes agenda-linked; do not invent a separate slide-deck source of truth
323
+ - prefer one dominant voice and one main idea per scene
324
+ - for reusable visuals, prefer reviewed local blueprint assets and metadata over ad hoc remote image URLs
325
+ - runtime edits remain instance-local until a maintainer deliberately publishes them back into the repo
326
+ - when working in the source repo, use the maintainer playbook in `docs/presenter-rich-scene-authoring.md` for drafting, refinement, and publish-back
292
327
 
293
- Instanční route:
328
+ Per-instance route:
294
329
 
295
330
  ```http
296
331
  GET {DASHBOARD_URL}/api/workshop/instances/{instanceId}/scenes
@@ -300,7 +335,7 @@ PATCH {DASHBOARD_URL}/api/workshop/instances/{instanceId}/scenes
300
335
  DELETE {DASHBOARD_URL}/api/workshop/instances/{instanceId}/scenes
301
336
  ```
302
337
 
303
- Příklady:
338
+ Examples:
304
339
 
305
340
  ```http
306
341
  POST {DASHBOARD_URL}/api/workshop/instances/{instanceId}/scenes
@@ -312,28 +347,28 @@ Content-Type: application/json
312
347
  "sceneType": "demo",
313
348
  "intent": "walkthrough",
314
349
  "chromePreset": "agenda",
315
- "title": "Nejdřív bez kontextu, potom s mapou",
350
+ "title": "Context first, then motion",
316
351
  "facilitatorNotes": [
317
- "Držte jednu story, ne přehlídku funkcí."
352
+ "Keep one story rather than a feature parade."
318
353
  ],
319
354
  "blocks": [
320
355
  {
321
356
  "id": "hero",
322
357
  "type": "hero",
323
- "title": "Nejdřív bez kontextu, potom s mapou",
324
- "body": "Ukažte rozdíl mezi prompt blobem a krátkou mapou zapsanou v repu."
358
+ "title": "Context first, then motion",
359
+ "body": "Show the difference between a prompt blob and a short map stored in the repo."
325
360
  },
326
361
  {
327
362
  "id": "questions",
328
363
  "type": "bullet-list",
329
- "title": "Pointa",
364
+ "title": "Point",
330
365
  "items": [
331
- "Co není v repu, neexistuje.",
332
- "Kontext je páka, ne kosmetika."
366
+ "If it is not in the repo, it does not exist.",
367
+ "Context is leverage, not cosmetics."
333
368
  ]
334
369
  }
335
370
  ],
336
- "ctaLabel": "Potom přepnout na participant walkthrough"
371
+ "ctaLabel": "Then switch to participant walkthrough"
337
372
  }
338
373
  ```
339
374
 
@@ -345,17 +380,17 @@ Content-Type: application/json
345
380
  "action": "update",
346
381
  "agendaItemId": "talk",
347
382
  "sceneId": "scene-123",
348
- "label": "Upravený demo flow",
383
+ "label": "Updated demo flow",
349
384
  "sceneType": "demo",
350
385
  "intent": "walkthrough",
351
386
  "chromePreset": "agenda",
352
- "title": "Jedna story, ne přehlídka funkcí",
387
+ "title": "One story, not a feature parade",
353
388
  "blocks": [
354
389
  {
355
390
  "id": "hero",
356
391
  "type": "hero",
357
- "title": "Jedna story, ne přehlídka funkcí",
358
- "body": "Neukazujte pět režimů práce. Ukažte jeden čitelný workflow."
392
+ "title": "One story, not a feature parade",
393
+ "body": "Do not show five working modes. Show one readable workflow."
359
394
  }
360
395
  ]
361
396
  }
@@ -389,22 +424,23 @@ Content-Type: application/json
389
424
  { "agendaItemId": "talk", "sceneId": "scene-123" }
390
425
  ```
391
426
 
392
- Když facilitátor chce změnit wording, flow nebo participant walkthrough přes coding agenta, preferuj tuto route místo ručního popisu změn v UI.
427
+ When the facilitator wants to change wording, flow, or participant walkthrough through a coding agent, prefer this route instead of manually describing UI edits.
393
428
 
394
- Při práci přes API:
429
+ During API work:
395
430
 
396
- - neznámé `agendaItemId` nebo `sceneId` vrací `404`
397
- - malformed payload pořád vrací `400`
398
- - skill stale target ids hlásit explicitně, ne pokračovat jako by se změna povedla
399
- - room-facing obsah patří do `blocks`, facilitátorské pokyny do `facilitatorNotes`
400
- - `title/body` zůstávají kvůli compatibility, ale skill preferovat strukturované `blocks`
401
- - když runtime agenda existuje, skill číst a citovat její `goal`, `roomSummary`, `facilitatorPrompts`, `watchFors`, `checkpointQuestions`, `facilitatorNotes` a `blocks`
402
- - když runtime data nejsou dostupná, fallbackni na blueprint a facilitační docs z repa a explicitně to řekni
431
+ - unknown `agendaItemId` or `sceneId` returns `404`
432
+ - malformed payload still returns `400`
433
+ - the skill must report stale target ids explicitly rather than acting as if the change succeeded
434
+ - room-facing content belongs in `blocks`, facilitator instructions in `facilitatorNotes`
435
+ - `title/body` remain for compatibility, but the skill should prefer structured `blocks`
436
+ - when runtime agenda exists, the skill should read and cite its `goal`, `roomSummary`, `facilitatorPrompts`, `watchFors`, `checkpointQuestions`, `facilitatorNotes`, and `blocks`
437
+ - when runtime data is unavailable, fall back to the blueprint and facilitation docs in the repo and say so explicitly
403
438
 
404
439
  ### `/workshop facilitator archive`
405
440
 
406
- Zavolej:
407
- ```
441
+ Call:
442
+
443
+ ```http
408
444
  POST {DASHBOARD_URL}/api/workshop/archive
409
445
  Content-Type: application/json
410
446
 
@@ -413,14 +449,14 @@ Content-Type: application/json
413
449
 
414
450
  ## Environment
415
451
 
416
- Agent potřebuje vědět URL dashboardu:
417
- - `HARNESS_DASHBOARD_URL` URL produkčního nebo preview dashboardu
418
- - Pokud není nastaveno, použij `https://harness-lab-dashboard.vercel.app`
452
+ The agent needs to know the dashboard URL:
453
+ - `HARNESS_DASHBOARD_URL` - the production or preview dashboard URL
454
+ - if not set, use `https://harness-lab-dashboard.vercel.app`
419
455
 
420
- ## Poznámky
456
+ ## Notes
421
457
 
422
- - Facilitátorské příkazy jsou oddělené od participant příkazů
423
- - `/workshop facilitator login` facilitátora navést do `harness auth login`
424
- - Všechny ostatní privileged příkazy používají CLI-backed uloženou session
425
- - Pokud session expiruje, agent řekne facilitátorovi, aby se znovu přihlásil
426
- - Tyto příkazy nikdy nezobrazuj participant účastníkům
458
+ - facilitator commands are separate from participant commands
459
+ - `/workshop facilitator login` should steer the facilitator into `harness auth login`
460
+ - all other privileged commands use the stored CLI-backed session
461
+ - if the session expires, tell the facilitator to log in again
462
+ - never surface these commands to participants
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@harness-lab/cli",
3
- "version": "0.2.4",
3
+ "version": "0.2.7",
4
4
  "description": "Participant-facing Harness Lab CLI for facilitator auth and workshop operations",
5
- "license": "UNLICENSED",
5
+ "license": "MIT",
6
6
  "type": "module",
7
7
  "repository": {
8
8
  "type": "git",
package/src/client.js CHANGED
@@ -108,6 +108,15 @@ export function createHarnessClient({ fetchFn, session }) {
108
108
  body: { action: "update_metadata", ...input },
109
109
  });
110
110
  },
111
+ resetWorkshopInstance(instanceId, templateId) {
112
+ return request(`/api/workshop/instances/${encodeURIComponent(instanceId)}`, {
113
+ method: "PATCH",
114
+ body: {
115
+ action: "reset",
116
+ ...(templateId ? { templateId } : {}),
117
+ },
118
+ });
119
+ },
111
120
  prepareWorkshopInstance(instanceId) {
112
121
  return request("/api/workshop", {
113
122
  method: "POST",
package/src/run-cli.js CHANGED
@@ -178,6 +178,7 @@ function printUsage(io, ui) {
178
178
  "harness workshop archive [--notes TEXT]",
179
179
  "harness workshop create-instance [<instance-id>] [--template-id ID] [--event-title TEXT] [--city CITY]",
180
180
  "harness workshop update-instance <instance-id> [--event-title TEXT] [--city CITY]",
181
+ "harness workshop reset-instance <instance-id> [--template-id ID]",
181
182
  "harness workshop prepare <instance-id>",
182
183
  "harness workshop remove-instance <instance-id>",
183
184
  "harness workshop phase set <phase-id>",
@@ -731,6 +732,41 @@ async function handleWorkshopPrepare(io, ui, env, positionals, flags, deps) {
731
732
  }
732
733
  }
733
734
 
735
+ async function handleWorkshopResetInstance(io, ui, env, positionals, flags, deps) {
736
+ const session = await requireSession(io, ui, env);
737
+ if (!session) {
738
+ return 1;
739
+ }
740
+
741
+ const instanceId = await readRequiredCommandValue(
742
+ io,
743
+ flags,
744
+ ["id", "instance-id"],
745
+ "Instance id: ",
746
+ readOptionalPositional(positionals, 2),
747
+ );
748
+ if (!instanceId) {
749
+ ui.status("error", "Instance id is required.", { stream: "stderr" });
750
+ return 1;
751
+ }
752
+
753
+ try {
754
+ const client = createHarnessClient({ fetchFn: deps.fetchFn, session });
755
+ const result = await client.resetWorkshopInstance(
756
+ instanceId,
757
+ readStringFlag(flags, "template-id", "template"),
758
+ );
759
+ ui.json("Workshop Reset Instance", result);
760
+ return 0;
761
+ } catch (error) {
762
+ if (error instanceof HarnessApiError) {
763
+ ui.status("error", `Reset instance failed: ${error.message}`, { stream: "stderr" });
764
+ return 1;
765
+ }
766
+ throw error;
767
+ }
768
+ }
769
+
734
770
  async function handleWorkshopRemoveInstance(io, ui, env, positionals, flags, deps) {
735
771
  const session = await requireSession(io, ui, env);
736
772
  if (!session) {
@@ -856,6 +892,10 @@ export async function runCli(argv, io, deps = {}) {
856
892
  return handleWorkshopUpdateInstance(io, ui, io.env, positionals, flags, mergedDeps);
857
893
  }
858
894
 
895
+ if (scope === "workshop" && action === "reset-instance") {
896
+ return handleWorkshopResetInstance(io, ui, io.env, positionals, flags, mergedDeps);
897
+ }
898
+
859
899
  if (scope === "workshop" && action === "prepare") {
860
900
  return handleWorkshopPrepare(io, ui, io.env, positionals, flags, mergedDeps);
861
901
  }