@maka/maka-cli 5.380.0 → 5.380.2

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.380.0",
3
+ "version": "5.380.2",
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.",
@@ -233,30 +233,43 @@ export class CallCommand extends Command {
233
233
  // runner unable to travel with the arc still pointing at it. The
234
234
  // cab takes them home and the homecoming settles it as failed.
235
235
  const jobDead = this.scene.jobDead;
236
+ // The wire, when this cab already crossed it (errand branch below)
237
+ // -- carried into the homecoming's text, whose own checkpoint
238
+ // then finds the heat spent.
239
+ let wireLine = '';
240
+ let busted = false;
236
241
  if (!wrapped && !this.game.walkOutArmed && !jobDead) {
237
- const FARE_OUT = 80;
238
- const paidOut = Math.min(this.actor.currency, FARE_OUT);
239
- const owedOut = FARE_OUT - paidOut;
240
- if (paidOut > 0)
241
- this.actor.adjustCurrency(-paidOut, 'cab home, job left standing');
242
- if (owedOut > 0)
243
- this.game.rentDebt += owedOut;
244
- const errand = this.game.leaveRunForErrand();
242
+ // THE ERRAND CAB IS A RIDE HOME TOO (5Qi7jZsRnz6BwKY5C: "this
243
+ // is contradictory" -- the cab took them home while the HUD
244
+ // still said "they'll be waiting at the checkpoint"). The heat
245
+ // band promises the wire between the site and home; this leg
246
+ // crosses it exactly as the homecoming's does, and settles the
247
+ // heat the same way.
248
+ //
249
+ // ROLLED BEFORE THE ERRAND, not after (aPwBWKPfrbioj2keC: "too
250
+ // much heat" is a FAILED job, user ruling 2026-10-04). A runner
251
+ // in zip ties is not coming back for it, so a bust takes the
252
+ // homecoming road below -- which ends the job -- instead of
253
+ // leaving it standing.
254
+ const checkpoint = this.game.checkpointOnRideHome();
255
+ if (checkpoint)
256
+ this.game.requestSave('venue-bust');
257
+ busted = this.game.rideHomeBusted;
258
+ wireLine = checkpoint;
259
+ const errand = busted ? undefined : this.game.leaveRunForErrand();
245
260
  if (errand !== undefined) {
261
+ const FARE_OUT = 80;
262
+ const paidOut = Math.min(this.actor.currency, FARE_OUT);
263
+ const owedOut = FARE_OUT - paidOut;
264
+ if (paidOut > 0)
265
+ this.actor.adjustCurrency(-paidOut, 'cab home, job left standing');
266
+ if (owedOut > 0)
267
+ this.game.rentDebt += owedOut;
246
268
  this.game?.wipeConsoleFor(this.actor);
247
269
  this.actor.performAction('calls a taxi', 'to run an errand, leaving the job open');
248
270
  const meter = owedOut === 0
249
271
  ? `The meter takes its ${FARE_OUT}.`
250
272
  : `The meter takes what you have; ${owedOut} goes on the tab.`;
251
- // THE ERRAND CAB IS A RIDE HOME TOO (5Qi7jZsRnz6BwKY5C: "this
252
- // is contradictory" -- the cab took them home while the HUD
253
- // still said "they'll be waiting at the checkpoint"). The heat
254
- // band promises the wire between the site and home; this leg
255
- // crosses it exactly as the homecoming's does, and settles the
256
- // heat the same way.
257
- const checkpoint = this.game.checkpointOnRideHome();
258
- if (checkpoint)
259
- this.game.requestSave('venue-bust');
260
273
  return `A cab noses out of the dark. "Back to the pad, chummer?" ${meter}\n`
261
274
  + `The job stays where you left it -- nobody has called it off.${errand ? `\n${errand}` : ''}${checkpoint ? `\n${checkpoint}` : ''}\n`
262
275
  + hint(`("call taxi" again takes you back to it. To WALK OUT for good -- forfeiting the pay and taking the Notoriety -- "abandon".)`);
@@ -285,7 +298,7 @@ export class CallCommand extends Command {
285
298
  if (owed > 0)
286
299
  this.game.rentDebt += owed;
287
300
  this.game?.wipeConsoleFor(this.actor);
288
- this.actor.performAction('calls a taxi', wrapped ? 'for the ride home' : 'and walks away from the job');
301
+ this.actor.performAction('calls a taxi', wrapped ? 'for the ride home' : busted ? 'and is pinched at the wire' : 'and walks away from the job');
289
302
  const home = await this.game.continueToNextScene();
290
303
  const meterLine = owed === 0
291
304
  ? `The meter takes its ${FARE}.`
@@ -298,7 +311,12 @@ export class CallCommand extends Command {
298
311
  // "Refusing to finish a run" is on the book's own notoriety list
299
312
  // (SR5e p.368) -- each abandoned job is its own incident.
300
313
  let walkLine = '';
301
- if (!wrapped && jobDead) {
314
+ if (!wrapped && busted) {
315
+ // Failed at the wire, not walked out on: the arrest already
316
+ // charged what it costs (processArrest).
317
+ walkLine = `The job's blown -- Knight Errant has your face now, and nobody pays a runner who got pinched on the way home.\n`;
318
+ }
319
+ else if (!wrapped && jobDead) {
302
320
  // Not a refusal to finish (p.368's walk-out): the job ended on
303
321
  // site. Killing the Johnson already charged its own notoriety.
304
322
  walkLine = `The job died back there -- there's nothing left to finish and nobody left to pay for it.\n`;
@@ -307,7 +325,7 @@ export class CallCommand extends Command {
307
325
  const stained = this.actor.addNotoriety(`walked out on "${this.game.currentJobName ?? 'a job'}"`);
308
326
  walkLine = `You're leaving the job on the table -- no payout follows you home${stained ? `, and word WILL travel. (+1 Notoriety, now ${this.actor.notoriety})` : '.'}\n`;
309
327
  }
310
- return `${curbLine}${walkLine}A cab noses out of the dark and finds you like it always knew where you'd be. ${meterLine}\n${home}`;
328
+ return `${curbLine}${walkLine}A cab noses out of the dark and finds you like it always knew where you'd be. ${meterLine}${wireLine ? `\n${wireLine}` : ''}\n${home}`;
311
329
  }
312
330
  // A LIVE CREW INVITE (Phase C M4): someone else's job, your seat.
313
331
  // The taxi is the join handshake -- same cab, different table.
@@ -489,8 +507,10 @@ export class CallCommand extends Command {
489
507
  // roles): he names the client and the neighborhood of the rate,
490
508
  // but the details and the number itself belong to the meet.
491
509
  // An operation's chapter on the table is its JOHNSON's to pitch
492
- // (operationDealer), so Krow skips it and takes an order instead.
493
- const pending = this.game.operationDealer ? undefined : this.game.pendingRun;
510
+ // (operationDealer), so Krow skips it and takes an order instead --
511
+ // until it is ACCEPTED: a chapter the runner shook on is the job
512
+ // they are on, and Krow says so rather than taking an order.
513
+ const pending = this.game.operationDealer && !this.game.pendingRunAccepted ? undefined : this.game.pendingRun;
494
514
  if (pending) {
495
515
  await this.dropAnyPlayerLine(); // one line at a time -- the far side hears the click
496
516
  this.actor.activeCallPartner = target;
@@ -498,7 +518,14 @@ export class CallCommand extends Command {
498
518
  // Already shook on it (see commands/job-offer.ts): no re-pitch,
499
519
  // just the broker reminding you the meter's running.
500
520
  if (this.game.pendingRunAccepted) {
501
- void Promise.resolve(target.hear(this.actor, `[System note: ${this.actor.name} already ACCEPTED "${pending.name}" and is calling back BEFORE heading out. One clipped line: the deal stands, the client's waiting, the cab's on their account -- get moving. Never re-pitch.]`)).catch(err => {
521
+ // A JOB LEFT STANDING is still the job (aPwBWKPfrbioj2keC): the
522
+ // runner went out on it and came home on an errand, and Krow
523
+ // knows it is not done -- never the size menu.
524
+ const standing = this.game.hasOpenRun;
525
+ const note = standing
526
+ ? `[System note: ${this.actor.name} is ON "${pending.name}" -- they went out on it, left it standing, and are home on an errand. The job is still theirs and still open. One clipped line: finish it -- the client's still waiting. Never re-pitch, never offer other work.]`
527
+ : `[System note: ${this.actor.name} already ACCEPTED "${pending.name}" and is calling back BEFORE heading out. One clipped line: the deal stands, the client's waiting, the cab's on their account -- get moving. Never re-pitch.]`;
528
+ void Promise.resolve(target.hear(this.actor, note)).catch(err => {
502
529
  this.logger.error(`${target.name} failed to field the callback: ${err}`);
503
530
  });
504
531
  return `${CALL_ICON} ${FIXER_NAME} picks up.${hint(` (The job's locked -- "call taxi" when you're ready.)`)}`;
@@ -58,9 +58,14 @@ export class JobsCommand extends Command {
58
58
  // ...EXCEPT a crew job filed from a hosted hub (Gdou2JNdn3kwYNWdi):
59
59
  // the engine's cab cannot start a shared session in a host, so the
60
60
  // ride out is the site's second act and the row says where.
61
+ // A JOB LEFT STANDING (aPwBWKPfrbioj2keC: "jobs" showed nothing
62
+ // on an errand home) is still the runner's, and the row says where.
63
+ const standingAt = game.hasOpenRun ? game.openRunSceneName : undefined;
61
64
  const accepted = game.crewJobRidesFromTheSheet
62
65
  ? ` -- ACCEPTED. ${CREW_JOB_RIDE_LINE}`
63
- : ' -- ACCEPTED, "call taxi" rolls';
66
+ : game.hasOpenRun
67
+ ? ` -- IN PROGRESS, left standing${standingAt ? ` at ${standingAt}` : ''}; "call taxi" goes back`
68
+ : ' -- ACCEPTED, "call taxi" rolls';
64
69
  const unheard = ` -- "call ${this.fixerName()}" to hear it`;
65
70
  const tail = game.pendingRunAccepted ? accepted : unheard;
66
71
  // Whose job it is: one job per Johnson (2026-10-01).
@@ -168,6 +173,12 @@ export class JobsCommand extends Command {
168
173
  this.logger.write(`Jobs board: took "${entry.name}" from the drawer.`);
169
174
  return `"${entry.name}" is on the table.${hint(` ("call ${dealer}" to hear it -- "accept" or "decline" once you have.)`)}`;
170
175
  }
176
+ // AN ACCEPTED JOB IS NEVER SWAPPED ASIDE (aPwBWKPfrbioj2keC): only
177
+ // finishing, failing or walking it ends it -- the same refusal the
178
+ // drawer swap gives (Game.takeFromDrawer).
179
+ if (game.pendingRun && game.pendingRunAccepted) {
180
+ return `You've already shaken on "${game.pendingRun.name}" -- finish it, or "abandon" it, before you take another off the board.`;
181
+ }
171
182
  // Swap the current offer aside (the server draft behind a CREW offer
172
183
  // survives -- fingerprint reuse brings it back to the board).
173
184
  if (game.pendingRun) {
@@ -157,9 +157,11 @@ export class JournalCommand extends Command {
157
157
  const lines = [`{bold}THE JOURNAL{/bold}`, `You're home. No run on the clock.`];
158
158
  const pending = game.pendingRun;
159
159
  if (pending) {
160
- lines.push(game.pendingRunAccepted
161
- ? `${BULLET}{bold}Next:{/bold} "${pending.name}" -- ACCEPTED. ("call taxi" rolls.)`
162
- : `${BULLET}{bold}On offer:{/bold} "${pending.name}" -- not shaken on yet.`);
160
+ lines.push(game.hasOpenRun
161
+ ? `${BULLET}{bold}In progress:{/bold} "${pending.name}" -- left standing. ("call taxi" goes back.)`
162
+ : game.pendingRunAccepted
163
+ ? `${BULLET}{bold}Next:{/bold} "${pending.name}" -- ACCEPTED. ("call taxi" rolls.)`
164
+ : `${BULLET}{bold}On offer:{/bold} "${pending.name}" -- not shaken on yet.`);
163
165
  }
164
166
  if (game.rentDebt > 0) {
165
167
  lines.push(`${BULLET}{bold}Owed:{/bold} ${game.rentDebt.toLocaleString()}¥ on the tab`);
@@ -3263,5 +3263,24 @@
3263
3263
  // add (engine rule), the RCC's drone network (p.267).
3264
3264
  // - The condition beat carries `pan` (utilities/pan-status.ts) for the
3265
3265
  // web sheet's PAN card; same rows as the verb.
3266
- export const ENGINE_VERSION = '1.192.0';
3266
+ // 1.192.1 (2026-10-04): A JOB STAYS ON THE BOOKS UNTIL IT ENDS
3267
+ // (aPwBWKPfrbioj2keC; ruling: never cleared unless abandoned or failed).
3268
+ // - The ride out no longer clears the accepted job: it stays the
3269
+ // runner's through the run and every errand home, and is saved with
3270
+ // them, so a quit mid-errand comes back with it accepted and "call
3271
+ // taxi" rides it again. Only the homecoming ends it -- wrapped, walked
3272
+ // out ("abandon"), died on site, or pinched at the wire.
3273
+ // - The errand cab rolls the KE checkpoint FIRST: a bust there fails the
3274
+ // job and takes the homecoming road instead of leaving it standing.
3275
+ // - "jobs", the journal and Krow's callback name a job left standing
3276
+ // ("IN PROGRESS") instead of "Nothing on offer" and the size menu.
3277
+ // - A standing draft ("jobs take") and a crew change no longer swap an
3278
+ // accepted job aside; a ride that never shows keeps the job.
3279
+ // 1.192.2 (2026-10-04): A GUARD WHO STEPS OFF THE POST IS DRAWN WHERE HE
3280
+ // STANDS (dfFCcY3oDfsvd8gmi). seatingIn pinned every `guarding` NPC to
3281
+ // the post before reading exact cells, so a picket the combat brain
3282
+ // walked toward a runner was narrated stepping while the map, melee
3283
+ // reach and ranges all read the post. A picket with an exact cell is
3284
+ // now seated from it.
3285
+ export const ENGINE_VERSION = '1.192.2';
3267
3286
  //# sourceMappingURL=engine-version.js.map
@@ -538,6 +538,13 @@ export default class Game {
538
538
  scrapPendingRunForCrewChange() {
539
539
  if (!this._pendingRunSeed)
540
540
  return '';
541
+ // A QUOTE, not a job: once accepted it is the runner's until it ends
542
+ // (aPwBWKPfrbioj2keC) -- a hire made on an errand home must not
543
+ // void the job they are halfway through.
544
+ // (A CREW quote is the server's draft for a seated party, and the
545
+ // crew-change ruling still voids it.)
546
+ if (this.pendingRunAccepted && !this.pendingSharedRun)
547
+ return '';
541
548
  this.clearPendingRun({ keepServerDraft: true });
542
549
  return `\nThe standing job was quoted for a different crew -- ${FIXER_NAME} needs a fresh call.`;
543
550
  }
@@ -3766,9 +3773,20 @@ export default class Game {
3766
3773
  _pendingRunTier;
3767
3774
  // The explicit handshake (player ruling, commands/job-offer.ts):
3768
3775
  // "accept" locks the offer -- rate final, haggle closed, decline
3769
- // refused -- until "call taxi" installs it. Reset wherever the
3770
- // pending seed changes hands.
3776
+ // refused. Reset wherever the pending seed changes hands.
3777
+ //
3778
+ // AN ACCEPTED JOB STAYS ON THE BOOKS UNTIL IT ENDS (aPwBWKPfrbioj2keC,
3779
+ // user ruling 2026-10-04: "NEVER clear a job unless it is abandoned or
3780
+ // failed"). The ride out no longer clears it: the seed stays here,
3781
+ // accepted, for the whole run and every errand home, and only the
3782
+ // homecoming (returnToHub -- wrapped, walked out, died on site, busted
3783
+ // at the wire) ends it. That is what lets the board, Krow and the save
3784
+ // all still see a job the runner left standing; a quit mid-errand
3785
+ // comes back with it accepted and "call taxi" rides it again.
3771
3786
  pendingRunAccepted = false;
3787
+ /** Set by checkpointOnRideHome when the wire ends in an arrest: a ride
3788
+ * that ends in zip ties is a failed job, never an errand (call.ts). */
3789
+ rideHomeBusted = false;
3772
3790
  /**
3773
3791
  * The words the player ACTUALLY said, when speech routed itself to
3774
3792
  * `accept` (commands/say.ts). It rides into the fixer's signoff note
@@ -7122,6 +7140,12 @@ ${client.name} won't be remembering anything. Dead Johnsons pay nothing -- and t
7122
7140
  const wrappedRun = this.scene !== hub && this.scene.isCompleted();
7123
7141
  // And its name, for the same reason: the operation matches on it.
7124
7142
  const jobNameBefore = this.scene !== hub ? this.currentJobName : undefined;
7143
+ // THE ONE PLACE A RIDDEN JOB COMES OFF THE BOOKS (aPwBWKPfrbioj2keC):
7144
+ // this homecoming is wrapped, walked out on, died on site or busted at
7145
+ // the wire -- every way a job ends. The ride out and the errand cab
7146
+ // leave it standing (see pendingRunAccepted).
7147
+ if (this.scene !== hub)
7148
+ this.clearPendingRun({ keepServerDraft: true });
7125
7149
  // A LOUD RUN PUTS YOUR FACE ON A FEED (TRqb2zBphwpDkeXP4, Maka: "the
7126
7150
  // alarm was exciting, but nothing came of it").
7127
7151
  //
@@ -7568,6 +7592,7 @@ ${client.name} won't be remembering anything. Dead Johnsons pay nothing -- and t
7568
7592
  checkpointOnRideHome() {
7569
7593
  const heat = this._runHeat;
7570
7594
  this._runHeat = 0;
7595
+ this.rideHomeBusted = false;
7571
7596
  if (heat < Game.CHECKPOINT_HEAT)
7572
7597
  return '';
7573
7598
  const p = this.player;
@@ -7604,6 +7629,7 @@ ${client.name} won't be remembering anything. Dead Johnsons pay nothing -- and t
7604
7629
  p.inventory.removeItem(fake.item.name);
7605
7630
  lines.push(`You hand over the Rating ${fake.rating} fake. The wand chews... and SPITS. "This SIN is flagged as of now." The fake is BURNED -- worthless in every database at once.`);
7606
7631
  lines.push(processArrest(p, heat));
7632
+ this.rideHomeBusted = true;
7607
7633
  return lines.join('\n');
7608
7634
  }
7609
7635
  const con = p.skillRating('con');
@@ -7616,6 +7642,7 @@ ${client.name} won't be remembering anything. Dead Johnsons pay nothing -- and t
7616
7642
  }
7617
7643
  lines.push(`No SIN, and no story that holds. Zip ties.`);
7618
7644
  lines.push(processArrest(p, heat));
7645
+ this.rideHomeBusted = true;
7619
7646
  return lines.join('\n');
7620
7647
  }
7621
7648
  /**
@@ -8164,16 +8191,18 @@ ${client.name} won't be remembering anything. Dead Johnsons pay nothing -- and t
8164
8191
  // job's negotiation with the job, so anything still set when a ride
8165
8192
  // is called genuinely belongs to the offer in hand.
8166
8193
  const haggledAtOffer = this.player.haggledThisJob;
8194
+ // NOT CLEARED HERE (aPwBWKPfrbioj2keC): the accepted job rides along
8195
+ // and stays on the books until the homecoming ends it -- see
8196
+ // pendingRunAccepted. A ride that never shows ends nothing either:
8197
+ // the job is still the runner's, and the next cab tries again.
8167
8198
  try {
8168
8199
  const banner = await this.activateRunScene(seed, tier, { startInHideout: false });
8169
- this.clearPendingRun();
8170
8200
  this.player.haggledThisJob = haggledAtOffer;
8171
8201
  return `You travel to ${this.player.currentLocation.name}.\n${banner}`;
8172
8202
  }
8173
8203
  catch (err) {
8174
- this.clearPendingRun();
8175
8204
  Logger.getInstance().error(`launchPendingRun failed: ${err}`);
8176
- return `The ride never shows and the job address goes dead. ${FIXER_NAME} will not enjoy hearing this -- call him for another.`;
8205
+ return `The ride never shows -- the dispatcher lost the address. The job's still yours; "call taxi" to try again.`;
8177
8206
  }
8178
8207
  }
8179
8208
  /**
@@ -641,11 +641,22 @@ export function seatingIn(room) {
641
641
  // -- every press on that door flipped the dot between two cells. The
642
642
  // fallen hold no ground (standingOccupants); they are seated with
643
643
  // everyone else below.
644
+ //
645
+ // ...AND ONLY WHILE SHE IS STILL ON IT (dfFCcY3oDfsvd8gmi, player
646
+ // 2026-10-04: "I see Grit moved, but I don't see it happened on the
647
+ // map"). A picket is positioned by spot and holds no exact cell; one
648
+ // that HAS one stepped there -- the combat brain closing on a runner,
649
+ // a walk, a shove. Pinning her to the post anyway drew the post while
650
+ // her steps were narrated, and inMeleeReach measured from the post too,
651
+ // so she paced every phase and "couldn't get any closer". She is
652
+ // seated from her cell in the pass below, like anyone who stepped.
644
653
  for (const a of seated) {
645
654
  if (!a.guarding)
646
655
  continue;
647
656
  if (a.isIncapacitated())
648
657
  continue;
658
+ if (a.atCell)
659
+ continue;
649
660
  const spot = spotOf(a);
650
661
  const anchor = seatAnchorFor(room, spot);
651
662
  if (!anchor)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maka/maka-cli",
3
- "version": "5.380.0",
3
+ "version": "5.380.2",
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.",