picopilot 0.1.4 → 0.2.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/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +111 -16
- package/dist/cli.js.map +1 -1
- package/dist/commands/audio.d.ts +3 -3
- package/dist/commands/audio.d.ts.map +1 -1
- package/dist/commands/audio.js +61 -44
- package/dist/commands/audio.js.map +1 -1
- package/dist/commands/cart-includes.d.ts +11 -0
- package/dist/commands/cart-includes.d.ts.map +1 -0
- package/dist/commands/cart-includes.js +26 -0
- package/dist/commands/cart-includes.js.map +1 -0
- package/dist/commands/doctor.d.ts +22 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +222 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/export.d.ts +3 -4
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +66 -86
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/gfx.d.ts +2 -2
- package/dist/commands/gfx.d.ts.map +1 -1
- package/dist/commands/gfx.js +3 -2
- package/dist/commands/gfx.js.map +1 -1
- package/dist/commands/label-cart.d.ts +72 -0
- package/dist/commands/label-cart.d.ts.map +1 -0
- package/dist/commands/label-cart.js +228 -0
- package/dist/commands/label-cart.js.map +1 -0
- package/dist/commands/lint.d.ts +2 -2
- package/dist/commands/lint.d.ts.map +1 -1
- package/dist/commands/lint.js +3 -2
- package/dist/commands/lint.js.map +1 -1
- package/dist/commands/minify.d.ts +2 -2
- package/dist/commands/minify.d.ts.map +1 -1
- package/dist/commands/minify.js +3 -2
- package/dist/commands/minify.js.map +1 -1
- package/dist/commands/pico8-env.d.ts +76 -0
- package/dist/commands/pico8-env.d.ts.map +1 -0
- package/dist/commands/pico8-env.js +71 -0
- package/dist/commands/pico8-env.js.map +1 -0
- package/dist/commands/playtest.d.ts +2 -2
- package/dist/commands/playtest.d.ts.map +1 -1
- package/dist/commands/playtest.js +6 -32
- package/dist/commands/playtest.js.map +1 -1
- package/dist/commands/run.d.ts +3 -4
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +46 -19
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/serve.d.ts +2 -2
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +65 -19
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/shrinko-env.d.ts +22 -0
- package/dist/commands/shrinko-env.d.ts.map +1 -0
- package/dist/commands/shrinko-env.js +15 -0
- package/dist/commands/shrinko-env.js.map +1 -0
- package/dist/commands/tokens.d.ts +4 -4
- package/dist/commands/tokens.d.ts.map +1 -1
- package/dist/commands/tokens.js +3 -2
- package/dist/commands/tokens.js.map +1 -1
- package/dist/commands/verify.d.ts +2 -2
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +3 -2
- package/dist/commands/verify.js.map +1 -1
- package/dist/engine/child-env.d.ts +14 -0
- package/dist/engine/child-env.d.ts.map +1 -0
- package/dist/engine/child-env.js +21 -0
- package/dist/engine/child-env.js.map +1 -0
- package/dist/engine/gfx/label.d.ts +15 -9
- package/dist/engine/gfx/label.d.ts.map +1 -1
- package/dist/engine/gfx/label.js +130 -38
- package/dist/engine/gfx/label.js.map +1 -1
- package/dist/engine/pico8/adapter.d.ts +23 -3
- package/dist/engine/pico8/adapter.d.ts.map +1 -1
- package/dist/engine/pico8/adapter.js.map +1 -1
- package/dist/engine/pico8/cleanup.d.ts +16 -0
- package/dist/engine/pico8/cleanup.d.ts.map +1 -0
- package/dist/engine/pico8/cleanup.js +74 -0
- package/dist/engine/pico8/cleanup.js.map +1 -0
- package/dist/engine/pico8/display.d.ts +149 -0
- package/dist/engine/pico8/display.d.ts.map +1 -0
- package/dist/engine/pico8/display.js +311 -0
- package/dist/engine/pico8/display.js.map +1 -0
- package/dist/engine/pico8/drive.d.ts.map +1 -1
- package/dist/engine/pico8/drive.js +28 -2
- package/dist/engine/pico8/drive.js.map +1 -1
- package/dist/engine/pico8/harness.d.ts +8 -0
- package/dist/engine/pico8/harness.d.ts.map +1 -1
- package/dist/engine/pico8/harness.js +9 -1
- package/dist/engine/pico8/harness.js.map +1 -1
- package/dist/engine/pico8/index.d.ts +3 -0
- package/dist/engine/pico8/index.d.ts.map +1 -1
- package/dist/engine/pico8/index.js +3 -0
- package/dist/engine/pico8/index.js.map +1 -1
- package/dist/engine/pico8/session-daemon-entry.d.ts +1 -1
- package/dist/engine/pico8/session-daemon-entry.js +1 -1
- package/dist/engine/pico8/session-daemon-main.d.ts +1 -1
- package/dist/engine/pico8/session-daemon-main.js +1 -1
- package/dist/engine/pico8/session-daemon.d.ts +1 -1
- package/dist/engine/pico8/session-daemon.d.ts.map +1 -1
- package/dist/engine/pico8/session-daemon.js +19 -19
- package/dist/engine/pico8/session-daemon.js.map +1 -1
- package/dist/engine/pico8/session.d.ts +1 -1
- package/dist/engine/pico8/session.js +1 -1
- package/dist/engine/pico8/shell.d.ts +56 -3
- package/dist/engine/pico8/shell.d.ts.map +1 -1
- package/dist/engine/pico8/shell.js +188 -24
- package/dist/engine/pico8/shell.js.map +1 -1
- package/dist/engine/pico8/supervisor.d.ts +1 -1
- package/dist/engine/pico8/supervisor.js +1 -1
- package/dist/engine/shrinko/adapter.d.ts +1 -1
- package/dist/engine/shrinko/shell.d.ts +3 -3
- package/dist/engine/shrinko/shell.js +3 -3
- package/package.json +2 -1
- package/src/cli.test.ts +188 -0
- package/src/cli.ts +122 -16
- package/src/commands/audio.test.ts +76 -1
- package/src/commands/audio.ts +79 -57
- package/src/commands/cart-includes.ts +27 -0
- package/src/commands/doctor.test.ts +149 -0
- package/src/commands/doctor.ts +280 -0
- package/src/commands/export.test.ts +327 -3
- package/src/commands/export.ts +81 -99
- package/src/commands/gfx.ts +7 -6
- package/src/commands/label-cart.ts +304 -0
- package/src/commands/lint.test.ts +6 -0
- package/src/commands/lint.ts +7 -6
- package/src/commands/minify.test.ts +6 -0
- package/src/commands/minify.ts +7 -6
- package/src/commands/pico8-env.ts +124 -0
- package/src/commands/playtest.test.ts +3 -0
- package/src/commands/playtest.ts +10 -34
- package/src/commands/run.test.ts +116 -2
- package/src/commands/run.ts +62 -24
- package/src/commands/serve.test.ts +138 -2
- package/src/commands/serve.ts +80 -21
- package/src/commands/shrinko-env.test.ts +68 -0
- package/src/commands/shrinko-env.ts +40 -0
- package/src/commands/tokens.test.ts +19 -0
- package/src/commands/tokens.ts +9 -6
- package/src/commands/verify.test.ts +12 -0
- package/src/commands/verify.ts +7 -4
- package/src/engine/child-env.ts +22 -0
- package/src/engine/gfx/fixtures/pico8-screenshot-384.png +0 -0
- package/src/engine/gfx/label.test.ts +467 -1
- package/src/engine/gfx/label.ts +147 -41
- package/src/engine/pico8/adapter.ts +25 -3
- package/src/engine/pico8/cleanup.test.ts +28 -0
- package/src/engine/pico8/cleanup.ts +76 -0
- package/src/engine/pico8/display.test.ts +210 -0
- package/src/engine/pico8/display.ts +429 -0
- package/src/engine/pico8/drive.test.ts +20 -0
- package/src/engine/pico8/drive.ts +25 -2
- package/src/engine/pico8/fake-xvfb.test-support.ts +55 -0
- package/src/engine/pico8/harness.test.ts +26 -0
- package/src/engine/pico8/harness.ts +18 -2
- package/src/engine/pico8/index.ts +3 -0
- package/src/engine/pico8/session-daemon-entry.ts +1 -1
- package/src/engine/pico8/session-daemon-main.ts +1 -1
- package/src/engine/pico8/session-daemon.test.ts +32 -1
- package/src/engine/pico8/session-daemon.ts +25 -17
- package/src/engine/pico8/session.test.ts +1 -1
- package/src/engine/pico8/session.ts +1 -1
- package/src/engine/pico8/shell.test.ts +449 -10
- package/src/engine/pico8/shell.ts +255 -26
- package/src/engine/pico8/supervisor.ts +1 -1
- package/src/engine/pico8/virtual-display.process.test.ts +206 -0
- package/src/engine/shrinko/adapter.ts +1 -1
- package/src/engine/shrinko/shell.ts +3 -3
- package/src/engine/skills/skills.test.ts +10 -0
- package/src/skills/picopilot-audio/SKILL.md +4 -8
- package/src/skills/picopilot-debug/SKILL.md +18 -1
- package/src/skills/picopilot-overview/SKILL.md +9 -1
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,GAAG,EAAI,MAAM,OAAO,CAAC;AAoE7B;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,IAAI,GAAG,CAAC,GAAG,CAqFnC"}
|
package/dist/cli.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { Cli, z } from 'incur';
|
|
2
3
|
import { registerAudio } from './commands/audio.js';
|
|
4
|
+
import { registerDoctor } from './commands/doctor.js';
|
|
3
5
|
import { registerExport } from './commands/export.js';
|
|
4
6
|
import { registerGfx } from './commands/gfx.js';
|
|
5
7
|
import { registerInit } from './commands/init.js';
|
|
@@ -13,7 +15,49 @@ import { registerSfx } from './commands/sfx.js';
|
|
|
13
15
|
import { registerTokens } from './commands/tokens.js';
|
|
14
16
|
import { registerVerify } from './commands/verify.js';
|
|
15
17
|
import { registerVersion } from './commands/version.js';
|
|
18
|
+
import { DEFAULT_DISPLAY_MODE, DISPLAY_CONFIG_KEY, DISPLAY_ENV_VAR, DISPLAY_MODES, resolveDisplayMode, } from './engine/pico8/display.js';
|
|
16
19
|
import { VERSION } from './version.js';
|
|
20
|
+
/** The commands that use the display mode (they start a `-run` session, or report on it). */
|
|
21
|
+
const DISPLAY_COMMANDS = new Set([
|
|
22
|
+
'run',
|
|
23
|
+
'audio record',
|
|
24
|
+
'audio render',
|
|
25
|
+
'doctor',
|
|
26
|
+
]);
|
|
27
|
+
/**
|
|
28
|
+
* Reads a picopilot.json for incur's config layer AND captures its top-level
|
|
29
|
+
* {@link DISPLAY_CONFIG_KEY}. incur only maps per-command `options` from the
|
|
30
|
+
* config file; the display mode is a GLOBAL setting, so the loader hands the
|
|
31
|
+
* value to the display middleware through `sink`.
|
|
32
|
+
*/
|
|
33
|
+
function loadConfig(path, sink) {
|
|
34
|
+
sink.display = undefined;
|
|
35
|
+
if (path === undefined)
|
|
36
|
+
return undefined;
|
|
37
|
+
let raw;
|
|
38
|
+
try {
|
|
39
|
+
raw = readFileSync(path, 'utf8');
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
// incur only hands the loader an existing file unless --config named one.
|
|
43
|
+
if (e.code === 'ENOENT') {
|
|
44
|
+
throw new Error(`Config file not found: ${path}`);
|
|
45
|
+
}
|
|
46
|
+
throw e;
|
|
47
|
+
}
|
|
48
|
+
let parsed;
|
|
49
|
+
try {
|
|
50
|
+
parsed = JSON.parse(raw);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
throw new Error(`Invalid JSON config file: ${path}`);
|
|
54
|
+
}
|
|
55
|
+
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
56
|
+
throw new Error(`Config file must hold a JSON object: ${path}`);
|
|
57
|
+
}
|
|
58
|
+
sink.display = parsed[DISPLAY_CONFIG_KEY];
|
|
59
|
+
return parsed;
|
|
60
|
+
}
|
|
17
61
|
/**
|
|
18
62
|
* Builds the root picopilot CLI.
|
|
19
63
|
*
|
|
@@ -27,6 +71,7 @@ import { VERSION } from './version.js';
|
|
|
27
71
|
* CLI and drive it with `cli.serve(argv, { stdout, exit, env })` DI overrides.
|
|
28
72
|
*/
|
|
29
73
|
export function createCli() {
|
|
74
|
+
const configSink = {};
|
|
30
75
|
const cli = Cli.create('picopilot', {
|
|
31
76
|
version: VERSION,
|
|
32
77
|
description: 'An agent-first toolchain for PICO-8 game development.',
|
|
@@ -38,22 +83,72 @@ export function createCli() {
|
|
|
38
83
|
config: {
|
|
39
84
|
flag: 'config',
|
|
40
85
|
files: ['picopilot.json'],
|
|
86
|
+
loader: async (path) => loadConfig(path, configSink),
|
|
41
87
|
},
|
|
88
|
+
// The display mode (ADR-0017) is global: it applies to every command that
|
|
89
|
+
// starts a PICO-8 `-run` session. Precedence: --display > PICOPILOT_DISPLAY
|
|
90
|
+
// > picopilot.json `display` > auto.
|
|
91
|
+
globals: z.object({
|
|
92
|
+
display: z
|
|
93
|
+
.enum(DISPLAY_MODES)
|
|
94
|
+
.optional()
|
|
95
|
+
.describe('How PICO-8 -run sessions (audio record/render, run --record-audio) get a display: auto (default: a private virtual display only when there is none), xvfb (always virtual), native (as-is). Also PICOPILOT_DISPLAY or picopilot.json "display" (under --mcp, only PICOPILOT_DISPLAY applies).'),
|
|
96
|
+
}),
|
|
97
|
+
env: z.object({
|
|
98
|
+
[DISPLAY_ENV_VAR]: z
|
|
99
|
+
.string()
|
|
100
|
+
.optional()
|
|
101
|
+
.describe('Display mode: auto | xvfb | native (below --display).'),
|
|
102
|
+
}),
|
|
103
|
+
vars: z.object({
|
|
104
|
+
display: z.enum(DISPLAY_MODES).default(DEFAULT_DISPLAY_MODE),
|
|
105
|
+
}),
|
|
106
|
+
});
|
|
107
|
+
cli.use(async (c, next) => {
|
|
108
|
+
const configured = configSink.display;
|
|
109
|
+
configSink.display = undefined; // never leak into a later invocation
|
|
110
|
+
const resolved = resolveDisplayMode({
|
|
111
|
+
// incur's MCP transport passes no globals (and loads no config file), so
|
|
112
|
+
// under `--mcp` only PICOPILOT_DISPLAY applies.
|
|
113
|
+
flag: c.globals?.display,
|
|
114
|
+
env: c.env[DISPLAY_ENV_VAR],
|
|
115
|
+
config: configured,
|
|
116
|
+
});
|
|
117
|
+
if (!resolved.ok) {
|
|
118
|
+
// A bad value only fails the commands that use it; the rest run as usual.
|
|
119
|
+
if (!DISPLAY_COMMANDS.has(c.command))
|
|
120
|
+
return next();
|
|
121
|
+
// (An invalid --display never gets here: incur's enum rejects it first.)
|
|
122
|
+
const where = resolved.source === 'env'
|
|
123
|
+
? DISPLAY_ENV_VAR
|
|
124
|
+
: `picopilot.json "${DISPLAY_CONFIG_KEY}"`;
|
|
125
|
+
return c.error({
|
|
126
|
+
code: 'invalid-display-mode',
|
|
127
|
+
message: `${where} is "${resolved.value}"; expected one of: ${DISPLAY_MODES.join(', ')}.`,
|
|
128
|
+
exitCode: 1,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
c.set('display', resolved.mode);
|
|
132
|
+
await next();
|
|
42
133
|
});
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
134
|
+
// The register* helpers take the untyped Cli: the display var is read through
|
|
135
|
+
// `displayModeOf`, so they do not depend on this CLI's generics.
|
|
136
|
+
const root = cli;
|
|
137
|
+
registerVersion(root);
|
|
138
|
+
registerDoctor(root);
|
|
139
|
+
registerInit(root);
|
|
140
|
+
registerGfx(root);
|
|
141
|
+
registerTokens(root);
|
|
142
|
+
registerLint(root);
|
|
143
|
+
registerMinify(root);
|
|
144
|
+
registerVerify(root);
|
|
145
|
+
registerRun(root);
|
|
146
|
+
registerExport(root);
|
|
147
|
+
registerServe(root);
|
|
148
|
+
registerPlaytest(root);
|
|
149
|
+
registerSfx(root);
|
|
150
|
+
registerMusic(root);
|
|
151
|
+
registerAudio(root);
|
|
152
|
+
return root;
|
|
58
153
|
}
|
|
59
154
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAC,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/audio.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { Cli } from 'incur';
|
|
2
|
-
import { type
|
|
2
|
+
import { type Pico8AdapterFactory } from './pico8-env.js';
|
|
3
3
|
/**
|
|
4
4
|
* Injects the PICO-8 adapter the audio commands use (defaults to the shell
|
|
5
5
|
* adapter over native `pico8 -run`). Mirrors `run`'s `Pico8AdapterFactory` seam:
|
|
6
6
|
* a test passes a fake to drive the record orchestration + the absent path
|
|
7
|
-
* WITHOUT the paid binary
|
|
7
|
+
* WITHOUT the paid binary.
|
|
8
8
|
*/
|
|
9
|
-
export type Pico8AdapterFactory
|
|
9
|
+
export type { Pico8AdapterFactory } from './pico8-env.js';
|
|
10
10
|
/**
|
|
11
11
|
* Registers the `audio` command group (`audio record`, `audio render`) on the
|
|
12
12
|
* root CLI. PICO-8-gated (ADR-0009): audio-to-WAV is a record of a running
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../../src/commands/audio.ts"],"names":[],"mappings":"AASA,OAAO,EAAC,GAAG,EAAI,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../../src/commands/audio.ts"],"names":[],"mappings":"AASA,OAAO,EAAC,GAAG,EAAI,MAAM,OAAO,CAAC;AAW7B,OAAO,EAKN,KAAK,mBAAmB,EAExB,MAAM,gBAAgB,CAAC;AAExB;;;;;GAKG;AACH,YAAY,EAAC,mBAAmB,EAAC,MAAM,gBAAgB,CAAC;AAiYxD;;;;;GAKG;AACH,wBAAgB,aAAa,CAC5B,GAAG,EAAE,GAAG,CAAC,GAAG,EACZ,cAAc,GAAE,mBAA2C,GACzD,IAAI,CAEN"}
|
package/dist/commands/audio.js
CHANGED
|
@@ -2,8 +2,10 @@ import { existsSync, mkdirSync, mkdtempSync, readFileSync, writeFileSync, } from
|
|
|
2
2
|
import { tmpdir } from 'node:os';
|
|
3
3
|
import { isAbsolute, join, resolve } from 'node:path';
|
|
4
4
|
import { Cli, z } from 'incur';
|
|
5
|
-
import { buildRecordHarness, buildRenderHarness, DONE_SENTINEL, HarnessError,
|
|
6
|
-
|
|
5
|
+
import { buildRecordHarness, buildRenderHarness, DONE_SENTINEL, HarnessError, } from '../engine/pico8/index.js';
|
|
6
|
+
import { makeReadInclude } from './cart-includes.js';
|
|
7
|
+
import { createShellAdapterFactory, displayModeOf, displayUnavailableError, PICO8_ENV, pico8NotFoundError, } from './pico8-env.js';
|
|
8
|
+
const defaultAdapterFactory = createShellAdapterFactory();
|
|
7
9
|
/**
|
|
8
10
|
* The default record backstop: kill a capture that never signals after this many
|
|
9
11
|
* ms. Larger than `run`'s default because a record window is a real-time playback
|
|
@@ -11,7 +13,7 @@ const defaultAdapterFactory = (env) => new ShellPico8Adapter({ env });
|
|
|
11
13
|
*/
|
|
12
14
|
const DEFAULT_BACKSTOP_MS = 30_000;
|
|
13
15
|
/** The honest one-liner both `record` and `render` carry (ADR-0009): not offline. */
|
|
14
|
-
const HONEST_CAVEAT = 'This is a REAL-TIME recording of playback
|
|
16
|
+
const HONEST_CAVEAT = 'This is a REAL-TIME recording of playback in a -run session, NOT a deterministic offline export. Works headless: with no display, picopilot runs the session on a private virtual display (ADR-0017, --display).';
|
|
15
17
|
/** Resolves a path argument to an absolute path (relative to cwd). */
|
|
16
18
|
function resolvePath(p) {
|
|
17
19
|
return isAbsolute(p) ? p : resolve(process.cwd(), p);
|
|
@@ -33,20 +35,14 @@ function chooseWavDir(given) {
|
|
|
33
35
|
mkdirSync(dir, { recursive: true });
|
|
34
36
|
return dir;
|
|
35
37
|
}
|
|
36
|
-
/** The env schema both audio subcommands share (locates the binary
|
|
37
|
-
const AUDIO_ENV =
|
|
38
|
-
PICO8_PATH: z
|
|
39
|
-
.string()
|
|
40
|
-
.optional()
|
|
41
|
-
.describe('Explicit path to the PICO-8 binary (else `pico8` on PATH).'),
|
|
42
|
-
PATH: z.string().optional().describe('Used to locate `pico8`.'),
|
|
43
|
-
});
|
|
38
|
+
/** The env schema both audio subcommands share (locates the binary). */
|
|
39
|
+
const AUDIO_ENV = PICO8_ENV;
|
|
44
40
|
/** The structured output shape shared by `record` and `render`. */
|
|
45
41
|
const AUDIO_OUTPUT = z.object({
|
|
46
42
|
wav: z
|
|
47
43
|
.string()
|
|
48
44
|
.optional()
|
|
49
|
-
.describe('Absolute path of the recorded WAV, or omitted if no audio was captured (
|
|
45
|
+
.describe('Absolute path of the recorded WAV, or omitted if no audio was captured (see noAudioReason).'),
|
|
50
46
|
captured: z
|
|
51
47
|
.boolean()
|
|
52
48
|
.describe('Whether a non-empty WAV was captured (false = silent/empty run).'),
|
|
@@ -60,27 +56,44 @@ const AUDIO_OUTPUT = z.object({
|
|
|
60
56
|
.number()
|
|
61
57
|
.describe('The record window in seconds the capture ran for.'),
|
|
62
58
|
printh: z.string().describe('Captured stdout from the session.'),
|
|
59
|
+
display: z
|
|
60
|
+
.enum(['native', 'Xvfb', 'xvfb-run'])
|
|
61
|
+
.optional()
|
|
62
|
+
.describe('Which display the -run session used: native, or a private virtual display (Xvfb / xvfb-run).'),
|
|
63
|
+
noAudioReason: z
|
|
64
|
+
.string()
|
|
65
|
+
.optional()
|
|
66
|
+
.describe('When no WAV was captured: why (backstop fired / PICO-8 exited before the done-sentinel / empty capture).'),
|
|
67
|
+
pico8LogTail: z
|
|
68
|
+
.string()
|
|
69
|
+
.optional()
|
|
70
|
+
.describe("When no WAV was captured: the tail of PICO-8's own log.txt (load errors, SDL init failures)."),
|
|
63
71
|
});
|
|
64
|
-
/** The message a `pico8-not-found` error carries (mirrors `run`): exact remedy + needs. */
|
|
65
|
-
function pico8NotFoundMessage(notFound) {
|
|
66
|
-
return `PICO-8 is not installed. ${notFound.remedy} (needs: ${notFound.needs.join(', ')})`;
|
|
67
|
-
}
|
|
68
72
|
/**
|
|
69
|
-
* The advisory CTA when a record/render run captured NO audio
|
|
70
|
-
*
|
|
71
|
-
* hear (ADR-0009's live-tier caveat), so it is a nudge, not a hard error.
|
|
73
|
+
* The advisory CTA when a record/render run captured NO audio. The report's
|
|
74
|
+
* `noAudioReason` + `pico8LogTail` say why; this points at the next step.
|
|
72
75
|
*/
|
|
73
|
-
function noAudioCta(
|
|
76
|
+
function noAudioCta(reason) {
|
|
74
77
|
return {
|
|
75
|
-
description: `No audio was captured (${
|
|
78
|
+
description: `No audio was captured${reason !== undefined ? ` (${reason})` : ''}. Next:`,
|
|
76
79
|
commands: [
|
|
77
80
|
{
|
|
78
|
-
command: '
|
|
79
|
-
description: 'Run
|
|
81
|
+
command: 'verify',
|
|
82
|
+
description: 'Run the static gate: a cart that fails to load or errors never reaches audio_end.',
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
command: 'doctor',
|
|
86
|
+
description: 'Check PICO-8 and display capabilities on this machine.',
|
|
80
87
|
},
|
|
81
88
|
],
|
|
82
89
|
};
|
|
83
90
|
}
|
|
91
|
+
/** Maps a failed record result onto the structured `error(...)` payload. */
|
|
92
|
+
function recordFailure(what, result) {
|
|
93
|
+
return result.reason === 'display-unavailable'
|
|
94
|
+
? displayUnavailableError(what, result)
|
|
95
|
+
: pico8NotFoundError(result);
|
|
96
|
+
}
|
|
84
97
|
/** Shapes an adapter record report into the structured output object. */
|
|
85
98
|
function recordOutput(report, harness) {
|
|
86
99
|
return {
|
|
@@ -90,6 +103,13 @@ function recordOutput(report, harness) {
|
|
|
90
103
|
target: harness.description,
|
|
91
104
|
seconds: harness.seconds,
|
|
92
105
|
printh: report.printh,
|
|
106
|
+
...(report.display !== undefined ? { display: report.display } : {}),
|
|
107
|
+
...(report.noWavReason !== undefined
|
|
108
|
+
? { noAudioReason: report.noWavReason }
|
|
109
|
+
: {}),
|
|
110
|
+
...(report.pico8LogTail !== undefined
|
|
111
|
+
? { pico8LogTail: report.pico8LogTail }
|
|
112
|
+
: {}),
|
|
93
113
|
};
|
|
94
114
|
}
|
|
95
115
|
/**
|
|
@@ -100,7 +120,7 @@ function recordOutput(report, harness) {
|
|
|
100
120
|
*/
|
|
101
121
|
function buildAudioGroup(adapterFactory) {
|
|
102
122
|
const audio = Cli.create('audio', {
|
|
103
|
-
description: 'Get a WAV out of a cart by RECORDING a running session (ADR-0009). PICO-8 has no working offline WAV export, so both commands are REAL-TIME recordings
|
|
123
|
+
description: 'Get a WAV out of a cart by RECORDING a running session (ADR-0009). PICO-8 has no working offline WAV export, so both commands are REAL-TIME recordings of a -run session, NOT deterministic offline exports. They work headless: with no display, picopilot runs the session on a private virtual display (ADR-0017). Requires PICO-8.',
|
|
104
124
|
});
|
|
105
125
|
// --- audio record <cart> ---------------------------------------------------
|
|
106
126
|
audio.command('record', {
|
|
@@ -142,7 +162,7 @@ function buildAudioGroup(adapterFactory) {
|
|
|
142
162
|
options: { seconds: 4 },
|
|
143
163
|
},
|
|
144
164
|
],
|
|
145
|
-
async run({ args, options, env, error, ok }) {
|
|
165
|
+
async run({ args, options, env, error, ok, var: vars }) {
|
|
146
166
|
const cartPath = resolvePath(args.cart);
|
|
147
167
|
if (!existsSync(cartPath)) {
|
|
148
168
|
return error({
|
|
@@ -153,9 +173,12 @@ function buildAudioGroup(adapterFactory) {
|
|
|
153
173
|
}
|
|
154
174
|
let harness;
|
|
155
175
|
try {
|
|
176
|
+
// `#include`s are inlined against the SOURCE cart's folder: the harness
|
|
177
|
+
// runs from the isolated wavDir, where `main.lua` does not exist.
|
|
156
178
|
harness = buildRecordHarness(readFileSync(cartPath, 'utf8'), {
|
|
157
179
|
seconds: options.seconds,
|
|
158
180
|
sentinel: options.sentinel,
|
|
181
|
+
readInclude: makeReadInclude(cartPath),
|
|
159
182
|
});
|
|
160
183
|
}
|
|
161
184
|
catch (e) {
|
|
@@ -169,7 +192,9 @@ function buildAudioGroup(adapterFactory) {
|
|
|
169
192
|
const wavDir = chooseWavDir(options.wavDir);
|
|
170
193
|
const harnessCart = join(wavDir, 'record-harness.p8');
|
|
171
194
|
writeFileSync(harnessCart, harness.cartText);
|
|
172
|
-
const adapter = adapterFactory(env
|
|
195
|
+
const adapter = adapterFactory(env, {
|
|
196
|
+
display: displayModeOf(vars),
|
|
197
|
+
});
|
|
173
198
|
const result = await adapter.record({
|
|
174
199
|
cartPath: harnessCart,
|
|
175
200
|
wavDir,
|
|
@@ -177,15 +202,10 @@ function buildAudioGroup(adapterFactory) {
|
|
|
177
202
|
sentinel: options.sentinel,
|
|
178
203
|
backstopMs: options.backstopMs,
|
|
179
204
|
});
|
|
180
|
-
if (!result.ok)
|
|
181
|
-
return error(
|
|
182
|
-
code: 'pico8-not-found',
|
|
183
|
-
message: pico8NotFoundMessage(result),
|
|
184
|
-
exitCode: 1,
|
|
185
|
-
});
|
|
186
|
-
}
|
|
205
|
+
if (!result.ok)
|
|
206
|
+
return error(recordFailure('audio record', result));
|
|
187
207
|
const out = recordOutput(result.value, harness);
|
|
188
|
-
return ok(out, out.captured ? undefined : { cta: noAudioCta(
|
|
208
|
+
return ok(out, out.captured ? undefined : { cta: noAudioCta(out.noAudioReason) });
|
|
189
209
|
},
|
|
190
210
|
});
|
|
191
211
|
// --- audio render ----------------------------------------------------------
|
|
@@ -243,7 +263,7 @@ function buildAudioGroup(adapterFactory) {
|
|
|
243
263
|
options: { pattern: 2, seconds: 6 },
|
|
244
264
|
},
|
|
245
265
|
],
|
|
246
|
-
async run({ args, options, env, error, ok }) {
|
|
266
|
+
async run({ args, options, env, error, ok, var: vars }) {
|
|
247
267
|
if (options.sfx !== undefined && options.pattern !== undefined) {
|
|
248
268
|
return error({
|
|
249
269
|
code: 'ambiguous-target',
|
|
@@ -282,7 +302,9 @@ function buildAudioGroup(adapterFactory) {
|
|
|
282
302
|
const wavDir = chooseWavDir(options.wavDir);
|
|
283
303
|
const harnessCart = join(wavDir, 'render-harness.p8');
|
|
284
304
|
writeFileSync(harnessCart, harness.cartText);
|
|
285
|
-
const adapter = adapterFactory(env
|
|
305
|
+
const adapter = adapterFactory(env, {
|
|
306
|
+
display: displayModeOf(vars),
|
|
307
|
+
});
|
|
286
308
|
const result = await adapter.record({
|
|
287
309
|
cartPath: harnessCart,
|
|
288
310
|
wavDir,
|
|
@@ -290,15 +312,10 @@ function buildAudioGroup(adapterFactory) {
|
|
|
290
312
|
sentinel: options.sentinel,
|
|
291
313
|
backstopMs: options.backstopMs,
|
|
292
314
|
});
|
|
293
|
-
if (!result.ok)
|
|
294
|
-
return error(
|
|
295
|
-
code: 'pico8-not-found',
|
|
296
|
-
message: pico8NotFoundMessage(result),
|
|
297
|
-
exitCode: 1,
|
|
298
|
-
});
|
|
299
|
-
}
|
|
315
|
+
if (!result.ok)
|
|
316
|
+
return error(recordFailure('audio render', result));
|
|
300
317
|
const out = recordOutput(result.value, harness);
|
|
301
|
-
return ok(out, out.captured ? undefined : { cta: noAudioCta(
|
|
318
|
+
return ok(out, out.captured ? undefined : { cta: noAudioCta(out.noAudioReason) });
|
|
302
319
|
},
|
|
303
320
|
});
|
|
304
321
|
return audio;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audio.js","sourceRoot":"","sources":["../../src/commands/audio.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,UAAU,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACZ,aAAa,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAC,MAAM,EAAC,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAC,UAAU,EAAE,IAAI,EAAE,OAAO,EAAC,MAAM,WAAW,CAAC;AACpD,OAAO,EAAC,GAAG,EAAE,CAAC,EAAC,MAAM,OAAO,CAAC;AAE7B,OAAO,EACN,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,YAAY,
|
|
1
|
+
{"version":3,"file":"audio.js","sourceRoot":"","sources":["../../src/commands/audio.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A `#include` resolver for the drive-transform, bound to the SOURCE cart's dir:
|
|
3
|
+
* picopilot's standard scaffold is `main.p8` = `#include main.lua`, and the
|
|
4
|
+
* driven cart runs from a throwaway temp dir where `main.lua` is absent, so the
|
|
5
|
+
* transform inlines includes to be self-contained. Reads the included file
|
|
6
|
+
* relative to the cart (absolute paths honoured); returns `undefined` if it
|
|
7
|
+
* cannot be read (the directive is then left verbatim). Shared by `playtest` and
|
|
8
|
+
* the `--label-frame` capture.
|
|
9
|
+
*/
|
|
10
|
+
export declare function makeReadInclude(cartPath: string): (p: string) => string | undefined;
|
|
11
|
+
//# sourceMappingURL=cart-includes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cart-includes.d.ts","sourceRoot":"","sources":["../../src/commands/cart-includes.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC9B,QAAQ,EAAE,MAAM,GACd,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAYnC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { dirname, isAbsolute, join } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* A `#include` resolver for the drive-transform, bound to the SOURCE cart's dir:
|
|
5
|
+
* picopilot's standard scaffold is `main.p8` = `#include main.lua`, and the
|
|
6
|
+
* driven cart runs from a throwaway temp dir where `main.lua` is absent, so the
|
|
7
|
+
* transform inlines includes to be self-contained. Reads the included file
|
|
8
|
+
* relative to the cart (absolute paths honoured); returns `undefined` if it
|
|
9
|
+
* cannot be read (the directive is then left verbatim). Shared by `playtest` and
|
|
10
|
+
* the `--label-frame` capture.
|
|
11
|
+
*/
|
|
12
|
+
export function makeReadInclude(cartPath) {
|
|
13
|
+
const base = dirname(cartPath);
|
|
14
|
+
return (includePath) => {
|
|
15
|
+
const full = isAbsolute(includePath)
|
|
16
|
+
? includePath
|
|
17
|
+
: join(base, includePath);
|
|
18
|
+
try {
|
|
19
|
+
return readFileSync(full, 'utf8');
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=cart-includes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cart-includes.js","sourceRoot":"","sources":["../../src/commands/cart-includes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,SAAS,CAAC;AACrC,OAAO,EAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAC,MAAM,WAAW,CAAC;AAEpD;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAC9B,QAAgB;IAEhB,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,WAAW,EAAE,EAAE;QACtB,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,CAAC;YACnC,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC3B,IAAI,CAAC;YACJ,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,SAAS,CAAC;QAClB,CAAC;IACF,CAAC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type Cli } from 'incur';
|
|
2
|
+
import { type Pico8AdapterFactory } from './pico8-env.js';
|
|
3
|
+
import { type ShrinkoAdapterFactory } from './shrinko-env.js';
|
|
4
|
+
/** Dependencies for {@link registerDoctor}, injectable for tests. */
|
|
5
|
+
export interface DoctorDeps {
|
|
6
|
+
readonly pico8?: Pico8AdapterFactory;
|
|
7
|
+
readonly shrinko?: ShrinkoAdapterFactory;
|
|
8
|
+
/** The parent environment (defaults to `process.env`): DISPLAY etc. are read from it. */
|
|
9
|
+
readonly parentEnv?: NodeJS.ProcessEnv;
|
|
10
|
+
/** Executable lookup (defaults to a PATH search). */
|
|
11
|
+
readonly find?: (name: string, env: NodeJS.ProcessEnv) => string | undefined;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Registers `picopilot doctor`: what can THIS machine do? It reports whether
|
|
15
|
+
* PICO-8 is found (and runs headless, with its version), whether shrinko8 is
|
|
16
|
+
* found, how a PICO-8 `-run` session would get a display (native, a private
|
|
17
|
+
* virtual one via Xvfb, or none), and therefore which commands are available.
|
|
18
|
+
* An agent calls it first instead of discovering limits by failing. It never
|
|
19
|
+
* fails itself: a missing dependency is data in the report.
|
|
20
|
+
*/
|
|
21
|
+
export declare function registerDoctor(cli: Cli.Cli, deps?: DoctorDeps): void;
|
|
22
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,KAAK,GAAG,EAAI,MAAM,OAAO,CAAC;AAYlC,OAAO,EAIN,KAAK,mBAAmB,EACxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAEN,KAAK,qBAAqB,EAC1B,MAAM,kBAAkB,CAAC;AA6D1B,qEAAqE;AACrE,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,qBAAqB,CAAC;IACzC,yFAAyF;IACzF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACvC,qDAAqD;IACrD,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,KAAK,MAAM,GAAG,SAAS,CAAC;CAC7E;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI,GAAE,UAAe,GAAG,IAAI,CAgLxE"}
|