@maka/maka-cli 5.50.0 → 5.51.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.50.0",
3
+ "version": "5.51.0",
4
4
  "type": "module",
5
5
  "summary": "A command line tool for scaffolding Meteor 2.x applications using either React.",
6
6
  "description": "A command line tool for scaffolding Meteor 2.x applications using React.",
@@ -771,6 +771,25 @@ export default class Game {
771
771
  * no widgets. updateStatus paints it for the local player; a shared-run
772
772
  * server ships it per player as status events (Phase C).
773
773
  */
774
+ /**
775
+ * What's in your hands, in one phrase. Three armed states on the meat
776
+ * plane: drawn, HOLSTERED (carried but riding leather -- "brandish"
777
+ * puts it in hand; combat auto-draws, so this is posture rather than
778
+ * readiness), or nothing at all. Off-plane the profile is attack
779
+ * programs / astral will and reads as Armed. White, not gray, for the
780
+ * same legibility reason as the stance it now sits beside.
781
+ */
782
+ private armedLine;
783
+ /**
784
+ * THE LOG WEARS THE PLANE (player request 2026-08-25). Jacking in or
785
+ * stepping out of your body changes what every line in that log even
786
+ * MEANS, and the only marker was a HUD row well below it. The border
787
+ * takes the plane's own established colour -- cyan for the Matrix,
788
+ * magenta for astral, yellow for a jumped-in drone, matching the
789
+ * tints those planes already use throughout the prose.
790
+ */
791
+ private planeBorderColor;
792
+ private paintPlaneBorder;
774
793
  statusLinesFor(player: Player): string[];
775
794
  updateEquipment(_playerEquipment: PlayerEquipment): void;
776
795
  updateExits(_room: Room): void;
@@ -1836,6 +1836,29 @@ ${client.name} won't be remembering anything. Dead Johnsons pay nothing -- and t
1836
1836
  this.initStatusBox(screen);
1837
1837
  this.initMapBox(screen); // docked atop the Mechanics column
1838
1838
  this._screen = screen;
1839
+ // Paint the meat-plane border up front rather than leaving blessed's
1840
+ // default until the first status refresh.
1841
+ this.paintPlaneBorder();
1842
+ // RESIZE REDRAWS (player request 2026-08-25). blessed re-solves its
1843
+ // own percentage geometry on a resize, but the docked panels are
1844
+ // drawn CONTENT, not layout: the district viewport's width and the
1845
+ // room box's elevation justification are both computed from
1846
+ // screen.width at paint time (see updateExits), so after a resize
1847
+ // they kept the old terminal's dimensions until the next command
1848
+ // happened to repaint them -- a map sized for a window that no
1849
+ // longer exists, which is exactly how content spills a border.
1850
+ screen.on('resize', () => {
1851
+ try {
1852
+ this.updateStatus();
1853
+ const here = this.player?.currentLocation;
1854
+ if (here)
1855
+ this.updateExits(here);
1856
+ screen.render();
1857
+ }
1858
+ catch (err) {
1859
+ Logger.getInstance().write(`resize redraw failed: ${err instanceof Error ? err.message : String(err)}`);
1860
+ }
1861
+ });
1839
1862
  }
1840
1863
  /** The engine half of startup: scene synthesis, command registration,
1841
1864
  * hub seeding, resume overlay -- no widget contact. */
@@ -3305,6 +3328,9 @@ ${client.name} won't be remembering anything. Dead Johnsons pay nothing -- and t
3305
3328
  if (this.remoteSession)
3306
3329
  return;
3307
3330
  this._statusBox.setContent(this.statusLinesFor(this.player).join('\n'));
3331
+ // The log's border tracks the plane -- updateStatus is the one hook
3332
+ // every plane transition already funnels through.
3333
+ this.paintPlaneBorder();
3308
3334
  this._screen.render();
3309
3335
  }
3310
3336
  /** ui plumbing for session mode (utilities/shared-run.ts). */
@@ -3319,6 +3345,51 @@ ${client.name} won't be remembering anything. Dead Johnsons pay nothing -- and t
3319
3345
  * no widgets. updateStatus paints it for the local player; a shared-run
3320
3346
  * server ships it per player as status events (Phase C).
3321
3347
  */
3348
+ /**
3349
+ * What's in your hands, in one phrase. Three armed states on the meat
3350
+ * plane: drawn, HOLSTERED (carried but riding leather -- "brandish"
3351
+ * puts it in hand; combat auto-draws, so this is posture rather than
3352
+ * readiness), or nothing at all. Off-plane the profile is attack
3353
+ * programs / astral will and reads as Armed. White, not gray, for the
3354
+ * same legibility reason as the stance it now sits beside.
3355
+ */
3356
+ armedLine(player) {
3357
+ const weapon = player.getWeaponProfile();
3358
+ const weaponItem = player.getCarriedWeapon();
3359
+ const ammoNote = weaponItem?.isFirearm()
3360
+ ? (weaponItem.jammed
3361
+ ? ` {red-fg}[JAMMED -- reboot]{/red-fg}`
3362
+ : weaponItem.ammo === 0 ? ` {red-fg}[DRY]{/red-fg}` : ` [${weaponItem.ammo} rds]`)
3363
+ : '';
3364
+ if (player.plane === 'meat' && weaponItem && !player.weaponDrawn) {
3365
+ return `{white-fg}Holstered: ${weaponItem.name}${ammoNote}${hint(' -- "brandish"')}{/white-fg}`;
3366
+ }
3367
+ if (weapon.name === 'bare fists')
3368
+ return `{gray-fg}Unarmed{/gray-fg}`;
3369
+ return `Armed: ${weapon.name} (DV ${weapon.damage}${weapon.poolBonus > 0 ? `, +${weapon.poolBonus} dice` : ''})${ammoNote}`;
3370
+ }
3371
+ /**
3372
+ * THE LOG WEARS THE PLANE (player request 2026-08-25). Jacking in or
3373
+ * stepping out of your body changes what every line in that log even
3374
+ * MEANS, and the only marker was a HUD row well below it. The border
3375
+ * takes the plane's own established colour -- cyan for the Matrix,
3376
+ * magenta for astral, yellow for a jumped-in drone, matching the
3377
+ * tints those planes already use throughout the prose.
3378
+ */
3379
+ planeBorderColor(player) {
3380
+ switch (player.plane) {
3381
+ case 'matrix': return 'cyan';
3382
+ case 'astral': return 'magenta';
3383
+ case 'drone': return 'yellow';
3384
+ default: return 'white';
3385
+ }
3386
+ }
3387
+ paintPlaneBorder() {
3388
+ if (!this._logBox)
3389
+ return;
3390
+ const style = this._logBox.style;
3391
+ style.border = { ...(style.border ?? {}), fg: this.planeBorderColor(this.player) };
3392
+ }
3322
3393
  statusLinesFor(player) {
3323
3394
  const lines = [];
3324
3395
  // Line 1: the fight autopilot mode. The stance lives HERE -- the
@@ -3336,7 +3407,13 @@ ${client.name} won't be remembering anything. Dead Johnsons pay nothing -- and t
3336
3407
  // what two panels already show. The breadcrumb went with it -- the
3337
3408
  // district map draws the way you came far better than a text trail.
3338
3409
  const stanceColor = player.autoStance === 'aggressive' ? 'red' : player.autoStance === 'guarded' ? 'yellow' : 'white';
3339
- lines.push(`{${stanceColor}-fg}⚔ ${player.autoStance.toUpperCase()}{/${stanceColor}-fg}`);
3410
+ // WHAT'S IN YOUR HANDS rides alongside the stance (player ruling
3411
+ // 2026-08-25). The two answer the same question -- how ready are you
3412
+ // -- and the stance line was left short and lonely once the location
3413
+ // moved out to the map captions, while the readiness line below ran
3414
+ // long. armedLine is built further down with the rest of the gear
3415
+ // read; only its placement moved.
3416
+ lines.push(`{${stanceColor}-fg}⚔ ${player.autoStance.toUpperCase()}{/${stanceColor}-fg} ${this.armedLine(player)}`);
3340
3417
  // Line 2: both condition monitors -- in a game where a fight can kill
3341
3418
  // you and casting can knock you out, current damage on either track is
3342
3419
  // never something a player should have to ask for. Colors shift as
@@ -3355,26 +3432,10 @@ ${client.name} won't be remembering anything. Dead Johnsons pay nothing -- and t
3355
3432
  const heat = this.heatBand();
3356
3433
  if (heat && player === this.player)
3357
3434
  lines.push(heat);
3358
- // Line 3: readiness -- armed state, armor, and whether the commlink is
3359
- // actually live (equipped), the recurring "why can't I call anyone"
3360
- // friction surfaced at a glance.
3361
- const weapon = player.getWeaponProfile();
3362
- const weaponItem = player.getCarriedWeapon();
3363
- const ammoNote = weaponItem?.isFirearm()
3364
- ? (weaponItem.jammed
3365
- ? ` {red-fg}[JAMMED -- reboot]{/red-fg}`
3366
- : weaponItem.ammo === 0 ? ` {red-fg}[DRY]{/red-fg}` : ` [${weaponItem.ammo} rds]`)
3367
- : '';
3368
- // Three armed states on the meat plane: drawn, holstered (weapon
3369
- // carried but riding leather -- "brandish" puts it in hand; combat
3370
- // auto-draws so this is posture, not readiness), or nothing at all.
3371
- // Off-plane the profile is attack programs / astral will and reads as
3372
- // Armed. White, not gray, for the same legibility reason as the stance.
3373
- const armed = player.plane === 'meat' && weaponItem && !player.weaponDrawn
3374
- ? `{white-fg}Holstered: ${weaponItem.name}${ammoNote}${hint(' -- "brandish"')}{/white-fg}`
3375
- : weapon.name === 'bare fists'
3376
- ? `{gray-fg}Unarmed{/gray-fg}`
3377
- : `Armed: ${weapon.name} (DV ${weapon.damage}${weapon.poolBonus > 0 ? `, +${weapon.poolBonus} dice` : ''})${ammoNote}`;
3435
+ // Line 3: the rest of the readiness read -- armor, and whether the
3436
+ // commlink is actually live (equipped), the recurring "why can't I
3437
+ // call anyone" friction surfaced at a glance. The armed state used
3438
+ // to lead this line; it now rides with the stance on line 1.
3378
3439
  const armorNote = `Armor +${player.getArmorValue()}`;
3379
3440
  const hasLink = player.equipment.head?.commlink != null;
3380
3441
  const link = !hasLink
@@ -3384,7 +3445,7 @@ ${client.name} won't be remembering anything. Dead Johnsons pay nothing -- and t
3384
3445
  : player.arOffline
3385
3446
  ? `{red-fg}AR CUT -- reboot{/red-fg}`
3386
3447
  : `{${CALL_COLOR}-fg}Link online{/${CALL_COLOR}-fg}`;
3387
- lines.push(`${armed} | ${armorNote} | ${link}`);
3448
+ lines.push(`${armorNote} | ${link}`);
3388
3449
  // Lines 4+: transient states, present only while active. Future
3389
3450
  // contexts (astral projection, VR hot-sim) join here the same way.
3390
3451
  if (player.sustainedArmor > 0) {