@maka/maka-cli 5.172.0 → 5.173.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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maka/maka-cli",
3
- "version": "5.172.0",
3
+ "version": "5.173.0",
4
4
  "type": "module",
5
5
  "summary": "A command line tool for scaffolding Meteor 3.x applications using either React.",
6
6
  "description": "A command line tool for scaffolding Meteor 3.x applications using React.",
@@ -160,7 +160,14 @@ export class BacklogCommand extends Command {
160
160
  // different timestamps on different machines -- so without this
161
161
  // two reports about the same moment cannot be tied together. Seen
162
162
  // for real: one run produced items stamped 00-18-43 and 00-18-15.
163
- sharedRunId: game?.remoteSession?.id,
163
+ // A HOSTED RUN NAMES ITSELF (2026-09-12, the reporter's note on
164
+ // ZdhkP8mAP9QhpqFvA): the browser client's session has no log
165
+ // file to upload, but its id is the key to the event stream the
166
+ // site keeps -- and the site reads the transcript off that
167
+ // (game-backlog-vetting.ts sessionEventsExcerpt). The CLI's own
168
+ // shared-run link keeps its id; the headless host's is the same
169
+ // GameSessions id under another name.
170
+ sharedRunId: game?.remoteSession?.id ?? currentSession()?.sessionId,
164
171
  cliVersion: cliVersion(),
165
172
  engineVersion: engineVersion(),
166
173
  platform: process.platform,
@@ -410,5 +410,10 @@
410
410
  // in Medicine aftercare (+hits as recovery dice, once per set of wounds,
411
411
  // persisted), the street doc has the Medicine skill, and a doc asked
412
412
  // about wounds names the verb and the price.
413
- export const ENGINE_VERSION = '1.47.0';
413
+ // 1.48.0 (2026-09-12): THE ROOM AND THE REPORT. A hosted run's backlog
414
+ // report names its session (sharedRunId) so the site can vet it with the
415
+ // run's own transcript; an exit-serving spot that is furniture (a booth,
416
+ // a counter) sits beside its doorway instead of on it; a job's objective
417
+ // is clamped to a carriable weight at scene build.
418
+ export const ENGINE_VERSION = '1.48.0';
414
419
  //# sourceMappingURL=engine-version.js.map
@@ -5,6 +5,9 @@ import { Door } from '../models/door.js';
5
5
  import { RoomFactory } from './room-factory.js';
6
6
  import { NPCFactory } from './npc-factory.js';
7
7
  import { ItemFactory } from './item-factory.js';
8
+ /** The heaviest a job's prize may be: a Strength 1 runner carries 30 kg
9
+ * (player.ts maxCarryingWeight), and they still need room for gear. */
10
+ export const OBJECTIVE_MAX_WEIGHT_KG = 15;
8
11
  import { Category } from '../types/shared/item-enum.js';
9
12
  import { Logger } from '../utilities/logger.js';
10
13
  import { migrateLegacySeed } from './seed-migration.js';
@@ -262,6 +265,21 @@ Key Locations: ${json.rooms.map(r => r.name).join(', ')}
262
265
  const itemMap = new Map();
263
266
  for (const itemJson of json.items ?? []) {
264
267
  const item = await itemFactory.createItemFromJson(itemJson);
268
+ // THE PRIZE HAS TO BE CARRIABLE (KSfzQzuHTx7kHjohi, 2026-09-12:
269
+ // "I shouldn't have an item I need to return, that I can't carry
270
+ // -- this case is too heavy"). The seed's items are written by a
271
+ // model that does not know the carry cap (20 + Strength x 10 kg,
272
+ // player.ts maxCarryingWeight); a "heavy case" at 60 kg is a job
273
+ // no runner can finish. The win condition's item is clamped to a
274
+ // weight the weakest runner can lift -- an objective you cannot
275
+ // pick up is a seed error, not a challenge. Other items keep
276
+ // whatever the seed said.
277
+ if (json.winCondition?.item === item.name) {
278
+ if (item.weight > OBJECTIVE_MAX_WEIGHT_KG) {
279
+ console.warn(`[scene] objective "${item.name}" weighs ${item.weight} kg -- clamped to ${OBJECTIVE_MAX_WEIGHT_KG} so it can be carried.`);
280
+ item.weight = OBJECTIVE_MAX_WEIGHT_KG;
281
+ }
282
+ }
265
283
  itemMap.set(item.name, item);
266
284
  // Step 4.5: Distribute Items
267
285
  if (itemJson.heldBy) {
@@ -1,4 +1,11 @@
1
1
  import { Direction } from '../types/shared/direction-enum.js';
2
+ export function doorwayKindOf(spotName) {
3
+ if (/stair|\bsteps?\b|ladder|hatch|shaft|chute|\bramp\b|\blift\b|elevator|escalator/i.test(spotName))
4
+ return 'vertical';
5
+ if (/door|entrance|entry|threshold|gate|arch|portal|airlock/i.test(spotName))
6
+ return 'lateral';
7
+ return undefined;
8
+ }
2
9
  export const METERS_PER_CELL = 2;
3
10
  /**
4
11
  * How tall one storey is. A CHOICE, not a citation -- SR5 never says how
@@ -609,7 +616,23 @@ export function synthesizeGrid(input) {
609
616
  // own walls; the hub sits where all of them are plausibly reachable.
610
617
  for (const [spotName, served] of exitCellsBySpot.entries()) {
611
618
  if (served.length === 1) {
612
- grid.spotCells.set(spotName, served[0]);
619
+ // FURNITURE BESIDE THE DOOR, NOT IN IT (XanDMPmRrbJQ8ta8e,
620
+ // 2026-09-12: "the corner booth is right in front of the door
621
+ // north ... doors and booths should not be on top of each
622
+ // other"). A seed may name any spot as the one an exit is
623
+ // reached from -- "the booth by the north door". Only a spot
624
+ // that IS a doorway (a door, a gate, the stairs) takes the
625
+ // doorway cell; a booth, a counter or a bar takes the nearest
626
+ // free cell beside it instead. The doorway and its approach are
627
+ // already claimed above, so "nearest free" is next to the door,
628
+ // never on it or in front of it.
629
+ if (doorwayKindOf(spotName)) {
630
+ grid.spotCells.set(spotName, served[0]);
631
+ continue;
632
+ }
633
+ const beside = nearestFree(served[0], occupied, dims, exists);
634
+ claim(beside);
635
+ grid.spotCells.set(spotName, beside);
613
636
  continue;
614
637
  }
615
638
  const mid = {
@@ -2,7 +2,10 @@ import { Direction } from '../types/shared/direction-enum.js';
2
2
  import { significantWords, wordsAreCloseEnough } from './fuzzy-match.js';
3
3
  import { hint } from './hints.js';
4
4
  import { placeName } from './log-style.js';
5
- import { findPath, distanceMeters, coverBetween, blockingRegionFor, pathClimbSteps, levelFootprint, key, isCellBlocked, pathSqueezes, METERS_PER_CELL, } from './room-grid.js';
5
+ import { findPath, distanceMeters, coverBetween, blockingRegionFor, pathClimbSteps, levelFootprint, key, isCellBlocked, pathSqueezes, METERS_PER_CELL, doorwayKindOf, } from './room-grid.js';
6
+ // The doorway vocabulary moved to room-grid.ts (the grid seats exit
7
+ // spots by it); every caller of spots.ts keeps its import.
8
+ export { doorwayKindOf };
6
9
  /**
7
10
  * Intra-room locations ("at" spots -- player request: every room felt
8
11
  * like everything stood at your elbow; walking into the bar had both
@@ -1283,13 +1286,31 @@ export function lockedRouteHint(room, direction, door) {
1283
1286
  }
1284
1287
  return '';
1285
1288
  }
1286
- export function doorwayKindOf(spotName) {
1287
- if (/stair|\bsteps?\b|ladder|hatch|shaft|chute|\bramp\b|\blift\b|elevator|escalator/i.test(spotName))
1288
- return 'vertical';
1289
- if (/door|entrance|entry|threshold|gate|arch|portal|airlock/i.test(spotName))
1290
- return 'lateral';
1291
- return undefined;
1292
- }
1289
+ /**
1290
+ * WHAT KIND OF WAY THROUGH a spot's name describes, or undefined when
1291
+ * it isn't a way through at all (a bar, a workbench, the stalls).
1292
+ *
1293
+ * THE ONE DOORWAY PREDICATE (item A, 2026-08-27). There were two
1294
+ * separately-written copies of this regex -- here in entrySpotFor and
1295
+ * in Room.namedDoorwayFor -- free to drift apart, and neither knew the
1296
+ * distinction that actually matters: a "back door" is a LATERAL way
1297
+ * through and a "way down" is a VERTICAL one. Kind-blindness is what
1298
+ * let namedDoorwayFor bind a spot called "the back door" to a DOWN
1299
+ * exit, which put the basement's barrier at the back door (the player's
1300
+ * report) and, because vertical exits are centre-placed, simultaneously
1301
+ * put the back door in the middle of the room (the older report). One
1302
+ * defect, two bug reports.
1303
+ *
1304
+ * This is a PERMANENT component, not a migration shim. Generation is
1305
+ * moving toward binding every exit to a spot explicitly, but that data
1306
+ * is model-written: validation can make it right more often, never
1307
+ * always. And every scene seeded before that lands has nothing but
1308
+ * names, forever. So this is the honest floor under a seed that is
1309
+ * silent or lying, and it is the LAST resort -- an explicit
1310
+ * room.exitSpots binding always wins.
1311
+ *
1312
+ * (Definition now in room-grid.ts -- see the re-export at the top.)
1313
+ */
1293
1314
  /** The kind of way through a given direction NEEDS. */
1294
1315
  export function exitDoorwayKind(direction) {
1295
1316
  return direction === Direction.UP || direction === Direction.DOWN ? 'vertical' : 'lateral';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maka/maka-cli",
3
- "version": "5.172.0",
3
+ "version": "5.173.0",
4
4
  "type": "module",
5
5
  "summary": "A command line tool for scaffolding Meteor 3.x applications using either React.",
6
6
  "description": "A command line tool for scaffolding Meteor 3.x applications using React.",