@maka/maka-cli 5.65.2 → 5.67.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/bundle/typescript/package.json +1 -1
- package/bundle/typescript/src/commands/game/_index.d.ts +1 -0
- package/bundle/typescript/src/commands/game/_index.js +1 -0
- package/bundle/typescript/src/commands/game/_index.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/backlog.d.ts +124 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/backlog.js +487 -29
- package/bundle/typescript/src/commands/game/sideQuest/commands/backlog.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/bluff.d.ts +15 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/bluff.js +61 -4
- package/bundle/typescript/src/commands/game/sideQuest/commands/bluff.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/crew.js +4 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/crew.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/note.d.ts +73 -14
- package/bundle/typescript/src/commands/game/sideQuest/commands/note.js +150 -40
- package/bundle/typescript/src/commands/game/sideQuest/commands/note.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/review.d.ts +39 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/review.js +48 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/review.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/sheet.js +4 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/sheet.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/engine-version.d.ts +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/engine-version.js +15 -1
- package/bundle/typescript/src/commands/game/sideQuest/engine-version.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/factories/repro-scene.d.ts +87 -0
- package/bundle/typescript/src/commands/game/sideQuest/factories/repro-scene.js +320 -0
- package/bundle/typescript/src/commands/game/sideQuest/factories/repro-scene.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.d.ts +36 -0
- package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.js +116 -3
- package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/factories/scene-factory.js +8 -1
- package/bundle/typescript/src/commands/game/sideQuest/factories/scene-factory.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/game.d.ts +48 -0
- package/bundle/typescript/src/commands/game/sideQuest/game.js +112 -13
- package/bundle/typescript/src/commands/game/sideQuest/game.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/headless-harness.d.ts +12 -0
- package/bundle/typescript/src/commands/game/sideQuest/headless-harness.js +23 -0
- package/bundle/typescript/src/commands/game/sideQuest/headless-harness.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/headless.js +4 -1
- package/bundle/typescript/src/commands/game/sideQuest/headless.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/npc.d.ts +32 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/npc.js +122 -3
- package/bundle/typescript/src/commands/game/sideQuest/models/npc.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/types/repro.d.ts +106 -0
- package/bundle/typescript/src/commands/game/sideQuest/types/repro.js +2 -0
- package/bundle/typescript/src/commands/game/sideQuest/types/repro.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/types/seed/device-seed.d.ts +12 -0
- package/bundle/typescript/src/commands/game/sideQuest/ui.d.ts +9 -0
- package/bundle/typescript/src/commands/game/sideQuest/ui.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog-dump.d.ts +17 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog-dump.js +250 -36
- package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog-dump.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog-review.d.ts +67 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog-review.js +99 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog-review.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog-vocab.d.ts +85 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog-vocab.js +100 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog-vocab.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog.d.ts +58 -3
- package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog.js +82 -3
- package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/commit-ref.d.ts +13 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/commit-ref.js +22 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/commit-ref.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/handoff.d.ts +42 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/handoff.js +57 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/handoff.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/identity.d.ts +36 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/identity.js +48 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/identity.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/repro-launch.d.ts +68 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/repro-launch.js +147 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/repro-launch.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/room-grid.js +55 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/room-grid.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/room-view.d.ts +27 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/room-view.js +44 -11
- package/bundle/typescript/src/commands/game/sideQuest/utilities/room-view.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/shared-run.d.ts +47 -2
- package/bundle/typescript/src/commands/game/sideQuest/utilities/shared-run.js +76 -8
- package/bundle/typescript/src/commands/game/sideQuest/utilities/shared-run.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/spots.js +39 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/spots.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/table-notes.d.ts +30 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/table-notes.js +46 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/table-notes.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest-backlog.sub.cmd.d.ts +1 -0
- package/bundle/typescript/src/commands/game/sideQuest-backlog.sub.cmd.js +46 -0
- package/bundle/typescript/src/commands/game/sideQuest-backlog.sub.cmd.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.d.ts +3 -1
- package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js +269 -42
- package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js.map +1 -1
- package/bundle/typescript/src/tools/log/log.class.d.ts +17 -0
- package/bundle/typescript/src/tools/log/log.class.js +30 -1
- package/bundle/typescript/src/tools/log/log.class.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE BOARD'S SHARED VOCABULARY -- what a status is called, what a
|
|
3
|
+
* verdict is called, and how loud each one is.
|
|
4
|
+
*
|
|
5
|
+
* Two surfaces render the backlog and they used to word it twice:
|
|
6
|
+
* `commands/backlog.ts` in-game (blessed tags) and
|
|
7
|
+
* `utilities/backlog-dump.ts` out of game (chalk, via Log). The labels
|
|
8
|
+
* were retyped in both, which is the shape of a fault this repo has
|
|
9
|
+
* already paid for -- the launcher's second copy of the status list
|
|
10
|
+
* refused `in-review` as a typo while the server had been writing it
|
|
11
|
+
* for a day (see sideQuest.sub.cmd.ts's note on its own duplication).
|
|
12
|
+
*
|
|
13
|
+
* WHAT IS SHARED IS THE VOCABULARY, NOT THE PAINT. A tone is a severity,
|
|
14
|
+
* not a colour: blessed and chalk have different palettes and different
|
|
15
|
+
* legibility problems, so each surface maps tone to its own ink. What
|
|
16
|
+
* neither surface gets to decide for itself is what an item is CALLED
|
|
17
|
+
* or how much it matters.
|
|
18
|
+
*
|
|
19
|
+
* Pure on purpose -- no Log, no blessed, no transport. The out-of-game
|
|
20
|
+
* dump is loaded lazily precisely so reading a list touches none of the
|
|
21
|
+
* game graph, and this module must not be the thing that drags it in.
|
|
22
|
+
*/
|
|
23
|
+
export const BACKLOG_STATUSES = ['open', 'in-progress', 'in-review', 'complete', 'wont-fix'];
|
|
24
|
+
/**
|
|
25
|
+
* THE PRINT ORDER: lowest priority first, so what needs you ends up at
|
|
26
|
+
* the BOTTOM -- closest to the prompt, which is where a scrolling
|
|
27
|
+
* terminal leaves your eye.
|
|
28
|
+
*
|
|
29
|
+
* The server sorts in-review first, and that is right for a caller
|
|
30
|
+
* iterating the list. It is wrong for PRINTING it, and the difference
|
|
31
|
+
* has now been reported three times about three different surfaces:
|
|
32
|
+
* the review queue ("REVERSE THE ORDER OF THE REVIEW ITEMS"), the
|
|
33
|
+
* out-of-game board ("So the list is backwards"), and the in-game one
|
|
34
|
+
* ("I see 'wont' items first"). Each was fixed where it was reported
|
|
35
|
+
* and nowhere else, so the same board read correctly in one place and
|
|
36
|
+
* backwards in the next.
|
|
37
|
+
*
|
|
38
|
+
* Lives here, with the other thing every surface must agree about.
|
|
39
|
+
* Reversal happens at the point of PRINT and never in the data: the
|
|
40
|
+
* server's priority order and which end a human reads first are two
|
|
41
|
+
* separate facts, and collapsing them is how a number would come to
|
|
42
|
+
* mean a different row than the one it labels.
|
|
43
|
+
*
|
|
44
|
+
* See reviewDisplayOrder in backlog-review.ts for the numbered variant
|
|
45
|
+
* of this same rule -- it binds each row's number BEFORE reversing,
|
|
46
|
+
* which is the invariant that keeps "review 1" pointing at row 1.
|
|
47
|
+
*/
|
|
48
|
+
export function boardPrintOrder(items) {
|
|
49
|
+
return [...items].reverse();
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* `in-review` is 'alert' rather than 'info', and it is the one place
|
|
53
|
+
* this file makes a judgement instead of recording one. An in-review
|
|
54
|
+
* row is the only status that is WAITING ON THE READER: everything else
|
|
55
|
+
* describes what somebody else is doing. It used to render the same
|
|
56
|
+
* cyan as in-progress, so on a 125-row board the rows that needed the
|
|
57
|
+
* player did not look different from the rows that did not.
|
|
58
|
+
*/
|
|
59
|
+
const STATUS_LABELS = {
|
|
60
|
+
'open': { label: '[open]', tone: 'warn' },
|
|
61
|
+
'in-progress': { label: '[wip] ', tone: 'info' },
|
|
62
|
+
'in-review': { label: '[you?]', tone: 'alert' },
|
|
63
|
+
'complete': { label: '[done]', tone: 'good' },
|
|
64
|
+
// "[no]" until 2026-08-28, when the only person reading this board
|
|
65
|
+
// asked what it meant. It read as a refusal or an error rather than a
|
|
66
|
+
// status -- and it is neither: a wont-fix is a DECISION, taken and
|
|
67
|
+
// recorded. A six-character tag has to carry that on its own, because
|
|
68
|
+
// there is no legend anywhere and nobody should need one.
|
|
69
|
+
'wont-fix': { label: '[wont]', tone: 'dim' },
|
|
70
|
+
};
|
|
71
|
+
/** An unknown status renders as itself rather than as "open". A status
|
|
72
|
+
* this build has never heard of is news, and reporting it as the
|
|
73
|
+
* default hid exactly that: `in-review` shipped from the server and
|
|
74
|
+
* showed here as "[open]" -- an item awaiting the player's word drawn
|
|
75
|
+
* as one nobody had touched. */
|
|
76
|
+
export function statusLabel(status) {
|
|
77
|
+
return STATUS_LABELS[status] ?? { label: `[${status}]`, tone: 'dim' };
|
|
78
|
+
}
|
|
79
|
+
/** Whether this status has a label of its own, rather than falling back
|
|
80
|
+
* to being echoed raw. Exists for the test that matters: every status
|
|
81
|
+
* the transport knows about must be named here. Asking that of
|
|
82
|
+
* statusLabel's OUTPUT cannot work -- "open" legitimately renders as
|
|
83
|
+
* "[open]", which is also the exact shape of the fallback, so the two
|
|
84
|
+
* are indistinguishable from outside. */
|
|
85
|
+
export function hasStatusLabel(status) {
|
|
86
|
+
return Object.prototype.hasOwnProperty.call(STATUS_LABELS, status);
|
|
87
|
+
}
|
|
88
|
+
/** The verdict is about the GAME, not the rulebooks -- see the reframing
|
|
89
|
+
* note in commands/backlog.ts. */
|
|
90
|
+
const VERDICT_LABELS = {
|
|
91
|
+
'canon-violation': { label: 'breaks the rules', tone: 'bad' },
|
|
92
|
+
'bug': { label: 'bug', tone: 'bad' },
|
|
93
|
+
'enhancement': { label: 'wants building', tone: 'warn' },
|
|
94
|
+
'works-as-intended': { label: 'working as meant', tone: 'good' },
|
|
95
|
+
'needs-detail': { label: 'needs detail', tone: 'info' },
|
|
96
|
+
};
|
|
97
|
+
export function verdictLabel(verdict) {
|
|
98
|
+
return VERDICT_LABELS[verdict] ?? { label: 'needs detail', tone: 'info' };
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=backlog-vocab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backlog-vocab.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/utilities/backlog-vocab.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAkBH,MAAM,CAAC,MAAM,gBAAgB,GAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAE9G;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,eAAe,CAAI,KAAU;IAC3C,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;AAC9B,CAAC;AAWD;;;;;;;GAOG;AACH,MAAM,aAAa,GAAkC;IACnD,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE;IACzC,aAAa,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE;IAChD,WAAW,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE;IAC/C,UAAU,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE;IAC7C,mEAAmE;IACnE,sEAAsE;IACtE,mEAAmE;IACnE,sEAAsE;IACtE,0DAA0D;IAC1D,UAAU,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE;CAC7C,CAAC;AAEF;;;;iCAIiC;AACjC,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,MAAM,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACxE,CAAC;AAED;;;;;0CAK0C;AAC1C,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;AACrE,CAAC;AAED;mCACmC;AACnC,MAAM,cAAc,GAAkC;IACpD,iBAAiB,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,KAAK,EAAE;IAC7D,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE;IACpC,aAAa,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE;IACxD,mBAAmB,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE;IAChE,cAAc,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE;CACxD,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC5E,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { IRepro } from '../types/repro.js';
|
|
1
2
|
/**
|
|
2
3
|
* `in-review` was missing here until 2026-08-27, and the first
|
|
3
4
|
* populated review payload is what exposed it: the server has been able
|
|
@@ -7,14 +8,23 @@
|
|
|
7
8
|
* board showed an item awaiting confirmation as though nobody had
|
|
8
9
|
* touched it, and `backlog list in-review` was refused as a typo.
|
|
9
10
|
*/
|
|
10
|
-
export type BacklogStatus
|
|
11
|
-
export
|
|
11
|
+
export type { BacklogStatus } from './backlog-vocab.js';
|
|
12
|
+
export { BACKLOG_STATUSES } from './backlog-vocab.js';
|
|
13
|
+
import type { BacklogStatus } from './backlog-vocab.js';
|
|
12
14
|
export interface IBacklogItem {
|
|
13
15
|
_id: string;
|
|
14
16
|
text: string;
|
|
15
17
|
reporterHandle?: string;
|
|
16
18
|
runnerName?: string;
|
|
17
19
|
sessionId?: string;
|
|
20
|
+
/** WHICH BUILD SAW IT. Sent by the server since the board shipped --
|
|
21
|
+
* they are in every /list payload -- and simply never declared here,
|
|
22
|
+
* so no reader could use them. They matter to a reviewer: an item
|
|
23
|
+
* filed against an older engine may already be fixed, and knowing
|
|
24
|
+
* the platform is half of reproducing a terminal bug. */
|
|
25
|
+
cliVersion?: string;
|
|
26
|
+
engineVersion?: string;
|
|
27
|
+
platform?: string;
|
|
18
28
|
status: BacklogStatus;
|
|
19
29
|
/** The commits that closed it. The server refuses to move an item to
|
|
20
30
|
* `complete` without at least one (user ruling 2026-08-27), so a
|
|
@@ -22,6 +32,11 @@ export interface IBacklogItem {
|
|
|
22
32
|
* which is what stops the board drifting from the tree. `wont-fix`
|
|
23
33
|
* is exempt: there is no commit behind deciding not to act. */
|
|
24
34
|
commits?: string[];
|
|
35
|
+
/** THE BENCH, when one is attached. Already on the wire -- /list uses
|
|
36
|
+
* an EXCLUSION projection, so this arrives whether or not anyone
|
|
37
|
+
* declared it -- and undeclared is how a board full of benches looked
|
|
38
|
+
* identical to a board with none. */
|
|
39
|
+
repro?: IRepro;
|
|
25
40
|
vetting?: {
|
|
26
41
|
state: 'pending' | 'vetted' | 'failed';
|
|
27
42
|
verdict?: 'bug' | 'canon-violation' | 'enhancement' | 'works-as-intended' | 'needs-detail';
|
|
@@ -82,6 +97,11 @@ export interface IReviewItem {
|
|
|
82
97
|
text: string;
|
|
83
98
|
at?: string;
|
|
84
99
|
};
|
|
100
|
+
/** THE BENCH THIS FIX SHIPS WITH: a scene spec the client builds a
|
|
101
|
+
* two-room bench from, and the literal commands to type in it. Not
|
|
102
|
+
* every item has one -- some are about a verb, a note or a menu --
|
|
103
|
+
* so absence is ordinary and says so rather than reading as broken. */
|
|
104
|
+
repro?: IRepro;
|
|
85
105
|
}
|
|
86
106
|
/**
|
|
87
107
|
* The review queue, OLDEST FIRST. That order is load-bearing and comes
|
|
@@ -126,6 +146,30 @@ export declare function postBacklogComment(itemId: string, text: string, opts?:
|
|
|
126
146
|
* it is actually fixed.
|
|
127
147
|
*/
|
|
128
148
|
export declare function postBacklogSignoff(itemId: string, note: string, runnerName?: string): Promise<BacklogOutcome>;
|
|
149
|
+
/**
|
|
150
|
+
* THE REPORTER SAYS NO -- the other half of a sign-off.
|
|
151
|
+
*
|
|
152
|
+
* Until 2026-08-27 a validation request could only be answered "yes".
|
|
153
|
+
* Saying "still broken" left a comment that changed nothing: the row
|
|
154
|
+
* stayed in-review, nobody was signalled, and to the board a rejection
|
|
155
|
+
* was indistinguishable from silence.
|
|
156
|
+
*
|
|
157
|
+
* Reopens the item and records the reason. The commits stay attached --
|
|
158
|
+
* they are what was TRIED, and knowing what did not work is worth more
|
|
159
|
+
* than a clean slate.
|
|
160
|
+
*/
|
|
161
|
+
export declare function postBacklogReject(itemId: string, note: string, runnerName?: string): Promise<BacklogOutcome>;
|
|
162
|
+
/**
|
|
163
|
+
* CLOSE IT WITH NO VERDICT -- the reporter withdraws their own item.
|
|
164
|
+
*
|
|
165
|
+
* The third answer, and the board had only two. Signing off a mistake
|
|
166
|
+
* puts a false confirmation on the record; rejecting it sends imaginary
|
|
167
|
+
* work back to whoever "fixed" it. Both lie, in opposite directions.
|
|
168
|
+
*
|
|
169
|
+
* Lands on `wont-fix` server-side, which is what that status has always
|
|
170
|
+
* meant: closed with nothing behind it. Reporter or admin.
|
|
171
|
+
*/
|
|
172
|
+
export declare function postBacklogClose(itemId: string, note: string, runnerName?: string): Promise<BacklogOutcome>;
|
|
129
173
|
export interface IRoleHolder {
|
|
130
174
|
email?: string;
|
|
131
175
|
roles: string[];
|
|
@@ -144,7 +188,18 @@ export declare function setRole(action: 'grant' | 'revoke', email: string, role:
|
|
|
144
188
|
outcome: BacklogOutcome;
|
|
145
189
|
message?: string;
|
|
146
190
|
}>;
|
|
147
|
-
|
|
191
|
+
/**
|
|
192
|
+
* The board.
|
|
193
|
+
*
|
|
194
|
+
* WITHOUT a status, the server now leaves CLOSED items out (user ruling
|
|
195
|
+
* 2026-08-28: "I shouldn't see any 'done' items when looking at the
|
|
196
|
+
* backlog") and returns what is left ordered by what needs attention:
|
|
197
|
+
* in-review first, then open. `all` asks for everything anyway; a
|
|
198
|
+
* specific `status` is always honoured exactly.
|
|
199
|
+
*/
|
|
200
|
+
export declare function fetchBacklog(status?: BacklogStatus, opts?: {
|
|
201
|
+
all?: boolean;
|
|
202
|
+
}): Promise<{
|
|
148
203
|
outcome: BacklogOutcome;
|
|
149
204
|
items?: IBacklogItem[];
|
|
150
205
|
}>;
|
|
@@ -25,7 +25,7 @@ const HOSTNAME = DEV ? 'localhost' : 'www.maka-cli.com';
|
|
|
25
25
|
const PORT = DEV ? Number(process.env.MAKA_DEV_PORT ?? 3000) : 443;
|
|
26
26
|
const API_BASE = 'api/v1/game-backlog';
|
|
27
27
|
const TIMEOUT_MS = 10000;
|
|
28
|
-
export
|
|
28
|
+
export { BACKLOG_STATUSES } from './backlog-vocab.js';
|
|
29
29
|
function request(method, apiPath, token, body) {
|
|
30
30
|
return new Promise((resolve, reject) => {
|
|
31
31
|
const payload = body === undefined ? undefined : JSON.stringify(body);
|
|
@@ -187,6 +187,76 @@ export async function postBacklogSignoff(itemId, note, runnerName) {
|
|
|
187
187
|
return 'offline';
|
|
188
188
|
}
|
|
189
189
|
}
|
|
190
|
+
/**
|
|
191
|
+
* THE REPORTER SAYS NO -- the other half of a sign-off.
|
|
192
|
+
*
|
|
193
|
+
* Until 2026-08-27 a validation request could only be answered "yes".
|
|
194
|
+
* Saying "still broken" left a comment that changed nothing: the row
|
|
195
|
+
* stayed in-review, nobody was signalled, and to the board a rejection
|
|
196
|
+
* was indistinguishable from silence.
|
|
197
|
+
*
|
|
198
|
+
* Reopens the item and records the reason. The commits stay attached --
|
|
199
|
+
* they are what was TRIED, and knowing what did not work is worth more
|
|
200
|
+
* than a clean slate.
|
|
201
|
+
*/
|
|
202
|
+
export async function postBacklogReject(itemId, note, runnerName) {
|
|
203
|
+
const token = authToken();
|
|
204
|
+
if (!token)
|
|
205
|
+
return 'no-login';
|
|
206
|
+
try {
|
|
207
|
+
const res = await request('POST', `/${API_BASE}/item/${encodeURIComponent(itemId)}/reject`, token, {
|
|
208
|
+
note,
|
|
209
|
+
runnerName,
|
|
210
|
+
});
|
|
211
|
+
if (res.statusCode === 200 || res.statusCode === 201)
|
|
212
|
+
return 'ok';
|
|
213
|
+
if (res.statusCode === 401)
|
|
214
|
+
return 'expired';
|
|
215
|
+
if (res.statusCode === 403)
|
|
216
|
+
return 'forbidden';
|
|
217
|
+
// 400 covers both "no reason given" and "you already signed this
|
|
218
|
+
// off" -- the command turns either into a sentence.
|
|
219
|
+
if (res.statusCode === 400 || res.statusCode === 404)
|
|
220
|
+
return 'rejected';
|
|
221
|
+
return 'offline';
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
return 'offline';
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* CLOSE IT WITH NO VERDICT -- the reporter withdraws their own item.
|
|
229
|
+
*
|
|
230
|
+
* The third answer, and the board had only two. Signing off a mistake
|
|
231
|
+
* puts a false confirmation on the record; rejecting it sends imaginary
|
|
232
|
+
* work back to whoever "fixed" it. Both lie, in opposite directions.
|
|
233
|
+
*
|
|
234
|
+
* Lands on `wont-fix` server-side, which is what that status has always
|
|
235
|
+
* meant: closed with nothing behind it. Reporter or admin.
|
|
236
|
+
*/
|
|
237
|
+
export async function postBacklogClose(itemId, note, runnerName) {
|
|
238
|
+
const token = authToken();
|
|
239
|
+
if (!token)
|
|
240
|
+
return 'no-login';
|
|
241
|
+
try {
|
|
242
|
+
const res = await request('POST', `/${API_BASE}/item/${encodeURIComponent(itemId)}/close`, token, {
|
|
243
|
+
note,
|
|
244
|
+
runnerName,
|
|
245
|
+
});
|
|
246
|
+
if (res.statusCode === 200 || res.statusCode === 201)
|
|
247
|
+
return 'ok';
|
|
248
|
+
if (res.statusCode === 401)
|
|
249
|
+
return 'expired';
|
|
250
|
+
if (res.statusCode === 403)
|
|
251
|
+
return 'forbidden';
|
|
252
|
+
if (res.statusCode === 400 || res.statusCode === 404)
|
|
253
|
+
return 'rejected';
|
|
254
|
+
return 'offline';
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
return 'offline';
|
|
258
|
+
}
|
|
259
|
+
}
|
|
190
260
|
/** Who holds what. Admin-only server-side; a non-admin gets 'forbidden'
|
|
191
261
|
* and the command turns that into a sentence. */
|
|
192
262
|
export async function fetchRoles() {
|
|
@@ -233,12 +303,21 @@ export async function setRole(action, email, role) {
|
|
|
233
303
|
return { outcome: 'offline' };
|
|
234
304
|
}
|
|
235
305
|
}
|
|
236
|
-
|
|
306
|
+
/**
|
|
307
|
+
* The board.
|
|
308
|
+
*
|
|
309
|
+
* WITHOUT a status, the server now leaves CLOSED items out (user ruling
|
|
310
|
+
* 2026-08-28: "I shouldn't see any 'done' items when looking at the
|
|
311
|
+
* backlog") and returns what is left ordered by what needs attention:
|
|
312
|
+
* in-review first, then open. `all` asks for everything anyway; a
|
|
313
|
+
* specific `status` is always honoured exactly.
|
|
314
|
+
*/
|
|
315
|
+
export async function fetchBacklog(status, opts = {}) {
|
|
237
316
|
const token = authToken();
|
|
238
317
|
if (!token)
|
|
239
318
|
return { outcome: 'no-login' };
|
|
240
319
|
try {
|
|
241
|
-
const query = status ? `?status=${encodeURIComponent(status)}` : '';
|
|
320
|
+
const query = status ? `?status=${encodeURIComponent(status)}` : (opts.all ? '?all=1' : '');
|
|
242
321
|
const res = await request('GET', `/${API_BASE}/list${query}`, token);
|
|
243
322
|
if (res.statusCode === 401)
|
|
244
323
|
return { outcome: 'expired' };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backlog.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/utilities/backlog.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"backlog.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/utilities/backlog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A COMMIT PREFIX, matched the way git matches one.
|
|
3
|
+
*
|
|
4
|
+
* Deliberately loose, and deliberately NOT the loose match this repo has
|
|
5
|
+
* been bitten by three times: Inventory.resolveKey compares with
|
|
6
|
+
* `includes` in both directions, which is right for a phrase a human
|
|
7
|
+
* typed at an object and wrong for an identity already known. A sha is
|
|
8
|
+
* neither -- it is a PREFIX TREE, and abbreviating one to its leading
|
|
9
|
+
* characters is git's own convention, so `startsWith` in either
|
|
10
|
+
* direction is the correct generosity. `includes` would match a sha
|
|
11
|
+
* carrying those characters in the MIDDLE, which git would never do.
|
|
12
|
+
*/
|
|
13
|
+
export declare function commitMatches(commits: string[] | undefined, wanted: string): boolean;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A COMMIT PREFIX, matched the way git matches one.
|
|
3
|
+
*
|
|
4
|
+
* Deliberately loose, and deliberately NOT the loose match this repo has
|
|
5
|
+
* been bitten by three times: Inventory.resolveKey compares with
|
|
6
|
+
* `includes` in both directions, which is right for a phrase a human
|
|
7
|
+
* typed at an object and wrong for an identity already known. A sha is
|
|
8
|
+
* neither -- it is a PREFIX TREE, and abbreviating one to its leading
|
|
9
|
+
* characters is git's own convention, so `startsWith` in either
|
|
10
|
+
* direction is the correct generosity. `includes` would match a sha
|
|
11
|
+
* carrying those characters in the MIDDLE, which git would never do.
|
|
12
|
+
*/
|
|
13
|
+
export function commitMatches(commits, wanted) {
|
|
14
|
+
const w = wanted.trim().toLowerCase();
|
|
15
|
+
if (!w)
|
|
16
|
+
return false;
|
|
17
|
+
return (commits ?? []).some(c => {
|
|
18
|
+
const sha = c.toLowerCase();
|
|
19
|
+
return sha.startsWith(w) || w.startsWith(sha);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=commit-ref.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit-ref.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/utilities/commit-ref.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAAC,OAA6B,EAAE,MAAc;IACzE,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACtC,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrB,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;QAC9B,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE NOTE A SESSION LEAVES FOR ITS LAUNCHER.
|
|
3
|
+
*
|
|
4
|
+
* The game runs in a spawned child that holds the terminal through
|
|
5
|
+
* blessed, so it cannot start another game itself -- two blessed
|
|
6
|
+
* screens on one terminal is the exact failure the "parent is the
|
|
7
|
+
* guaranteed janitor" rule exists to prevent. When the player asks to
|
|
8
|
+
* drop into a repro bench, the game therefore seals its save, writes
|
|
9
|
+
* this file, and exits 0. The parent reads it, plays the bench, and
|
|
10
|
+
* relaunches the same runner on a resume.
|
|
11
|
+
*
|
|
12
|
+
* Deliberately a FILE and not an exit code: an exit code carries about
|
|
13
|
+
* three bits and this needs to name an item. It also survives the child
|
|
14
|
+
* dying between writing and exiting, which an in-memory channel would
|
|
15
|
+
* not.
|
|
16
|
+
*/
|
|
17
|
+
export interface IHandoff {
|
|
18
|
+
kind: 'repro';
|
|
19
|
+
itemId: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function handoffPath(sessionDir: string): string;
|
|
22
|
+
/** Leave the note. Failure is the caller's to handle -- a session that
|
|
23
|
+
* cannot write one must not pretend it handed off. */
|
|
24
|
+
export declare function writeHandoff(sessionDir: string, handoff: IHandoff): void;
|
|
25
|
+
/**
|
|
26
|
+
* READ THE NOTE AND DESTROY IT, in that order.
|
|
27
|
+
*
|
|
28
|
+
* SINGLE USE IS A CORRECTNESS REQUIREMENT, not tidiness. A handoff left
|
|
29
|
+
* on disk fires again on the NEXT exit, and the one after that -- the
|
|
30
|
+
* player would be dropped into the same bench every time they tried to
|
|
31
|
+
* quit, with no way out but deleting a file they do not know exists.
|
|
32
|
+
*
|
|
33
|
+
* The delete happens in a `finally`, so it also runs when the read or
|
|
34
|
+
* the parse throws. A note that cannot be understood is still a note
|
|
35
|
+
* that has been consumed; leaving a malformed one behind would produce
|
|
36
|
+
* exactly the loop above, except silent.
|
|
37
|
+
*
|
|
38
|
+
* Anything unrecognised returns undefined rather than throwing: the
|
|
39
|
+
* caller's next move is to carry on with the player's game, and a
|
|
40
|
+
* corrupt byte on disk must never cost somebody their session.
|
|
41
|
+
*/
|
|
42
|
+
export declare function takeHandoff(sessionDir: string): IHandoff | undefined;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
export function handoffPath(sessionDir) {
|
|
4
|
+
return path.join(sessionDir, 'handoff.json');
|
|
5
|
+
}
|
|
6
|
+
/** Leave the note. Failure is the caller's to handle -- a session that
|
|
7
|
+
* cannot write one must not pretend it handed off. */
|
|
8
|
+
export function writeHandoff(sessionDir, handoff) {
|
|
9
|
+
fs.writeFileSync(handoffPath(sessionDir), JSON.stringify(handoff), 'utf8');
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* READ THE NOTE AND DESTROY IT, in that order.
|
|
13
|
+
*
|
|
14
|
+
* SINGLE USE IS A CORRECTNESS REQUIREMENT, not tidiness. A handoff left
|
|
15
|
+
* on disk fires again on the NEXT exit, and the one after that -- the
|
|
16
|
+
* player would be dropped into the same bench every time they tried to
|
|
17
|
+
* quit, with no way out but deleting a file they do not know exists.
|
|
18
|
+
*
|
|
19
|
+
* The delete happens in a `finally`, so it also runs when the read or
|
|
20
|
+
* the parse throws. A note that cannot be understood is still a note
|
|
21
|
+
* that has been consumed; leaving a malformed one behind would produce
|
|
22
|
+
* exactly the loop above, except silent.
|
|
23
|
+
*
|
|
24
|
+
* Anything unrecognised returns undefined rather than throwing: the
|
|
25
|
+
* caller's next move is to carry on with the player's game, and a
|
|
26
|
+
* corrupt byte on disk must never cost somebody their session.
|
|
27
|
+
*/
|
|
28
|
+
export function takeHandoff(sessionDir) {
|
|
29
|
+
const file = handoffPath(sessionDir);
|
|
30
|
+
if (!fs.existsSync(file))
|
|
31
|
+
return undefined;
|
|
32
|
+
let raw;
|
|
33
|
+
try {
|
|
34
|
+
raw = fs.readFileSync(file, 'utf8');
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
try {
|
|
41
|
+
fs.rmSync(file, { force: true });
|
|
42
|
+
}
|
|
43
|
+
catch { /* gone is gone */ }
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
const parsed = JSON.parse(raw);
|
|
47
|
+
if (parsed?.kind !== 'repro')
|
|
48
|
+
return undefined;
|
|
49
|
+
if (typeof parsed.itemId !== 'string' || !parsed.itemId.trim())
|
|
50
|
+
return undefined;
|
|
51
|
+
return { kind: 'repro', itemId: parsed.itemId };
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=handoff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/utilities/handoff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAuBxB,MAAM,UAAU,WAAW,CAAC,UAAkB;IAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;AAC/C,CAAC;AAED;uDACuD;AACvD,MAAM,UAAU,YAAY,CAAC,UAAkB,EAAE,OAAiB;IAChE,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;AAC7E,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,WAAW,CAAC,UAAkB;IAC5C,MAAM,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,IAAI,GAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAa,CAAC;QAC3C,IAAI,MAAM,EAAE,IAAI,KAAK,OAAO;YAAE,OAAO,SAAS,CAAC;QAC/C,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;YAAE,OAAO,SAAS,CAAC;QACjF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WHAT THE GAME IS ALLOWED TO CALL A REAL PERSON.
|
|
3
|
+
*
|
|
4
|
+
* A live seat carries two identities: the ACCOUNT HANDLE the person
|
|
5
|
+
* signed up with, and the RUNNER NAME they chose to be called in the
|
|
6
|
+
* fiction. Shared runs scope to the account in several places on
|
|
7
|
+
* purpose (2026-08-26), so the handle is legitimately present all
|
|
8
|
+
* through the seat plumbing -- and that is fine, right up until it
|
|
9
|
+
* reaches a player's screen.
|
|
10
|
+
*
|
|
11
|
+
* A handle is that person's identity across the whole site. Printing
|
|
12
|
+
* it where a runner name belongs exposes something they never put in
|
|
13
|
+
* the game (blocker: "I see 'doubleglizzy' when I should see
|
|
14
|
+
* 'Sherry'"). The leaks were not one bug but a habit -- four separate
|
|
15
|
+
* renders, two unconditional and two `?? handle` fallbacks that only
|
|
16
|
+
* showed themselves when a runner name went missing.
|
|
17
|
+
*
|
|
18
|
+
* So the rule lives in a function instead of in four people's memory:
|
|
19
|
+
* ASK FOR A NAME AND YOU GET A NAME, OR YOU GET NOTHING. There is no
|
|
20
|
+
* argument you can pass that makes this return an account handle.
|
|
21
|
+
*
|
|
22
|
+
* The one legitimate use of a handle in player-facing text is OUT OF
|
|
23
|
+
* CHARACTER instructions about the ACCOUNT itself -- "verify your
|
|
24
|
+
* account email" names the account because that is what the player has
|
|
25
|
+
* to go and fix. That text says so where it lives; it does not come
|
|
26
|
+
* through here.
|
|
27
|
+
*/
|
|
28
|
+
/** The runner name, or a neutral stand-in. NEVER the account handle. */
|
|
29
|
+
export declare function runnerName(runner: string | undefined, fallback?: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Names a list of people we hold handles for, resolving each through
|
|
32
|
+
* `lookup`. Anyone we cannot name is COUNTED, not named -- "Sherry and
|
|
33
|
+
* one more" rather than "Sherry, doubleglizzy". Losing a name is a
|
|
34
|
+
* smaller cost than printing an account.
|
|
35
|
+
*/
|
|
36
|
+
export declare function nameThem(handles: string[], lookup: (handle: string) => string | undefined): string[];
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WHAT THE GAME IS ALLOWED TO CALL A REAL PERSON.
|
|
3
|
+
*
|
|
4
|
+
* A live seat carries two identities: the ACCOUNT HANDLE the person
|
|
5
|
+
* signed up with, and the RUNNER NAME they chose to be called in the
|
|
6
|
+
* fiction. Shared runs scope to the account in several places on
|
|
7
|
+
* purpose (2026-08-26), so the handle is legitimately present all
|
|
8
|
+
* through the seat plumbing -- and that is fine, right up until it
|
|
9
|
+
* reaches a player's screen.
|
|
10
|
+
*
|
|
11
|
+
* A handle is that person's identity across the whole site. Printing
|
|
12
|
+
* it where a runner name belongs exposes something they never put in
|
|
13
|
+
* the game (blocker: "I see 'doubleglizzy' when I should see
|
|
14
|
+
* 'Sherry'"). The leaks were not one bug but a habit -- four separate
|
|
15
|
+
* renders, two unconditional and two `?? handle` fallbacks that only
|
|
16
|
+
* showed themselves when a runner name went missing.
|
|
17
|
+
*
|
|
18
|
+
* So the rule lives in a function instead of in four people's memory:
|
|
19
|
+
* ASK FOR A NAME AND YOU GET A NAME, OR YOU GET NOTHING. There is no
|
|
20
|
+
* argument you can pass that makes this return an account handle.
|
|
21
|
+
*
|
|
22
|
+
* The one legitimate use of a handle in player-facing text is OUT OF
|
|
23
|
+
* CHARACTER instructions about the ACCOUNT itself -- "verify your
|
|
24
|
+
* account email" names the account because that is what the player has
|
|
25
|
+
* to go and fix. That text says so where it lives; it does not come
|
|
26
|
+
* through here.
|
|
27
|
+
*/
|
|
28
|
+
/** The runner name, or a neutral stand-in. NEVER the account handle. */
|
|
29
|
+
export function runnerName(runner, fallback = 'a runner') {
|
|
30
|
+
return runner && runner.trim() ? runner : fallback;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Names a list of people we hold handles for, resolving each through
|
|
34
|
+
* `lookup`. Anyone we cannot name is COUNTED, not named -- "Sherry and
|
|
35
|
+
* one more" rather than "Sherry, doubleglizzy". Losing a name is a
|
|
36
|
+
* smaller cost than printing an account.
|
|
37
|
+
*/
|
|
38
|
+
export function nameThem(handles, lookup) {
|
|
39
|
+
const names = handles.map(lookup).filter((n) => !!n && !!n.trim());
|
|
40
|
+
const unknown = handles.length - names.length;
|
|
41
|
+
if (unknown > 0) {
|
|
42
|
+
names.push(names.length > 0
|
|
43
|
+
? `${unknown} more`
|
|
44
|
+
: unknown === 1 ? 'someone else at your table' : 'the rest of your table');
|
|
45
|
+
}
|
|
46
|
+
return names;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/utilities/identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,wEAAwE;AACxE,MAAM,UAAU,UAAU,CAAC,MAA0B,EAAE,QAAQ,GAAG,UAAU;IAC1E,OAAO,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;AACrD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,OAAiB,EAAE,MAA8C;IACxF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAChF,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC9C,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YACzB,CAAC,CAAC,GAAG,OAAO,OAAO;YACnB,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|