@maka/maka-cli 5.57.0 → 5.59.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.
Files changed (25) hide show
  1. package/README.md +27 -0
  2. package/bundle/typescript/package.json +2 -2
  3. package/bundle/typescript/src/README.md +27 -0
  4. package/bundle/typescript/src/commands/game/sideQuest/commands/backlog.d.ts +39 -0
  5. package/bundle/typescript/src/commands/game/sideQuest/commands/backlog.js +149 -0
  6. package/bundle/typescript/src/commands/game/sideQuest/commands/backlog.js.map +1 -0
  7. package/bundle/typescript/src/commands/game/sideQuest/game.d.ts +4 -0
  8. package/bundle/typescript/src/commands/game/sideQuest/game.js +10 -2
  9. package/bundle/typescript/src/commands/game/sideQuest/game.js.map +1 -1
  10. package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog-dump.d.ts +1 -0
  11. package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog-dump.js +71 -0
  12. package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog-dump.js.map +1 -0
  13. package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog.d.ts +37 -0
  14. package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog.js +108 -0
  15. package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog.js.map +1 -0
  16. package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js +21 -1
  17. package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js.map +1 -1
  18. package/bundle/typescript/src/maka.js +12 -0
  19. package/bundle/typescript/src/maka.js.map +1 -1
  20. package/bundle/typescript/src/tools/sdk-loader/relocate.d.ts +9 -0
  21. package/bundle/typescript/src/tools/sdk-loader/relocate.js +131 -0
  22. package/bundle/typescript/src/tools/sdk-loader/relocate.js.map +1 -0
  23. package/bundle/typescript/src/tools/sdk-loader/sdk-loader.class.js +37 -2
  24. package/bundle/typescript/src/tools/sdk-loader/sdk-loader.class.js.map +1 -1
  25. package/package.json +2 -2
package/README.md CHANGED
@@ -10,10 +10,37 @@ NodeJS backed applications deployed to on-prem and cloud-based infrastructures.
10
10
  If you like Maka-CLI, consider supporting me at [Patreon](https://www.patreon.com/user/membership?u=110174702)! ☕️
11
11
 
12
12
  ## Installation
13
+
14
+ ### With Node.js
13
15
  ```
14
16
  npm i -g @maka/maka-cli
15
17
  ```
16
18
 
19
+ ### Without Node.js — standalone executable
20
+
21
+ Self-contained builds that need no Node.js installed. Extract, and the binary
22
+ inside is called `maka`. These links always resolve to the most recent
23
+ release, so they never need updating.
24
+
25
+ | Platform | Download |
26
+ | --- | --- |
27
+ | macOS (Apple Silicon) | [maka-macos-arm64.tar.gz](https://github.com/maka-io/maka-cli/releases/latest/download/maka-macos-arm64.tar.gz) |
28
+ | macOS (Intel) | [maka-macos-x64.tar.gz](https://github.com/maka-io/maka-cli/releases/latest/download/maka-macos-x64.tar.gz) |
29
+ | Linux (x64) | [maka-linux-x64.tar.gz](https://github.com/maka-io/maka-cli/releases/latest/download/maka-linux-x64.tar.gz) |
30
+ | Linux (arm64) | [maka-linux-arm64.tar.gz](https://github.com/maka-io/maka-cli/releases/latest/download/maka-linux-arm64.tar.gz) |
31
+ | Windows (x64) | [maka-win-x64.zip](https://github.com/maka-io/maka-cli/releases/latest/download/maka-win-x64.zip) |
32
+
33
+ ```
34
+ tar -xzf maka-macos-arm64.tar.gz # macOS / Linux
35
+ chmod +x maka
36
+ ./maka --help
37
+ ```
38
+
39
+ The first Meteor command (`maka build`, `run` or `create`) downloads the
40
+ Meteor toolchain and a Node runtime for it into `~/.meteor/.maka/runtime/`;
41
+ that happens once. Every other command works immediately with nothing to
42
+ download.
43
+
17
44
  ## Getting Started
18
45
  ```
19
46
  maka create KickTiresApp
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maka/maka-cli",
3
- "version": "5.57.0",
3
+ "version": "5.59.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.",
@@ -30,7 +30,7 @@
30
30
  "prep": " cp -R ./src/templates ./bundle/typescript/src/ && cp ./README.md ./bundle/typescript/src/ && cp ./package.json ./bundle/typescript/ && cp ./src/commands/game/sideQuest/scenes/*.json ./bundle/typescript/src/commands/game/sideQuest/scenes/ && chmod +x ./bundle/typescript/src/exec.js",
31
31
  "build:bundle": "node scripts/build-bundle.mjs",
32
32
  "test:parity": "node scripts/check-bundle-parity.mjs",
33
- "package": "npm run build:bundle && pkg bundle/maka.cjs --config pkg.config.json --compress GZip --no-bytecode --public --public-packages \"*\"",
33
+ "package": "npm run build:bundle && node scripts/package.mjs",
34
34
  "distribute": "node scripts/distribute.mjs",
35
35
  "prepare": "husky install"
36
36
  },
@@ -10,10 +10,37 @@ NodeJS backed applications deployed to on-prem and cloud-based infrastructures.
10
10
  If you like Maka-CLI, consider supporting me at [Patreon](https://www.patreon.com/user/membership?u=110174702)! ☕️
11
11
 
12
12
  ## Installation
13
+
14
+ ### With Node.js
13
15
  ```
14
16
  npm i -g @maka/maka-cli
15
17
  ```
16
18
 
19
+ ### Without Node.js — standalone executable
20
+
21
+ Self-contained builds that need no Node.js installed. Extract, and the binary
22
+ inside is called `maka`. These links always resolve to the most recent
23
+ release, so they never need updating.
24
+
25
+ | Platform | Download |
26
+ | --- | --- |
27
+ | macOS (Apple Silicon) | [maka-macos-arm64.tar.gz](https://github.com/maka-io/maka-cli/releases/latest/download/maka-macos-arm64.tar.gz) |
28
+ | macOS (Intel) | [maka-macos-x64.tar.gz](https://github.com/maka-io/maka-cli/releases/latest/download/maka-macos-x64.tar.gz) |
29
+ | Linux (x64) | [maka-linux-x64.tar.gz](https://github.com/maka-io/maka-cli/releases/latest/download/maka-linux-x64.tar.gz) |
30
+ | Linux (arm64) | [maka-linux-arm64.tar.gz](https://github.com/maka-io/maka-cli/releases/latest/download/maka-linux-arm64.tar.gz) |
31
+ | Windows (x64) | [maka-win-x64.zip](https://github.com/maka-io/maka-cli/releases/latest/download/maka-win-x64.zip) |
32
+
33
+ ```
34
+ tar -xzf maka-macos-arm64.tar.gz # macOS / Linux
35
+ chmod +x maka
36
+ ./maka --help
37
+ ```
38
+
39
+ The first Meteor command (`maka build`, `run` or `create`) downloads the
40
+ Meteor toolchain and a Node runtime for it into `~/.meteor/.maka/runtime/`;
41
+ that happens once. Every other command works immediately with nothing to
42
+ download.
43
+
17
44
  ## Getting Started
18
45
  ```
19
46
  maka create KickTiresApp
@@ -0,0 +1,39 @@
1
+ import { Command, ICommand } from './command.js';
2
+ /**
3
+ * THE BACKLOG -- play-tester feedback that somebody acts on.
4
+ *
5
+ * Deliberately NOT `note`, which stays what it always was: a private
6
+ * scribble on your own disk, useful whether or not you're playtesting.
7
+ * A backlog item is the other thing -- shared, tracked, statused, and
8
+ * checked against the rulebooks the moment it's filed. Asked for by a
9
+ * play-tester during the first two-player shared run: feedback marked
10
+ * as coming from a tester, "gathered as higher [value]".
11
+ *
12
+ * Role-gated server-side (play-tester or game-admin). The gate is not
13
+ * enforced here on purpose -- a client cannot be trusted with its own
14
+ * permissions, and the CLI has no idea what roles an account holds.
15
+ * We just turn the server's 403 into a sentence.
16
+ *
17
+ * SUBCOMMAND SHAPE, and why: `backlog <text>` files an item, so a bare
18
+ * `backlog open` would file an item whose text is the word "open"
19
+ * rather than filter by it. `backlog list [status]` removes the
20
+ * guesswork -- the same reason `jobs` and `crew` have subcommands.
21
+ */
22
+ export declare class BacklogCommand extends Command implements ICommand {
23
+ protected static verb: string;
24
+ protected static description: string;
25
+ protected static subcommands: {
26
+ usage: string;
27
+ short: string;
28
+ }[];
29
+ execute(args?: string[]): Promise<string>;
30
+ private file;
31
+ private list;
32
+ /** One item: what it says, where it stands, and what the books said. */
33
+ private row;
34
+ private statusMark;
35
+ /** "contradicts" is the GOOD one -- it means canon disagrees with what
36
+ * the game does, which usually means the reporter was right. */
37
+ private verdictTag;
38
+ private explain;
39
+ }
@@ -0,0 +1,149 @@
1
+ import { Command } from './command.js';
2
+ import { hint } from '../utilities/hints.js';
3
+ import { authToken } from '../utilities/cloud-saves.js';
4
+ import { submitBacklog, fetchBacklog, BACKLOG_STATUSES, } from '../utilities/backlog.js';
5
+ /**
6
+ * THE BACKLOG -- play-tester feedback that somebody acts on.
7
+ *
8
+ * Deliberately NOT `note`, which stays what it always was: a private
9
+ * scribble on your own disk, useful whether or not you're playtesting.
10
+ * A backlog item is the other thing -- shared, tracked, statused, and
11
+ * checked against the rulebooks the moment it's filed. Asked for by a
12
+ * play-tester during the first two-player shared run: feedback marked
13
+ * as coming from a tester, "gathered as higher [value]".
14
+ *
15
+ * Role-gated server-side (play-tester or game-admin). The gate is not
16
+ * enforced here on purpose -- a client cannot be trusted with its own
17
+ * permissions, and the CLI has no idea what roles an account holds.
18
+ * We just turn the server's 403 into a sentence.
19
+ *
20
+ * SUBCOMMAND SHAPE, and why: `backlog <text>` files an item, so a bare
21
+ * `backlog open` would file an item whose text is the word "open"
22
+ * rather than filter by it. `backlog list [status]` removes the
23
+ * guesswork -- the same reason `jobs` and `crew` have subcommands.
24
+ */
25
+ export class BacklogCommand extends Command {
26
+ static verb = 'backlog';
27
+ static description = 'File a play-tester item that somebody acts on -- it goes to maka-cli.com, keeps a link to this session, and comes back checked against the rulebooks. "backlog <what you noticed>" files one; "backlog list [status]" reads the board. For private scribbles, use "note".';
28
+ static subcommands = [
29
+ { usage: 'backlog <text>', short: 'File an item against this session.' },
30
+ { usage: 'backlog list', short: 'The whole board, newest first.' },
31
+ { usage: 'backlog list <status>', short: `Filter: ${BACKLOG_STATUSES.join(', ')}.` },
32
+ ];
33
+ async execute(args = []) {
34
+ // An anonymous runner's data never leaves the machine -- the same
35
+ // promise the telemetry uploader keeps. Filing to a shared board
36
+ // would break it, so refuse and point at the tool that doesn't.
37
+ if (this.game?.isAnonymous) {
38
+ return `You're running anonymous -- nothing about this runner leaves the machine, the backlog included.${hint(` ("note" writes to your own disk instead.)`)}`;
39
+ }
40
+ if (!authToken()) {
41
+ return `The backlog runs on your maka-cli.com login -- \`maka login\` first.${hint(` ("note" needs no login.)`)}`;
42
+ }
43
+ const sub = (args[0] ?? '').toLowerCase();
44
+ if (args.length === 0 || sub === 'list') {
45
+ return this.list(args[1]);
46
+ }
47
+ return this.file(args.join(' '));
48
+ }
49
+ async file(text) {
50
+ const game = this.game;
51
+ // LAZY, and not for speed: shared-run.ts pulls in tools/version/
52
+ // cli-version.ts, which does `import { createRequire } from 'module'`.
53
+ // Anything reachable from game.ts at module scope is loaded by the
54
+ // Meteor server's engine graph too, and that import dies there with
55
+ // "module is not defined in ES module scope" -- the exact failure
56
+ // patch-probe exists to catch. game.ts already imports this module
57
+ // lazily for the same reason (streetTransport).
58
+ const { cliVersion, engineVersion } = await import('../utilities/shared-run.js');
59
+ const outcome = await submitBacklog(text, {
60
+ runnerName: this.actor?.name,
61
+ // Links the item back to the play session it came out of -- the
62
+ // same id the uploaded logs are keyed by, so an item and its
63
+ // transcript can be read side by side.
64
+ sessionId: game?.sessionDir ? game.sessionDir.split(/[\\/]/).pop() : undefined,
65
+ cliVersion: cliVersion(),
66
+ engineVersion: engineVersion(),
67
+ platform: process.platform,
68
+ });
69
+ if (outcome !== 'ok')
70
+ return this.explain(outcome);
71
+ return `{cyan-fg}Filed. It'll come back checked against the books.${hint(` ("backlog list" reads the board.)`)}{/cyan-fg}`;
72
+ }
73
+ async list(statusArg) {
74
+ let status;
75
+ if (statusArg) {
76
+ const wanted = statusArg.toLowerCase();
77
+ if (!BACKLOG_STATUSES.includes(wanted)) {
78
+ return `No status called "${statusArg}". Try: ${BACKLOG_STATUSES.join(', ')}.`;
79
+ }
80
+ status = wanted;
81
+ }
82
+ const { outcome, items } = await fetchBacklog(status);
83
+ if (outcome !== 'ok' || !items)
84
+ return this.explain(outcome);
85
+ if (items.length === 0) {
86
+ return status
87
+ ? `Nothing ${status} on the board.`
88
+ : `The board's empty.${hint(` ("backlog <what you noticed>" files the first one.)`)}`;
89
+ }
90
+ const lines = [`=== BACKLOG === (${items.length}${status ? `, ${status}` : ''})`];
91
+ for (const item of items)
92
+ lines.push(...this.row(item));
93
+ const footer = hint(`"backlog <what you noticed>" files one. Status moves are an admin's call.`);
94
+ if (footer)
95
+ lines.push('', footer);
96
+ return lines.join('\n');
97
+ }
98
+ /** One item: what it says, where it stands, and what the books said. */
99
+ row(item) {
100
+ const out = [];
101
+ out.push(` ${this.statusMark(item.status)} ${item.text}`);
102
+ const who = [item.runnerName, item.reporterHandle].filter(Boolean).join(' / ');
103
+ if (who)
104
+ out.push(` ${who}`);
105
+ const v = item.vetting;
106
+ if (!v || v.state === 'pending') {
107
+ out.push(` {cyan-fg}checking the books...{/cyan-fg}`);
108
+ }
109
+ else if (v.state === 'failed') {
110
+ out.push(` {yellow-fg}the books didn't answer{/yellow-fg}`);
111
+ }
112
+ else if (v.verdict) {
113
+ const cites = (v.citations ?? []).slice(0, 2)
114
+ .map(c => `${c.book} p.${c.page ?? '?'}`).join('; ');
115
+ out.push(` ${this.verdictTag(v.verdict)}${v.justification ? ` ${v.justification}` : ''}`);
116
+ if (cites)
117
+ out.push(` {cyan-fg}${cites}{/cyan-fg}`);
118
+ }
119
+ return out;
120
+ }
121
+ statusMark(status) {
122
+ switch (status) {
123
+ case 'complete': return '{green-fg}[done]{/green-fg}';
124
+ case 'in-progress': return '{cyan-fg}[wip] {/cyan-fg}';
125
+ case 'wont-fix': return '{cyan-fg}[no] {/cyan-fg}';
126
+ default: return '{yellow-fg}[open]{/yellow-fg}';
127
+ }
128
+ }
129
+ /** "contradicts" is the GOOD one -- it means canon disagrees with what
130
+ * the game does, which usually means the reporter was right. */
131
+ verdictTag(verdict) {
132
+ switch (verdict) {
133
+ case 'contradicts': return `{red-fg}canon disagrees:{/red-fg}`;
134
+ case 'supported': return `{green-fg}canon agrees:{/green-fg}`;
135
+ case 'out-of-scope': return `{cyan-fg}not a rules matter:{/cyan-fg}`;
136
+ default: return `{cyan-fg}books are unclear:{/cyan-fg}`;
137
+ }
138
+ }
139
+ explain(outcome) {
140
+ switch (outcome) {
141
+ case 'no-login': return `The backlog runs on your maka-cli.com login -- \`maka login\` first.`;
142
+ case 'expired': return `Your login's expired -- \`maka login\` again and the board comes back.`;
143
+ case 'forbidden': return `The backlog is for play-testers. Ask the operator to add your account.`;
144
+ case 'rejected': return `The server wouldn't take that one -- try saying it in a sentence.`;
145
+ default: return `The grid isn't answering -- the backlog's offline right now.${hint(` ("note" still writes to your own disk.)`)}`;
146
+ }
147
+ }
148
+ }
149
+ //# sourceMappingURL=backlog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backlog.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/commands/backlog.ts"],"names":[],"mappings":"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"}
@@ -78,6 +78,10 @@ export default class Game {
78
78
  * they write local files or read local state, and mean nothing to the
79
79
  * table. See the guard in handleInput. */
80
80
  private static readonly LOCAL_ONLY_VERBS;
81
+ /** An account-less runner: nothing about them leaves this machine.
82
+ * Read by anything that would otherwise push to maka-cli.com -- the
83
+ * backlog command among them. */
84
+ get isAnonymous(): boolean;
81
85
  get sessionDir(): string | undefined;
82
86
  /** The active job's name (seed name) -- notoriety incidents cite it. */
83
87
  get currentJobName(): string | undefined;
@@ -26,6 +26,7 @@ import { LookCommand } from './commands/look.js';
26
26
  import { TakeCommand } from './commands/take.js';
27
27
  import { LootCommand } from './commands/loot.js';
28
28
  import { NoteCommand } from './commands/note.js';
29
+ import { BacklogCommand } from './commands/backlog.js';
29
30
  import { SinCommand } from './commands/sin.js';
30
31
  import { GoCommand } from './commands/go.js';
31
32
  import { UseCommand } from './commands/use.js';
@@ -196,7 +197,13 @@ export default class Game {
196
197
  /** Verbs that must run on the player's OWN machine even mid-shared-run:
197
198
  * they write local files or read local state, and mean nothing to the
198
199
  * table. See the guard in handleInput. */
199
- static LOCAL_ONLY_VERBS = new Set(['note']);
200
+ static LOCAL_ONLY_VERBS = new Set(['note', 'backlog']);
201
+ /** An account-less runner: nothing about them leaves this machine.
202
+ * Read by anything that would otherwise push to maka-cli.com -- the
203
+ * backlog command among them. */
204
+ get isAnonymous() {
205
+ return this._anonymous;
206
+ }
200
207
  get sessionDir() {
201
208
  return this._logFilePath ? dirname(this._logFilePath) : undefined;
202
209
  }
@@ -1635,6 +1642,7 @@ ${client.name} won't be remembering anything. Dead Johnsons pay nothing -- and t
1635
1642
  CommandFactory.registerCommand('take', TakeCommand);
1636
1643
  CommandFactory.registerCommand('loot', LootCommand);
1637
1644
  CommandFactory.registerCommand('note', NoteCommand);
1645
+ CommandFactory.registerCommand('backlog', BacklogCommand);
1638
1646
  CommandFactory.registerCommand('sin', SinCommand);
1639
1647
  CommandFactory.registerCommand('sins', SinCommand);
1640
1648
  CommandFactory.registerCommand('papers', SinCommand);
@@ -3860,7 +3868,7 @@ ${client.name} won't be remembering anything. Dead Johnsons pay nothing -- and t
3860
3868
  { title: 'street', entries: [['browse', 'buy'], ['sell'], ['catalog'], ['source', 'procure'], ['work', 'gig'], ['jobs'], ['perform'], ['palm'], ['docwagon'], ['treat'], ['eat'], ['drink'], ['lifestyle'], ['pay']] },
3861
3869
  { title: 'barriers', entries: [['solve'], ['pick'], ['breach'], ['dispel', 'dispell'], ['bluff'], ['unlock'], ['lock']] },
3862
3870
  { title: 'character', entries: [['sheet', 'stats'], ['advance'], ['qualities', 'quality'], ['sin', 'sins', 'papers'], ['initiate', 'submerge'], ['install', 'chrome']] },
3863
- { title: 'session', entries: [['help'], ['hints'], ['clear'], ['quit', 'exit']] },
3871
+ { title: 'session', entries: [['help'], ['hints'], ['note'], ['backlog'], ['clear'], ['quit', 'exit']] },
3864
3872
  ];
3865
3873
  /** Registered but deliberately UNLISTED: reachable as subcommands or
3866
3874
  * muscle-memory ("players" folded back under crew after playtesting