@go-labs-sg/gosh 1.5.0 → 1.6.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
@@ -372,6 +372,49 @@ groups to read back release values and editability, and use
372
372
  for the five most recent actor/before/after changes; the existing event activity
373
373
  timeline provides the full audit history.
374
374
 
375
+ ### Staggered team starts within a group
376
+
377
+ Teams sharing a route can start at different times. A team's own `releaseAt`
378
+ replaces the group's time (earlier or later); with none, the team uses the
379
+ group's time, so existing events are unchanged. A held group still holds every
380
+ team, and a team hold holds one team inside a released group. The server
381
+ enforces each team's effective time on every gameplay call.
382
+
383
+ Preview a stagger first. It writes nothing and lists each team's before/after
384
+ time plus any blockers the apply would refuse with:
385
+
386
+ ```bash
387
+ gosh routing-group stagger-preview \
388
+ --input '{"eventId":"event-id","groupId":"group-a","mode":"STAGGER","firstReleaseAt":"2030-01-01T13:40:00+08:00","intervalMinutes":5,"teamIds":["team-1","team-2","team-3"]}'
389
+ gosh routing-group stagger \
390
+ --input '{"eventId":"event-id","groupId":"group-a","mode":"STAGGER","firstReleaseAt":"2030-01-01T13:40:00+08:00","intervalMinutes":5,"teamIds":["team-1","team-2","team-3"]}' \
391
+ --target group-a \
392
+ --allow-state-change
393
+ ```
394
+
395
+ `teamIds` order is start order: `team-1` 13:40, `team-2` 13:45, `team-3` 13:50.
396
+ Teams left out keep their current time. Use `"mode":"SHIFT","shiftMinutes":10`
397
+ to delay every unstarted scheduled team by 10 minutes (negative moves earlier,
398
+ never into the past), or `"mode":"CLEAR"` to drop team times so teams use the
399
+ group time again. Apply runs in one transaction, so either every team changes
400
+ or none do. Started teams are never rescheduled.
401
+
402
+ One team at a time, including while LIVE:
403
+
404
+ ```bash
405
+ gosh team release \
406
+ --input '{"eventId":"event-id","teamId":"team-2","action":"HOLD"}' \
407
+ --target team-2 \
408
+ --allow-state-change
409
+ gosh team release-history --input '{"eventId":"event-id","teamId":"team-2"}'
410
+ ```
411
+
412
+ Actions are SCHEDULE (future `releaseAt` with offset), CLEAR (use the group
413
+ time), HOLD, RELEASE_HOLD (keep the team time) and RELEASE_NOW (start this team
414
+ now; refused while the group is held). After a team starts, only HOLD and
415
+ RELEASE_HOLD are accepted. Every change is audited with actor and before/after
416
+ values.
417
+
375
418
  The server evaluates deadlines without cron. Release never starts a timer or
376
419
  bypasses LIVE status, availability, check-in or captain permissions. Any team in
377
420
  a group beginning play locks that group's schedule; emergency HOLD/resume stays
@@ -1201,6 +1201,44 @@
1201
1201
  "summary": "Schedule (future releaseAt ISO timestamp with offset), CLEAR schedule, HOLD, RELEASE_SCHEDULED_HOLD (keep schedule), or RELEASE_NOW for a routing group. After a group starts, only HOLD and RELEASE_SCHEDULED_HOLD are accepted. Requires launchEvent permission.",
1202
1202
  "targetKeys": ["groupId", "eventId"]
1203
1203
  },
1204
+ {
1205
+ "effects": [],
1206
+ "input": "json",
1207
+ "operation": "query",
1208
+ "path": ["routing-group", "stagger-preview"],
1209
+ "procedure": "team.previewRoutingGroupStagger",
1210
+ "requiresAuth": true,
1211
+ "summary": "Dry run: show each team's before/after start time for a routing-group STAGGER (firstReleaseAt + intervalMinutes in teamIds order), SHIFT (shiftMinutes, unstarted scheduled teams) or CLEAR (back to the group time). Writes nothing; returns blockers apply would refuse with."
1212
+ },
1213
+ {
1214
+ "effects": ["state-change"],
1215
+ "input": "json",
1216
+ "operation": "mutation",
1217
+ "path": ["routing-group", "stagger"],
1218
+ "procedure": "team.applyRoutingGroupStagger",
1219
+ "requiresAuth": true,
1220
+ "summary": "Apply the same STAGGER, SHIFT or CLEAR input as stagger-preview in one transaction (all teams or none). Started teams are never rescheduled. Requires launchEvent permission; allowed while LIVE.",
1221
+ "targetKeys": ["groupId", "eventId"]
1222
+ },
1223
+ {
1224
+ "effects": ["state-change"],
1225
+ "input": "json",
1226
+ "operation": "mutation",
1227
+ "path": ["team", "release"],
1228
+ "procedure": "team.updateTeamRelease",
1229
+ "requiresAuth": true,
1230
+ "summary": "Set one team's start inside its routing group: SCHEDULE (future releaseAt ISO timestamp with offset), CLEAR (use the group time), HOLD, RELEASE_HOLD, or RELEASE_NOW. A held group still holds every team. After a team starts, only HOLD and RELEASE_HOLD are accepted. Requires launchEvent permission.",
1231
+ "targetKeys": ["teamId", "eventId"]
1232
+ },
1233
+ {
1234
+ "effects": [],
1235
+ "input": "json",
1236
+ "operation": "query",
1237
+ "path": ["team", "release-history"],
1238
+ "procedure": "team.listTeamReleaseHistory",
1239
+ "requiresAuth": true,
1240
+ "summary": "Show a team's five most recent start-time changes with actor, action and before/after UTC values."
1241
+ },
1204
1242
  {
1205
1243
  "effects": ["state-change"],
1206
1244
  "input": "json",
@@ -474,6 +474,38 @@ Schedule (future releaseAt ISO timestamp with offset), CLEAR schedule, HOLD, REL
474
474
  - Input: `--input '<json>'` required
475
475
  - Effects: state-change
476
476
 
477
+ ## `gosh routing-group stagger-preview`
478
+
479
+ Dry run: show each team's before/after start time for a routing-group STAGGER (firstReleaseAt + intervalMinutes in teamIds order), SHIFT (shiftMinutes, unstarted scheduled teams) or CLEAR (back to the group time). Writes nothing; returns blockers apply would refuse with.
480
+
481
+ - Authentication: browser-authenticated CLI session required
482
+ - Input: `--input '<json>'` required
483
+ - Effects: read-only
484
+
485
+ ## `gosh routing-group stagger`
486
+
487
+ Apply the same STAGGER, SHIFT or CLEAR input as stagger-preview in one transaction (all teams or none). Started teams are never rescheduled. Requires launchEvent permission; allowed while LIVE.
488
+
489
+ - Authentication: browser-authenticated CLI session required
490
+ - Input: `--input '<json>'` required
491
+ - Effects: state-change
492
+
493
+ ## `gosh team release`
494
+
495
+ Set one team's start inside its routing group: SCHEDULE (future releaseAt ISO timestamp with offset), CLEAR (use the group time), HOLD, RELEASE_HOLD, or RELEASE_NOW. A held group still holds every team. After a team starts, only HOLD and RELEASE_HOLD are accepted. Requires launchEvent permission.
496
+
497
+ - Authentication: browser-authenticated CLI session required
498
+ - Input: `--input '<json>'` required
499
+ - Effects: state-change
500
+
501
+ ## `gosh team release-history`
502
+
503
+ Show a team's five most recent start-time changes with actor, action and before/after UTC values.
504
+
505
+ - Authentication: browser-authenticated CLI session required
506
+ - Input: `--input '<json>'` required
507
+ - Effects: read-only
508
+
477
509
  ## `gosh routing-group create`
478
510
 
479
511
  Create a routing group within an event before play starts.
package/dist/index.js CHANGED
@@ -7504,6 +7504,22 @@ var typedOperations = {
7504
7504
  kind: "mutation",
7505
7505
  invoke: (client, input) => client.team.updateRoutingGroupRelease.mutate(input)
7506
7506
  },
7507
+ "team.previewRoutingGroupStagger": {
7508
+ kind: "query",
7509
+ invoke: (client, input) => client.team.previewRoutingGroupStagger.query(input)
7510
+ },
7511
+ "team.applyRoutingGroupStagger": {
7512
+ kind: "mutation",
7513
+ invoke: (client, input) => client.team.applyRoutingGroupStagger.mutate(input)
7514
+ },
7515
+ "team.updateTeamRelease": {
7516
+ kind: "mutation",
7517
+ invoke: (client, input) => client.team.updateTeamRelease.mutate(input)
7518
+ },
7519
+ "team.listTeamReleaseHistory": {
7520
+ kind: "query",
7521
+ invoke: (client, input) => client.team.listTeamReleaseHistory.query(input)
7522
+ },
7507
7523
  "team.createRoutingGroup": {
7508
7524
  kind: "mutation",
7509
7525
  invoke: (client, input) => client.team.createRoutingGroup.mutate(input)
@@ -7989,6 +8005,8 @@ var defaultMutationTargetKeys = [
7989
8005
  ];
7990
8006
  var mutationTargetKeys = {
7991
8007
  "team.updateRoutingGroupRelease": ["groupId", "eventId"],
8008
+ "team.updateTeamRelease": ["teamId", "eventId"],
8009
+ "team.applyRoutingGroupStagger": ["groupId", "eventId"],
7992
8010
  "team.setGameplaySettings": ["eventId"],
7993
8011
  "event.updateSurveySettings": ["eventId"],
7994
8012
  "team.createRoutingGroup": ["eventId"],
@@ -8117,6 +8135,10 @@ var commands = [
8117
8135
  query(["routing-group", "list"], "team.listRoutingGroups", "List an event's routing groups, ordered stations, and assigned teams."),
8118
8136
  query(["routing-group", "release-history"], "team.listRoutingGroupReleaseHistory", "Show a routing group's five most recent release changes with actor, action and before/after UTC values."),
8119
8137
  mutation(["routing-group", "release"], "team.updateRoutingGroupRelease", "Schedule (future releaseAt ISO timestamp with offset), CLEAR schedule, HOLD, RELEASE_SCHEDULED_HOLD (keep schedule), or RELEASE_NOW for a routing group. After a group starts, only HOLD and RELEASE_SCHEDULED_HOLD are accepted. Requires launchEvent permission.", ["state-change"]),
8138
+ query(["routing-group", "stagger-preview"], "team.previewRoutingGroupStagger", "Dry run: show each team's before/after start time for a routing-group STAGGER (firstReleaseAt + intervalMinutes in teamIds order), SHIFT (shiftMinutes, unstarted scheduled teams) or CLEAR (back to the group time). Writes nothing; returns blockers apply would refuse with."),
8139
+ mutation(["routing-group", "stagger"], "team.applyRoutingGroupStagger", "Apply the same STAGGER, SHIFT or CLEAR input as stagger-preview in one transaction (all teams or none). Started teams are never rescheduled. Requires launchEvent permission; allowed while LIVE.", ["state-change"]),
8140
+ mutation(["team", "release"], "team.updateTeamRelease", "Set one team's start inside its routing group: SCHEDULE (future releaseAt ISO timestamp with offset), CLEAR (use the group time), HOLD, RELEASE_HOLD, or RELEASE_NOW. A held group still holds every team. After a team starts, only HOLD and RELEASE_HOLD are accepted. Requires launchEvent permission.", ["state-change"]),
8141
+ query(["team", "release-history"], "team.listTeamReleaseHistory", "Show a team's five most recent start-time changes with actor, action and before/after UTC values."),
8120
8142
  mutation(["routing-group", "create"], "team.createRoutingGroup", "Create a routing group within an event before play starts.", ["state-change"]),
8121
8143
  mutation(["routing-group", "rename"], "team.renameRoutingGroup", "Rename an event's routing group before play starts.", ["state-change"]),
8122
8144
  mutation(["routing-group", "delete"], "team.deleteRoutingGroup", "Delete an unassigned routing group before play starts.", ["state-change", "delete"]),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@go-labs-sg/gosh",
3
- "version": "1.5.0",
3
+ "version": "1.6.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",