@maka/maka-cli 5.31.0 → 5.33.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.31.0",
3
+ "version": "5.33.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.",
@@ -92,7 +92,9 @@ export default class Game {
92
92
  * that changed while a job was mid-generation (see draftNextScene). */
93
93
  livePartyFingerprint(): string;
94
94
  /** The crew-change rule (player ruling): any roster change voids the
95
- * standing quote. Returns the line to show, or ''. */
95
+ * standing quote. The SERVER draft survives (keepServerDraft) -- if
96
+ * the same table re-forms, the next call gets the same job back.
97
+ * Returns the line to show, or ''. */
96
98
  scrapPendingRunForCrewChange(): string;
97
99
  performedThisCycle: boolean;
98
100
  private _runHeat;
@@ -459,8 +461,15 @@ export default class Game {
459
461
  * through here so the remote side is never left holding a dead line.
460
462
  */
461
463
  hangUpCrewChannel(player: Player): string | undefined;
462
- /** Trash the offer wholesale ("decline", and any future fixer snub). */
463
- clearPendingRun(): void;
464
+ /** Trash the offer wholesale ("decline", and any future fixer snub).
465
+ * keepServerDraft (crew-change scraps, player ruling 2026-08-24):
466
+ * the LOCAL quote dies but the server-side draft stays standing --
467
+ * createSession is fingerprint-keyed, so the same party re-forming
468
+ * gets the same job back instead of paying for a regeneration. An
469
+ * explicit DECLINE never passes it: a rejected job stays rejected. */
470
+ clearPendingRun(opts?: {
471
+ keepServerDraft?: boolean;
472
+ }): void;
464
473
  get pendingRun(): ISceneSeedJson | undefined;
465
474
  get pendingRunTier(): number | undefined;
466
475
  currentClient?: {
@@ -229,11 +229,13 @@ export default class Game {
229
229
  .join(',');
230
230
  }
231
231
  /** The crew-change rule (player ruling): any roster change voids the
232
- * standing quote. Returns the line to show, or ''. */
232
+ * standing quote. The SERVER draft survives (keepServerDraft) -- if
233
+ * the same table re-forms, the next call gets the same job back.
234
+ * Returns the line to show, or ''. */
233
235
  scrapPendingRunForCrewChange() {
234
236
  if (!this._pendingRunSeed)
235
237
  return '';
236
- this.clearPendingRun();
238
+ this.clearPendingRun({ keepServerDraft: true });
237
239
  return `\nThe standing job was quoted for a different crew -- ${FIXER_NAME} needs a fresh call.`;
238
240
  }
239
241
  // PERFORMANCE's busking gate (commands/perform.ts): one set per job
@@ -1358,15 +1360,22 @@ export default class Game {
1358
1360
  }
1359
1361
  return channel.playerName;
1360
1362
  }
1361
- /** Trash the offer wholesale ("decline", and any future fixer snub). */
1362
- clearPendingRun() {
1363
+ /** Trash the offer wholesale ("decline", and any future fixer snub).
1364
+ * keepServerDraft (crew-change scraps, player ruling 2026-08-24):
1365
+ * the LOCAL quote dies but the server-side draft stays standing --
1366
+ * createSession is fingerprint-keyed, so the same party re-forming
1367
+ * gets the same job back instead of paying for a regeneration. An
1368
+ * explicit DECLINE never passes it: a rejected job stays rejected. */
1369
+ clearPendingRun(opts) {
1363
1370
  if (this.pendingSharedRun) {
1364
- // The server-side draft dies with the local offer.
1371
+ // The server-side draft dies with the local offer (unless kept).
1365
1372
  const { sessionID } = this.pendingSharedRun;
1366
1373
  this.pendingSharedRun = undefined;
1367
- void import('./utilities/shared-run.js')
1368
- .then(m => m.HubLink.abortDraft(sessionID))
1369
- .catch(() => undefined);
1374
+ if (!opts?.keepServerDraft) {
1375
+ void import('./utilities/shared-run.js')
1376
+ .then(m => m.HubLink.abortDraft(sessionID))
1377
+ .catch(() => undefined);
1378
+ }
1370
1379
  }
1371
1380
  this._pendingRunSeed = undefined;
1372
1381
  this._pendingRunTier = undefined;
@@ -2162,7 +2171,7 @@ ${client.name} won't be remembering anything. Dead Johnsons pay nothing -- and t
2162
2171
  return { allowed: false, message: `This job isn't finished yet.` };
2163
2172
  }
2164
2173
  if (!this._useAi) {
2165
- return { allowed: false, message: `Continuing needs an AI-generated job, which requires an AI provider to be configured (OPENAI_API_KEY or ANTHROPIC_API_KEY).` };
2174
+ return { allowed: false, message: `Continuing needs an AI-generated job, which requires an AI provider to be configured (OPENAI_API_KEY or ANTHROPIC_API_KEY) -- or a maka-cli.com login with server AI access (\`maka login\`).` };
2166
2175
  }
2167
2176
  return { allowed: true };
2168
2177
  }
@@ -2530,7 +2539,16 @@ ${client.name} won't be remembering anything. Dead Johnsons pay nothing -- and t
2530
2539
  this._pendingRunTier = undefined;
2531
2540
  this._pendingRide = Game.RIDE_POOL[Math.floor(Math.random() * Game.RIDE_POOL.length)];
2532
2541
  this.pendingRunAccepted = false;
2533
- return `Your link pings -- 1 new message: ${FIXER_NAME}. The crew's channel is already humming.${hint(` ("call ${FIXER_NAME}" to hear the job.)`)}`;
2542
+ // Off-street seat-mates were dropped from tonight's quote by the
2543
+ // server (their seats survive -- back on the street, back on the
2544
+ // job). Krow NAMES them; silence here already cost one playtest.
2545
+ const absentNames = (shared.absent ?? [])
2546
+ .map(h => this.crew.find(m => m.ghost?.owner === h)?.name ?? h);
2547
+ const absentNote = absentNames.length
2548
+ ? ` "Couldn't raise ${absentNames.join(', ')} -- quoted for who answered."`
2549
+ : '';
2550
+ const reusedNote = shared.reused ? ` "Same job as before, chummer -- the client's still waiting."` : '';
2551
+ return `Your link pings -- 1 new message: ${FIXER_NAME}.${absentNote}${reusedNote} The crew's channel is already humming.${hint(` ("call ${FIXER_NAME}" to hear the job.)`)}`;
2534
2552
  }
2535
2553
  }
2536
2554
  // Each run invents its OWN client Johnson (canon roles: the fixer