@go-labs-sg/gosh 1.3.0 → 1.4.0

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
@@ -268,7 +268,7 @@ station lists:
268
268
 
269
269
  ```bash
270
270
  gosh event set-gameplay \
271
- --input '{"eventId":"event-id","progression":"SEQUENTIAL","groupRoutingEnabled":true,"allowMissionSkipping":true}' \
271
+ --input '{"eventId":"event-id","progression":"SEQUENTIAL","groupRoutingEnabled":true,"allowMissionSkipping":true,"allowStationSkipping":false}' \
272
272
  --target event-id \
273
273
  --allow-state-change
274
274
 
@@ -381,6 +381,46 @@ finish time are kept, and a finished station accepts the reopened mission
381
381
  until it is resolved. Pending submissions must be reviewed first, and a
382
382
  reopened mission that still holds earlier points cannot be skipped.
383
383
 
384
+ #### Skipping a station
385
+
386
+ When the event's `allowStationSkipping` gameplay setting is on, a player who
387
+ can submit for their team can skip their current station. Check-in is not
388
+ required, so a team that cannot pass geolock can still move on:
389
+
390
+ ```bash
391
+ gosh player station skip \
392
+ --input '{"eventId":"event-id","stationId":"station-2"}' \
393
+ --target station-2 \
394
+ --allow-state-change
395
+ ```
396
+
397
+ A host with `reviewSubmissions` can skip a team's (`teamId`) or individual
398
+ player's (`eventPlayerId`) current station, or one open mission on it, while
399
+ the event is live. This works whatever the player setting is. Check the route
400
+ first, then pass an optional reason:
401
+
402
+ ```bash
403
+ gosh route progress --input '{"eventId":"event-id","teamId":"team-1"}'
404
+
405
+ gosh route skip-station \
406
+ --input '{"eventId":"event-id","teamId":"team-1","stationId":"station-2","reason":"Location closed"}' \
407
+ --target team-1 \
408
+ --allow-state-change
409
+
410
+ gosh route skip-mission \
411
+ --input '{"eventId":"event-id","teamId":"team-1","missionId":"mission-3","reason":"Prop missing"}' \
412
+ --target team-1 \
413
+ --allow-state-change
414
+ ```
415
+
416
+ Only the current station can be skipped, so route order stays intact. Its
417
+ open missions score zero, the station completes (a stop nobody started records
418
+ zero time), and the next stop unlocks immediately; skipping the last stop
419
+ finishes the route. A station with a reopened mission that still holds earlier
420
+ points cannot be skipped until it is resubmitted or reviewed. Who skipped and
421
+ why appears in `route progress`, the activity log, and the results export's
422
+ `skips.csv`.
423
+
384
424
  When reviewing, pass the submission's `updatedAt` from the review queue as
385
425
  `expectedUpdatedAt`. If the team resubmitted after you read it, the review is
386
426
  refused with `CONFLICT` instead of scoring the new answer blind:
@@ -513,6 +553,14 @@ gosh submission watch --input '{"organizationId":"acme","eventId":"event-id"}'
513
553
 
514
554
  Global admins can list users, change global roles, and ban or unban accounts under `gosh admin users …`. Banning an account atomically revokes its active browser and CLI sessions.
515
555
 
556
+ Global admins can read every post-event experience review across organizations under `gosh admin reviews …`. `list` returns newest-first `{ items, pageInfo }` cursor pages (`limit` 1 to 100, default 25; pass `pageInfo.nextCursor` back as `cursor`), `count` returns the total, average rating and 5 to 1 star distribution, `filter-options` lists the organizations and events that have reviews, and `export` returns every matching row (up to 10,000). All four accept the same optional filters: `rating` (1 to 5), `organizationId`, `eventId`, `comment` (`with` or `without`) and `q` (comment, participant or event search):
557
+
558
+ ```bash
559
+ gosh admin reviews list --input '{"rating":1,"limit":50}'
560
+ gosh admin reviews count --input '{"comment":"with"}'
561
+ gosh admin reviews export --input '{"organizationId":"org-id"}'
562
+ ```
563
+
516
564
  ## Mutation safety
517
565
 
518
566
  Mutations require `--target` to exactly match an identifier in `--input` (such as an `eventId`, `stationId`, slug, or name), binding the confirmation to the payload. In non-interactive automation, every applicable effect flag is also required:
@@ -921,6 +921,15 @@
921
921
  "requiresAuth": true,
922
922
  "summary": "List teams and their current members."
923
923
  },
924
+ {
925
+ "effects": [],
926
+ "input": "json",
927
+ "operation": "query",
928
+ "path": ["route", "progress"],
929
+ "procedure": "team.getRouteProgress",
930
+ "requiresAuth": true,
931
+ "summary": "Show a team's (teamId) or individual player's (eventPlayerId) sequential route: stops, mission statuses, and who skipped what and why."
932
+ },
924
933
  {
925
934
  "effects": [],
926
935
  "input": "json",
@@ -1660,6 +1669,26 @@
1660
1669
  "name"
1661
1670
  ]
1662
1671
  },
1672
+ {
1673
+ "effects": ["state-change"],
1674
+ "input": "json",
1675
+ "operation": "mutation",
1676
+ "path": ["route", "skip-station"],
1677
+ "procedure": "team.skipStation",
1678
+ "requiresAuth": true,
1679
+ "summary": "Skip a team's (teamId) or individual player's (eventPlayerId) current station on a fixed-order route while the event is live, with an optional reason. Its open missions score zero and the next stop unlocks; works whatever the player skipping setting is.",
1680
+ "targetKeys": ["teamId", "eventPlayerId", "stationId"]
1681
+ },
1682
+ {
1683
+ "effects": ["state-change"],
1684
+ "input": "json",
1685
+ "operation": "mutation",
1686
+ "path": ["route", "skip-mission"],
1687
+ "procedure": "team.skipMission",
1688
+ "requiresAuth": true,
1689
+ "summary": "Skip one open mission at a team's (teamId) or individual player's (eventPlayerId) current station for zero points, with an optional reason. Completes the station when it was the last open mission.",
1690
+ "targetKeys": ["teamId", "eventPlayerId", "missionId"]
1691
+ },
1663
1692
  {
1664
1693
  "effects": ["state-change"],
1665
1694
  "input": "json",
@@ -1906,6 +1935,16 @@
1906
1935
  "name"
1907
1936
  ]
1908
1937
  },
1938
+ {
1939
+ "effects": ["state-change"],
1940
+ "input": "json",
1941
+ "operation": "mutation",
1942
+ "path": ["event", "update-survey"],
1943
+ "procedure": "event.updateSurveySettings",
1944
+ "requiresAuth": true,
1945
+ "summary": "Set the player survey: built-in, external link, or off, plus its copy and Google review prompt.",
1946
+ "targetKeys": ["eventId"]
1947
+ },
1909
1948
  {
1910
1949
  "effects": ["state-change"],
1911
1950
  "input": "json",
@@ -2451,6 +2490,16 @@
2451
2490
  "summary": "Permanently skip one unresolved mission for zero points when enabled; retain other points and elapsed station time.",
2452
2491
  "targetKeys": ["missionId"]
2453
2492
  },
2493
+ {
2494
+ "effects": ["state-change"],
2495
+ "input": "json",
2496
+ "operation": "mutation",
2497
+ "path": ["player", "station", "skip"],
2498
+ "procedure": "event.skipStation",
2499
+ "requiresAuth": true,
2500
+ "summary": "Skip your current sequential station for zero points when the event allows station skipping. No check-in is needed; its missions cannot be played later.",
2501
+ "targetKeys": ["stationId"]
2502
+ },
2454
2503
  {
2455
2504
  "effects": ["state-change"],
2456
2505
  "input": "json",
@@ -3120,6 +3169,42 @@
3120
3169
  "name"
3121
3170
  ]
3122
3171
  },
3172
+ {
3173
+ "effects": [],
3174
+ "input": "json",
3175
+ "operation": "query",
3176
+ "path": ["admin", "reviews", "list"],
3177
+ "procedure": "review.listAdmin",
3178
+ "requiresAuth": true,
3179
+ "summary": "List experience reviews across all events as a global admin. Input: optional rating, organizationId, eventId, comment (with|without), q, plus limit, cursor and direction; returns { items, pageInfo }."
3180
+ },
3181
+ {
3182
+ "effects": [],
3183
+ "input": "json",
3184
+ "operation": "query",
3185
+ "path": ["admin", "reviews", "count"],
3186
+ "procedure": "review.getAdminSummary",
3187
+ "requiresAuth": true,
3188
+ "summary": "Count experience reviews for the given filters, with average rating and 5 to 1 star distribution."
3189
+ },
3190
+ {
3191
+ "effects": [],
3192
+ "input": "none",
3193
+ "operation": "query",
3194
+ "path": ["admin", "reviews", "filter-options"],
3195
+ "procedure": "review.listAdminFilterOptions",
3196
+ "requiresAuth": true,
3197
+ "summary": "List organizations and events that have experience reviews."
3198
+ },
3199
+ {
3200
+ "effects": [],
3201
+ "input": "json",
3202
+ "operation": "query",
3203
+ "path": ["admin", "reviews", "export"],
3204
+ "procedure": "review.exportAdmin",
3205
+ "requiresAuth": true,
3206
+ "summary": "Export every experience review matching the filters as rows (capped at 10,000)."
3207
+ },
3123
3208
  {
3124
3209
  "path": ["assets", "requirements"],
3125
3210
  "operation": "local",
@@ -370,6 +370,14 @@ List teams and their current members.
370
370
  - Input: `--input '<json>'` required
371
371
  - Effects: read-only
372
372
 
373
+ ## `gosh route progress`
374
+
375
+ Show a team's (teamId) or individual player's (eventPlayerId) sequential route: stops, mission statuses, and who skipped what and why.
376
+
377
+ - Authentication: browser-authenticated CLI session required
378
+ - Input: `--input '<json>'` required
379
+ - Effects: read-only
380
+
373
381
  ## `gosh team station-routes`
374
382
 
375
383
  List each team's linked stations and team-specific route order.
@@ -650,6 +658,22 @@ Review a mission submission.
650
658
  - Input: `--input '<json>'` required
651
659
  - Effects: state-change
652
660
 
661
+ ## `gosh route skip-station`
662
+
663
+ Skip a team's (teamId) or individual player's (eventPlayerId) current station on a fixed-order route while the event is live, with an optional reason. Its open missions score zero and the next stop unlocks; works whatever the player skipping setting is.
664
+
665
+ - Authentication: browser-authenticated CLI session required
666
+ - Input: `--input '<json>'` required
667
+ - Effects: state-change
668
+
669
+ ## `gosh route skip-mission`
670
+
671
+ Skip one open mission at a team's (teamId) or individual player's (eventPlayerId) current station for zero points, with an optional reason. Completes the station when it was the last open mission.
672
+
673
+ - Authentication: browser-authenticated CLI session required
674
+ - Input: `--input '<json>'` required
675
+ - Effects: state-change
676
+
653
677
  ## `gosh mission reopen`
654
678
 
655
679
  Reopen a submitted or skipped mission for one team (teamId) or player (eventPlayerId) on a fixed-order route. Earlier points count until they resubmit; then only the new submission counts. Finish times are kept.
@@ -786,6 +810,14 @@ Update event branding.
786
810
  - Input: `--input '<json>'` required
787
811
  - Effects: state-change
788
812
 
813
+ ## `gosh event update-survey`
814
+
815
+ Set the player survey: built-in, external link, or off, plus its copy and Google review prompt.
816
+
817
+ - Authentication: browser-authenticated CLI session required
818
+ - Input: `--input '<json>'` required
819
+ - Effects: state-change
820
+
789
821
  ## `gosh station update-availability`
790
822
 
791
823
  Update station availability.
@@ -1002,6 +1034,14 @@ Permanently skip one unresolved mission for zero points when enabled; retain oth
1002
1034
  - Input: `--input '<json>'` required
1003
1035
  - Effects: state-change
1004
1036
 
1037
+ ## `gosh player station skip`
1038
+
1039
+ Skip your current sequential station for zero points when the event allows station skipping. No check-in is needed; its missions cannot be played later.
1040
+
1041
+ - Authentication: browser-authenticated CLI session required
1042
+ - Input: `--input '<json>'` required
1043
+ - Effects: state-change
1044
+
1005
1045
  ## `gosh player mission submit`
1006
1046
 
1007
1047
  Submit a mission response and return revealMessage, including already-completed submissions.
@@ -1244,6 +1284,38 @@ Unban a user.
1244
1284
  - Input: `--input '<json>'` required
1245
1285
  - Effects: state-change
1246
1286
 
1287
+ ## `gosh admin reviews list`
1288
+
1289
+ List experience reviews across all events as a global admin. Input: optional rating, organizationId, eventId, comment (with|without), q, plus limit, cursor and direction; returns { items, pageInfo }.
1290
+
1291
+ - Authentication: browser-authenticated CLI session required
1292
+ - Input: `--input '<json>'` required
1293
+ - Effects: read-only
1294
+
1295
+ ## `gosh admin reviews count`
1296
+
1297
+ Count experience reviews for the given filters, with average rating and 5 to 1 star distribution.
1298
+
1299
+ - Authentication: browser-authenticated CLI session required
1300
+ - Input: `--input '<json>'` required
1301
+ - Effects: read-only
1302
+
1303
+ ## `gosh admin reviews filter-options`
1304
+
1305
+ List organizations and events that have experience reviews.
1306
+
1307
+ - Authentication: browser-authenticated CLI session required
1308
+ - Input: none
1309
+ - Effects: read-only
1310
+
1311
+ ## `gosh admin reviews export`
1312
+
1313
+ Export every experience review matching the filters as rows (capped at 10,000).
1314
+
1315
+ - Authentication: browser-authenticated CLI session required
1316
+ - Input: `--input '<json>'` required
1317
+ - Effects: read-only
1318
+
1247
1319
  ## `gosh assets requirements`
1248
1320
 
1249
1321
  Show upload limits and separate artwork recommendations without login or network access.
package/dist/index.js CHANGED
@@ -7452,6 +7452,10 @@ var typedOperations = {
7452
7452
  kind: "query",
7453
7453
  invoke: (client, input) => client.team.list.query(input)
7454
7454
  },
7455
+ "team.getRouteProgress": {
7456
+ kind: "query",
7457
+ invoke: (client, input) => client.team.getRouteProgress.query(input)
7458
+ },
7455
7459
  "team.getStationRoutes": {
7456
7460
  kind: "query",
7457
7461
  invoke: (client, input) => client.team.getStationRoutes.query(input)
@@ -7592,6 +7596,14 @@ var typedOperations = {
7592
7596
  kind: "mutation",
7593
7597
  invoke: (client, input) => client.event.reviewSubmission.mutate(input)
7594
7598
  },
7599
+ "team.skipStation": {
7600
+ kind: "mutation",
7601
+ invoke: (client, input) => client.team.skipStation.mutate(input)
7602
+ },
7603
+ "team.skipMission": {
7604
+ kind: "mutation",
7605
+ invoke: (client, input) => client.team.skipMission.mutate(input)
7606
+ },
7595
7607
  "event.reopenMission": {
7596
7608
  kind: "mutation",
7597
7609
  invoke: (client, input) => client.event.reopenMission.mutate(input)
@@ -7660,6 +7672,10 @@ var typedOperations = {
7660
7672
  kind: "mutation",
7661
7673
  invoke: (client, input) => client.event.updateBranding.mutate(input)
7662
7674
  },
7675
+ "event.updateSurveySettings": {
7676
+ kind: "mutation",
7677
+ invoke: (client, input) => client.event.updateSurveySettings.mutate(input)
7678
+ },
7663
7679
  "event.updateStationAvailability": {
7664
7680
  kind: "mutation",
7665
7681
  invoke: (client, input) => client.event.updateStationAvailability.mutate(input)
@@ -7768,6 +7784,10 @@ var typedOperations = {
7768
7784
  kind: "mutation",
7769
7785
  invoke: (client, input) => client.event.skipMission.mutate(input)
7770
7786
  },
7787
+ "event.skipStation": {
7788
+ kind: "mutation",
7789
+ invoke: (client, input) => client.event.skipStation.mutate(input)
7790
+ },
7771
7791
  "event.submitMission": {
7772
7792
  kind: "mutation",
7773
7793
  invoke: (client, input) => client.event.submitMission.mutate(input)
@@ -7895,6 +7915,22 @@ var typedOperations = {
7895
7915
  "user.unban": {
7896
7916
  kind: "mutation",
7897
7917
  invoke: (client, input) => client.user.unban.mutate(input)
7918
+ },
7919
+ "review.listAdmin": {
7920
+ kind: "query",
7921
+ invoke: (client, input) => client.review.listAdmin.query(input)
7922
+ },
7923
+ "review.getAdminSummary": {
7924
+ kind: "query",
7925
+ invoke: (client, input) => client.review.getAdminSummary.query(input)
7926
+ },
7927
+ "review.listAdminFilterOptions": {
7928
+ kind: "query",
7929
+ invoke: (client, input) => client.review.listAdminFilterOptions.query(input)
7930
+ },
7931
+ "review.exportAdmin": {
7932
+ kind: "query",
7933
+ invoke: (client, input) => client.review.exportAdmin.query(input)
7898
7934
  }
7899
7935
  };
7900
7936
 
@@ -7950,6 +7986,7 @@ var defaultMutationTargetKeys = [
7950
7986
  var mutationTargetKeys = {
7951
7987
  "team.updateRoutingGroupRelease": ["groupId", "eventId"],
7952
7988
  "team.setGameplaySettings": ["eventId"],
7989
+ "event.updateSurveySettings": ["eventId"],
7953
7990
  "team.createRoutingGroup": ["eventId"],
7954
7991
  "team.renameRoutingGroup": ["groupId"],
7955
7992
  "team.deleteRoutingGroup": ["groupId"],
@@ -7959,6 +7996,9 @@ var mutationTargetKeys = {
7959
7996
  "team.resolveRsvpCheckInReview": ["linkId"],
7960
7997
  "event.startStation": ["stationId"],
7961
7998
  "event.skipMission": ["missionId"],
7999
+ "event.skipStation": ["stationId"],
8000
+ "team.skipStation": ["teamId", "eventPlayerId", "stationId"],
8001
+ "team.skipMission": ["teamId", "eventPlayerId", "missionId"],
7962
8002
  "event.reopenMission": ["teamId", "eventPlayerId", "missionId"],
7963
8003
  "event.create": ["organizationId", "name"],
7964
8004
  "event.createFromTemplate": ["organizationId", "templateId"],
@@ -8056,6 +8096,7 @@ var commands = [
8056
8096
  mutation(["mission", "archive"], "event.archiveMission", "Archive a mission.", ["state-change", "delete"]),
8057
8097
  mutation(["mission", "reorder"], "event.reorderMissions", "Reorder missions within a station.", ["state-change"]),
8058
8098
  query(["team", "list"], "team.list", "List teams and their current members."),
8099
+ query(["route", "progress"], "team.getRouteProgress", "Show a team's (teamId) or individual player's (eventPlayerId) sequential route: stops, mission statuses, and who skipped what and why."),
8059
8100
  query(["team", "station-routes"], "team.getStationRoutes", "List each team's linked stations and team-specific route order."),
8060
8101
  mutation(["team", "create"], "team.create", "Create a team.", [
8061
8102
  "state-change"
@@ -8098,6 +8139,8 @@ var commands = [
8098
8139
  mutation(["reward", "update"], "event.updateReward", "Update an event reward.", ["state-change"]),
8099
8140
  mutation(["score", "adjust"], "event.createScoreAdjustment", "Create a manual score adjustment.", ["state-change"]),
8100
8141
  mutation(["submission", "review"], "event.reviewSubmission", "Review a mission submission.", ["state-change"]),
8142
+ mutation(["route", "skip-station"], "team.skipStation", "Skip a team's (teamId) or individual player's (eventPlayerId) current station on a fixed-order route while the event is live, with an optional reason. Its open missions score zero and the next stop unlocks; works whatever the player skipping setting is.", ["state-change"]),
8143
+ mutation(["route", "skip-mission"], "team.skipMission", "Skip one open mission at a team's (teamId) or individual player's (eventPlayerId) current station for zero points, with an optional reason. Completes the station when it was the last open mission.", ["state-change"]),
8101
8144
  mutation(["mission", "reopen"], "event.reopenMission", "Reopen a submitted or skipped mission for one team (teamId) or player (eventPlayerId) on a fixed-order route. Earlier points count until they resubmit; then only the new submission counts. Finish times are kept.", ["state-change"]),
8102
8145
  mutation(["results-share", "regenerate"], "event.regenerateResultsPortalShare", "Create a new results portal share token.", ["state-change"]),
8103
8146
  mutation(["results-share", "revoke"], "event.revokeResultsPortalShare", "Revoke the current results portal share token.", ["state-change", "delete"]),
@@ -8115,6 +8158,7 @@ var commands = [
8115
8158
  query(["results-share", "get"], "event.getResultsPortalShare", "Get the current results portal share."),
8116
8159
  mutation(["event", "update-access"], "event.updateAccess", "Update event access rules.", ["state-change"]),
8117
8160
  mutation(["event", "update-branding"], "event.updateBranding", "Update event branding.", ["state-change"]),
8161
+ mutation(["event", "update-survey"], "event.updateSurveySettings", "Set the player survey: built-in, external link, or off, plus its copy and Google review prompt.", ["state-change"]),
8118
8162
  mutation(["station", "update-availability"], "event.updateStationAvailability", "Update station availability.", ["state-change"]),
8119
8163
  mutation(["station", "update-image"], "event.updateStationImage", "Update a station image.", ["state-change"]),
8120
8164
  mutation(["station", "update-location"], "event.updateStationLocation", "Update station location and geofence settings.", ["state-change"]),
@@ -8144,6 +8188,7 @@ var commands = [
8144
8188
  mutation(["player", "station-qr-check-in"], "event.createStationQrCheckInProof", "Check in to a station with its scanned QR or manual code.", ["state-change"]),
8145
8189
  mutation(["player", "station", "start"], "event.startStation", "Start the current sequential station's shared mission timer and reveal its missions; required check-in still applies.", ["state-change"]),
8146
8190
  mutation(["player", "mission", "skip"], "event.skipMission", "Permanently skip one unresolved mission for zero points when enabled; retain other points and elapsed station time.", ["state-change"]),
8191
+ mutation(["player", "station", "skip"], "event.skipStation", "Skip your current sequential station for zero points when the event allows station skipping. No check-in is needed; its missions cannot be played later.", ["state-change"]),
8147
8192
  mutation(["player", "mission", "submit"], "event.submitMission", "Submit a mission response and return revealMessage, including already-completed submissions.", ["state-change"]),
8148
8193
  query(["public", "event-login"], "event.getPublicLoginDetails", "Get public event login details.", { requiresAuth: false }),
8149
8194
  query(["public", "results"], "event.getResultsPortal", "Get a shared public results portal.", { requiresAuth: false }),
@@ -8175,7 +8220,11 @@ var commands = [
8175
8220
  mutation(["admin", "users", "ban"], "user.ban", "Ban a user and revoke their sessions and API keys.", ["state-change", "delete"]),
8176
8221
  mutation(["admin", "users", "unban"], "user.unban", "Unban a user.", [
8177
8222
  "state-change"
8178
- ])
8223
+ ]),
8224
+ query(["admin", "reviews", "list"], "review.listAdmin", "List experience reviews across all events as a global admin. Input: optional rating, organizationId, eventId, comment (with|without), q, plus limit, cursor and direction; returns { items, pageInfo }."),
8225
+ query(["admin", "reviews", "count"], "review.getAdminSummary", "Count experience reviews for the given filters, with average rating and 5 to 1 star distribution."),
8226
+ query(["admin", "reviews", "filter-options"], "review.listAdminFilterOptions", "List organizations and events that have experience reviews.", { input: "none" }),
8227
+ query(["admin", "reviews", "export"], "review.exportAdmin", "Export every experience review matching the filters as rows (capped at 10,000).")
8179
8228
  ];
8180
8229
  var commandManifest = commands.map((command) => ({
8181
8230
  effects: command.effects,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@go-labs-sg/gosh",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "GOSH CLI for organizers and AI agents — manage organizations, events, teams, stations, missions, templates, and live operations through the GOSH API.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",