@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 +4 -4
- package/assets/workshop-bundle/SKILL.md +38 -10
- package/assets/workshop-bundle/bundle-manifest.json +8 -8
- package/assets/workshop-bundle/content/facilitation/master-guide.md +94 -3
- package/assets/workshop-bundle/content/talks/context-is-king.md +35 -3
- package/assets/workshop-bundle/docs/harness-cli-foundation.md +8 -1
- package/assets/workshop-bundle/workshop-blueprint/day-structure.md +25 -0
- package/assets/workshop-bundle/workshop-skill/facilitator.md +172 -136
- package/package.json +2 -2
- package/src/client.js +9 -0
- package/src/run-cli.js +40 -0
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
|
|
125
|
-
harness workshop update-instance
|
|
126
|
-
harness workshop prepare
|
|
127
|
-
harness workshop remove-instance
|
|
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
|
|
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 =
|
|
31
|
-
- dashboard facilitator surface =
|
|
32
|
-
- workshop skill = AI interface
|
|
33
|
-
- workshop blueprint =
|
|
34
|
-
- `uiLang` =
|
|
35
|
-
- `contentLang` =
|
|
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,
|
|
60
|
-
- for bundled fallback docs, resolve `workshop-skill/locales/<locale>/...` first; if a reviewed localized doc does not exist yet, fall back to
|
|
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
|
|
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.
|
|
5
|
-
"contentHash": "
|
|
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": "
|
|
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": "
|
|
101
|
+
"sha256": "4d0972fefac067de0b8803698b44bdf8ab0bee64b181d50d1ac5e26a92eb7089"
|
|
102
102
|
},
|
|
103
103
|
{
|
|
104
104
|
"path": "docs/harness-cli-foundation.md",
|
|
105
|
-
"sha256": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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
|
-
|
|
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
|
|
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
|
-
-
|
|
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í
|
|
3
|
+
## Otevírací modul
|
|
4
4
|
|
|
5
|
-
|
|
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ý
|
|
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
|
-
|
|
3
|
+
Commands for facilitators who manage workshop instances through an AI agent.
|
|
4
4
|
|
|
5
5
|
## Auth
|
|
6
6
|
|
|
7
|
-
|
|
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
|
-
|
|
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
|
|
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`
|
|
21
|
-
-
|
|
22
|
-
- instance grant
|
|
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
|
-
|
|
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 /
|
|
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 /
|
|
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
|
-
|
|
40
|
-
- CLI
|
|
41
|
-
-
|
|
42
|
-
- `--auth basic`
|
|
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
|
-
|
|
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
|
-
|
|
56
|
+
Preferred path:
|
|
57
57
|
|
|
58
58
|
```bash
|
|
59
59
|
harness workshop status
|
|
60
60
|
```
|
|
61
61
|
|
|
62
|
-
|
|
63
|
-
-
|
|
64
|
-
-
|
|
65
|
-
-
|
|
66
|
-
-
|
|
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
|
-
|
|
70
|
+
Use the CLI-backed privileged request path. The skill should not handle auth bootstrap itself.
|
|
71
71
|
|
|
72
|
-
API capability
|
|
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
|
-
|
|
81
|
+
Requires `owner` role. Returns the new grant info.
|
|
82
82
|
|
|
83
83
|
### `/workshop facilitator revoke <email>`
|
|
84
84
|
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
|
|
92
|
+
Requires `owner` role.
|
|
92
93
|
|
|
93
94
|
### `/workshop facilitator create-instance`
|
|
94
95
|
|
|
95
|
-
|
|
96
|
+
The preferred path is a CLI command over the shared runtime API:
|
|
96
97
|
|
|
97
98
|
```bash
|
|
98
|
-
harness workshop create-instance
|
|
99
|
+
harness workshop create-instance sample-workshop-demo-orbit \
|
|
99
100
|
--template-id blueprint-default \
|
|
100
|
-
--content-lang
|
|
101
|
-
--event-title "
|
|
102
|
-
--city
|
|
103
|
-
--date-range "
|
|
104
|
-
--venue-name "
|
|
105
|
-
--room-name
|
|
106
|
-
--address-line "
|
|
107
|
-
--location-details "
|
|
108
|
-
--facilitator-label
|
|
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
|
-
|
|
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": "
|
|
119
|
+
"id": "sample-workshop-demo-orbit",
|
|
119
120
|
"templateId": "blueprint-default",
|
|
120
|
-
"contentLang": "
|
|
121
|
-
"eventTitle": "
|
|
122
|
-
"city": "
|
|
123
|
-
"dateRange": "
|
|
124
|
-
"venueName": "
|
|
125
|
-
"roomName": "
|
|
126
|
-
"addressLine": "
|
|
127
|
-
"locationDetails": "
|
|
128
|
-
"facilitatorLabel": "
|
|
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
|
-
|
|
133
|
-
-
|
|
134
|
-
- `id`
|
|
135
|
-
- `contentLang`
|
|
136
|
-
-
|
|
137
|
-
-
|
|
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
|
-
|
|
142
|
+
Preferred path:
|
|
142
143
|
|
|
143
144
|
```bash
|
|
144
|
-
harness workshop update-instance
|
|
145
|
+
harness workshop update-instance sample-workshop-demo-orbit \
|
|
145
146
|
--content-lang en \
|
|
146
|
-
--event-title "
|
|
147
|
-
--date-range "
|
|
148
|
-
--venue-name "
|
|
149
|
-
--room-name
|
|
150
|
-
--address-line "
|
|
151
|
-
--location-details "
|
|
152
|
-
--facilitator-label
|
|
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": "
|
|
165
|
-
"dateRange": "
|
|
166
|
-
"venueName": "
|
|
167
|
-
"roomName": "
|
|
168
|
-
"addressLine": "
|
|
169
|
-
"locationDetails": "
|
|
170
|
-
"facilitatorLabel": "
|
|
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
|
-
|
|
175
|
-
-
|
|
176
|
-
-
|
|
177
|
-
-
|
|
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
|
-
|
|
208
|
+
Preferred path:
|
|
182
209
|
|
|
183
210
|
```bash
|
|
184
|
-
harness workshop prepare
|
|
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": "
|
|
220
|
+
{ "action": "prepare", "instanceId": "sample-workshop-demo-orbit" }
|
|
194
221
|
```
|
|
195
222
|
|
|
196
|
-
|
|
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
|
-
|
|
227
|
+
Preferred path:
|
|
201
228
|
|
|
202
229
|
```bash
|
|
203
|
-
harness workshop remove-instance
|
|
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
|
-
|
|
216
|
-
- remove
|
|
217
|
-
- skill
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
299
|
+
Rules:
|
|
273
300
|
|
|
274
|
-
- agenda item
|
|
275
|
-
-
|
|
276
|
-
- `description`
|
|
277
|
-
-
|
|
278
|
-
- skill
|
|
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
|
|
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
|
-
-
|
|
285
|
-
-
|
|
286
|
-
-
|
|
287
|
-
-
|
|
288
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
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": "
|
|
350
|
+
"title": "Context first, then motion",
|
|
316
351
|
"facilitatorNotes": [
|
|
317
|
-
"
|
|
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": "
|
|
324
|
-
"body": "
|
|
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": "
|
|
364
|
+
"title": "Point",
|
|
330
365
|
"items": [
|
|
331
|
-
"
|
|
332
|
-
"
|
|
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": "
|
|
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": "
|
|
383
|
+
"label": "Updated demo flow",
|
|
349
384
|
"sceneType": "demo",
|
|
350
385
|
"intent": "walkthrough",
|
|
351
386
|
"chromePreset": "agenda",
|
|
352
|
-
"title": "
|
|
387
|
+
"title": "One story, not a feature parade",
|
|
353
388
|
"blocks": [
|
|
354
389
|
{
|
|
355
390
|
"id": "hero",
|
|
356
391
|
"type": "hero",
|
|
357
|
-
"title": "
|
|
358
|
-
"body": "
|
|
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
|
-
|
|
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
|
-
|
|
429
|
+
During API work:
|
|
395
430
|
|
|
396
|
-
-
|
|
397
|
-
- malformed payload
|
|
398
|
-
- skill
|
|
399
|
-
- room-facing
|
|
400
|
-
- `title/body`
|
|
401
|
-
-
|
|
402
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
417
|
-
- `HARNESS_DASHBOARD_URL`
|
|
418
|
-
-
|
|
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
|
-
##
|
|
456
|
+
## Notes
|
|
421
457
|
|
|
422
|
-
-
|
|
423
|
-
- `/workshop facilitator login`
|
|
424
|
-
-
|
|
425
|
-
-
|
|
426
|
-
-
|
|
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.
|
|
3
|
+
"version": "0.2.7",
|
|
4
4
|
"description": "Participant-facing Harness Lab CLI for facilitator auth and workshop operations",
|
|
5
|
-
"license": "
|
|
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
|
}
|