@harness-lab/cli 0.2.3 → 0.2.6

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
@@ -36,6 +36,11 @@ Participant-facing default install:
36
36
  npm install -g @harness-lab/cli
37
37
  ```
38
38
 
39
+ Supported runtime:
40
+
41
+ - Node `22` or newer
42
+ - npm `10` or newer recommended
43
+
39
44
  Verify the binary:
40
45
 
41
46
  ```bash
@@ -116,10 +121,10 @@ Workshop commands:
116
121
  harness auth status
117
122
  harness skill install
118
123
  harness workshop status
119
- harness workshop create-instance developer-hackathon-praha-24-4-saturn --event-title "Developer Hackathon Praha"
120
- harness workshop update-instance developer-hackathon-praha-24-4-saturn --room-name Saturn
121
- harness workshop prepare developer-hackathon-praha-24-4-saturn
122
- 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
123
128
  harness workshop phase set rotation
124
129
  harness workshop archive --notes "Manual archive"
125
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
@@ -297,7 +311,8 @@ Relevant local files:
297
311
  ## Style
298
312
 
299
313
  - Be concise and directive.
300
- - Use Czech for explanations.
314
+ - Use the resolved response language.
315
+ - English is the default bundled fallback locale when no live or user-language signal overrides it.
301
316
  - Keep command names, file names, and code terms in English.
302
317
  - Prefer actionable next steps over theory during build phases.
303
318
  - 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.3",
5
- "contentHash": "9e57d44e4a3f9296f4913cd51eefbf9dff7d6d9da8d4afb1ae5a2ce2a7dc4323",
4
+ "bundleVersion": "0.2.6",
5
+ "contentHash": "9e7a3c6549f06cbe59278c731c73ae8c21f7e38cf82cbc533f1e708ccf47602c",
6
6
  "files": [
7
7
  {
8
8
  "path": "content/challenge-cards/.gitkeep",
@@ -134,7 +134,7 @@
134
134
  },
135
135
  {
136
136
  "path": "SKILL.md",
137
- "sha256": "b25a7730eb123edd941bcb176bd861ad209868189601c49845d1b6892f689647"
137
+ "sha256": "107f2ba2574d358ed2ccd1c669a47008574517b811475c866247b0199836ae5b"
138
138
  },
139
139
  {
140
140
  "path": "workshop-blueprint/agenda.json",
@@ -182,7 +182,7 @@
182
182
  },
183
183
  {
184
184
  "path": "workshop-skill/facilitator.md",
185
- "sha256": "39dcb46914f19b66fd270627f42702b1f394ceb05dd0f3cf1f0c514becb6dca1"
185
+ "sha256": "22775cb783e825eeec83886932c801db1ff7e3617c170fee848b6071fa63d8a3"
186
186
  },
187
187
  {
188
188
  "path": "workshop-skill/follow-up-package.md",
@@ -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,27 @@ 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"
171
172
  }
172
173
  ```
173
174
 
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
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
178
179
 
179
180
  ### `/workshop facilitator prepare`
180
181
 
181
- Preferovaný path:
182
+ Preferred path:
182
183
 
183
184
  ```bash
184
- harness workshop prepare developer-hackathon-praha-24-4-saturn
185
+ harness workshop prepare sample-workshop-demo-orbit
185
186
  ```
186
187
 
187
188
  Raw API reference:
@@ -190,17 +191,17 @@ Raw API reference:
190
191
  POST {DASHBOARD_URL}/api/workshop
191
192
  Content-Type: application/json
192
193
 
193
- { "action": "prepare", "instanceId": "developer-hackathon-praha-24-4-saturn" }
194
+ { "action": "prepare", "instanceId": "sample-workshop-demo-orbit" }
194
195
  ```
195
196
 
196
- Nastaví instanci do stavu `prepared`, ověří event code.
197
+ This sets the instance to `prepared` state and verifies the event code.
197
198
 
198
199
  ### `/workshop facilitator remove-instance <instance-id>`
199
200
 
200
- Preferovaný path:
201
+ Preferred path:
201
202
 
202
203
  ```bash
203
- harness workshop remove-instance developer-hackathon-praha-24-4-saturn
204
+ harness workshop remove-instance sample-workshop-demo-orbit
204
205
  ```
205
206
 
206
207
  Raw API reference:
@@ -212,13 +213,13 @@ Content-Type: application/json
212
213
  { "action": "remove" }
213
214
  ```
214
215
 
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
216
+ Rules:
217
+ - remove remains an owner-only operation
218
+ - the skill should warn the facilitator that this is destructive removal from the active list, not routine metadata editing
218
219
 
219
220
  ### `/workshop facilitator agenda`
220
221
 
221
- Lokální editace agendy pro konkrétní instanci používá instanční route:
222
+ Local agenda editing for a specific instance uses the per-instance route:
222
223
 
223
224
  ```http
224
225
  GET {DASHBOARD_URL}/api/workshop/instances/{instanceId}/agenda
@@ -227,7 +228,7 @@ POST {DASHBOARD_URL}/api/workshop/instances/{instanceId}/agenda
227
228
  DELETE {DASHBOARD_URL}/api/workshop/instances/{instanceId}/agenda
228
229
  ```
229
230
 
230
- Příklady:
231
+ Examples:
231
232
 
232
233
  ```http
233
234
  PATCH {DASHBOARD_URL}/api/workshop/instances/{instanceId}/agenda
@@ -269,28 +270,28 @@ Content-Type: application/json
269
270
  }
270
271
  ```
271
272
 
272
- Pravidla:
273
+ Rules:
273
274
 
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
275
+ - an agenda item is a facilitator pack, not just `title/time/description`
276
+ - preferred fields are `goal`, `roomSummary`, `facilitatorPrompts`, `watchFors`, and `checkpointQuestions`
277
+ - `description` remains a compatibility field for older surfaces; prefer `roomSummary` for room-facing summaries
278
+ - use canonical agenda ids such as `opening`, `talk`, `demo`, `build-1`, `intermezzo-1`, `rotation`, `build-2`, `intermezzo-2`, and `reveal`
279
+ - the skill should not invent custom workshop moment names outside this skeleton
279
280
 
280
281
  ### `/workshop facilitator scenes`
281
282
 
282
- Presenter scenes jsou agenda-linked room-facing výstupy pro facilitátora a projektor. Skill umět:
283
+ Presenter scenes are agenda-linked, room-facing outputs for the facilitator and projector. The skill should be able to:
283
284
 
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`
285
+ - list scenes for the whole instance or a specific agenda item
286
+ - create a new scene
287
+ - edit content, label, scene type, and CTA
288
+ - change the default scene for a given agenda item
289
+ - reorder scenes
290
+ - hide or re-enable a scene
291
+ - delete a local scene
292
+ - read and optionally edit `facilitatorNotes`, `sourceRefs`, and `blocks`
292
293
 
293
- Instanční route:
294
+ Per-instance route:
294
295
 
295
296
  ```http
296
297
  GET {DASHBOARD_URL}/api/workshop/instances/{instanceId}/scenes
@@ -300,7 +301,7 @@ PATCH {DASHBOARD_URL}/api/workshop/instances/{instanceId}/scenes
300
301
  DELETE {DASHBOARD_URL}/api/workshop/instances/{instanceId}/scenes
301
302
  ```
302
303
 
303
- Příklady:
304
+ Examples:
304
305
 
305
306
  ```http
306
307
  POST {DASHBOARD_URL}/api/workshop/instances/{instanceId}/scenes
@@ -312,28 +313,28 @@ Content-Type: application/json
312
313
  "sceneType": "demo",
313
314
  "intent": "walkthrough",
314
315
  "chromePreset": "agenda",
315
- "title": "Nejdřív bez kontextu, potom s mapou",
316
+ "title": "Context first, then motion",
316
317
  "facilitatorNotes": [
317
- "Držte jednu story, ne přehlídku funkcí."
318
+ "Keep one story rather than a feature parade."
318
319
  ],
319
320
  "blocks": [
320
321
  {
321
322
  "id": "hero",
322
323
  "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."
324
+ "title": "Context first, then motion",
325
+ "body": "Show the difference between a prompt blob and a short map stored in the repo."
325
326
  },
326
327
  {
327
328
  "id": "questions",
328
329
  "type": "bullet-list",
329
- "title": "Pointa",
330
+ "title": "Point",
330
331
  "items": [
331
- "Co není v repu, neexistuje.",
332
- "Kontext je páka, ne kosmetika."
332
+ "If it is not in the repo, it does not exist.",
333
+ "Context is leverage, not cosmetics."
333
334
  ]
334
335
  }
335
336
  ],
336
- "ctaLabel": "Potom přepnout na participant walkthrough"
337
+ "ctaLabel": "Then switch to participant walkthrough"
337
338
  }
338
339
  ```
339
340
 
@@ -345,17 +346,17 @@ Content-Type: application/json
345
346
  "action": "update",
346
347
  "agendaItemId": "talk",
347
348
  "sceneId": "scene-123",
348
- "label": "Upravený demo flow",
349
+ "label": "Updated demo flow",
349
350
  "sceneType": "demo",
350
351
  "intent": "walkthrough",
351
352
  "chromePreset": "agenda",
352
- "title": "Jedna story, ne přehlídka funkcí",
353
+ "title": "One story, not a feature parade",
353
354
  "blocks": [
354
355
  {
355
356
  "id": "hero",
356
357
  "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."
358
+ "title": "One story, not a feature parade",
359
+ "body": "Do not show five working modes. Show one readable workflow."
359
360
  }
360
361
  ]
361
362
  }
@@ -389,22 +390,23 @@ Content-Type: application/json
389
390
  { "agendaItemId": "talk", "sceneId": "scene-123" }
390
391
  ```
391
392
 
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.
393
+ 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
394
 
394
- Při práci přes API:
395
+ During API work:
395
396
 
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
397
+ - unknown `agendaItemId` or `sceneId` returns `404`
398
+ - malformed payload still returns `400`
399
+ - the skill must report stale target ids explicitly rather than acting as if the change succeeded
400
+ - room-facing content belongs in `blocks`, facilitator instructions in `facilitatorNotes`
401
+ - `title/body` remain for compatibility, but the skill should prefer structured `blocks`
402
+ - when runtime agenda exists, the skill should read and cite its `goal`, `roomSummary`, `facilitatorPrompts`, `watchFors`, `checkpointQuestions`, `facilitatorNotes`, and `blocks`
403
+ - when runtime data is unavailable, fall back to the blueprint and facilitation docs in the repo and say so explicitly
403
404
 
404
405
  ### `/workshop facilitator archive`
405
406
 
406
- Zavolej:
407
- ```
407
+ Call:
408
+
409
+ ```http
408
410
  POST {DASHBOARD_URL}/api/workshop/archive
409
411
  Content-Type: application/json
410
412
 
@@ -413,14 +415,14 @@ Content-Type: application/json
413
415
 
414
416
  ## Environment
415
417
 
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`
418
+ The agent needs to know the dashboard URL:
419
+ - `HARNESS_DASHBOARD_URL` - the production or preview dashboard URL
420
+ - if not set, use `https://harness-lab-dashboard.vercel.app`
419
421
 
420
- ## Poznámky
422
+ ## Notes
421
423
 
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
424
+ - facilitator commands are separate from participant commands
425
+ - `/workshop facilitator login` should steer the facilitator into `harness auth login`
426
+ - all other privileged commands use the stored CLI-backed session
427
+ - if the session expires, tell the facilitator to log in again
428
+ - 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.3",
3
+ "version": "0.2.6",
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",
@@ -20,7 +20,7 @@
20
20
  "ai-agents"
21
21
  ],
22
22
  "engines": {
23
- "node": "22.x"
23
+ "node": ">=22"
24
24
  },
25
25
  "publishConfig": {
26
26
  "access": "public"
@@ -63,7 +63,29 @@ export async function pathExists(targetPath) {
63
63
 
64
64
  async function copyDirectoryTree(sourceRoot, targetRoot) {
65
65
  for (const [sourceRelativePath, targetRelativePath] of DIRECTORY_COPIES) {
66
- await fs.cp(path.join(sourceRoot, sourceRelativePath), path.join(targetRoot, targetRelativePath), { recursive: true });
66
+ await copyDirectoryRecursive(
67
+ path.join(sourceRoot, sourceRelativePath),
68
+ path.join(targetRoot, targetRelativePath),
69
+ );
70
+ }
71
+ }
72
+
73
+ async function copyDirectoryRecursive(sourcePath, targetPath) {
74
+ const entries = await fs.readdir(sourcePath, { withFileTypes: true });
75
+ await fs.mkdir(targetPath, { recursive: true });
76
+
77
+ for (const entry of entries) {
78
+ const sourceEntryPath = path.join(sourcePath, entry.name);
79
+ const targetEntryPath = path.join(targetPath, entry.name);
80
+
81
+ if (entry.isDirectory()) {
82
+ await copyDirectoryRecursive(sourceEntryPath, targetEntryPath);
83
+ continue;
84
+ }
85
+
86
+ if (entry.isFile()) {
87
+ await fs.copyFile(sourceEntryPath, targetEntryPath);
88
+ }
67
89
  }
68
90
  }
69
91