@debuffjp/dev 0.0.0-stage → 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/README.md +45 -2
- package/dist/explain.d.ts +57 -0
- package/dist/explain.d.ts.map +1 -0
- package/dist/explain.js +243 -0
- package/dist/explain.js.map +1 -0
- package/dist/index.d.ts +114 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +157 -0
- package/dist/index.js.map +1 -0
- package/dist/overlay.d.ts +18 -0
- package/dist/overlay.d.ts.map +1 -0
- package/dist/overlay.js +833 -0
- package/dist/overlay.js.map +1 -0
- package/dist/replay.d.ts +53 -0
- package/dist/replay.d.ts.map +1 -0
- package/dist/replay.js +101 -0
- package/dist/replay.js.map +1 -0
- package/dist/session.d.ts +166 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +411 -0
- package/dist/session.js.map +1 -0
- package/package.json +47 -4
package/dist/session.js
ADDED
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
import { errorKey, explainError, mapLocation } from "./explain.js";
|
|
2
|
+
import { InputRecording } from "./replay.js";
|
|
3
|
+
/**
|
|
4
|
+
* Records a per-frame breakdown through lifecycle hooks (dev only). Fixed-size ring buffers, no
|
|
5
|
+
* allocation per frame. Also emits User Timing measures so phases show up in browser profilers.
|
|
6
|
+
*/
|
|
7
|
+
export class FrameRecorder {
|
|
8
|
+
game;
|
|
9
|
+
size;
|
|
10
|
+
fields = {
|
|
11
|
+
tick: new Float64Array(0),
|
|
12
|
+
interval: new Float64Array(0),
|
|
13
|
+
update: new Float64Array(0),
|
|
14
|
+
render: new Float64Array(0),
|
|
15
|
+
steps: new Uint16Array(0),
|
|
16
|
+
quads: new Uint32Array(0),
|
|
17
|
+
drawCalls: new Uint32Array(0),
|
|
18
|
+
longTask: new Float64Array(0),
|
|
19
|
+
at: new Float64Array(0),
|
|
20
|
+
};
|
|
21
|
+
scenes;
|
|
22
|
+
head = 0;
|
|
23
|
+
count = 0;
|
|
24
|
+
frameStart = 0;
|
|
25
|
+
lastFrameStart = 0;
|
|
26
|
+
updateStart = 0;
|
|
27
|
+
updateMs = 0;
|
|
28
|
+
steps = 0;
|
|
29
|
+
renderStart = 0;
|
|
30
|
+
cleanups = [];
|
|
31
|
+
/** Called after each recorded frame with its index (see `get`). */
|
|
32
|
+
onFrame;
|
|
33
|
+
constructor(game, options = {}) {
|
|
34
|
+
this.game = game;
|
|
35
|
+
this.size = options.size ?? 240;
|
|
36
|
+
for (const key of Object.keys(this.fields)) {
|
|
37
|
+
const Ctor = this.fields[key].constructor;
|
|
38
|
+
this.fields[key] = new Ctor(this.size);
|
|
39
|
+
}
|
|
40
|
+
this.scenes = new Array(this.size);
|
|
41
|
+
const timing = options.userTiming ?? true;
|
|
42
|
+
const { hooks } = game;
|
|
43
|
+
this.cleanups.push(hooks.beforeUpdate(() => {
|
|
44
|
+
if (this.steps === 0)
|
|
45
|
+
this.startFrame();
|
|
46
|
+
this.updateStart = performance.now();
|
|
47
|
+
}), hooks.afterUpdate(() => {
|
|
48
|
+
const end = performance.now();
|
|
49
|
+
this.updateMs += end - this.updateStart;
|
|
50
|
+
this.steps++;
|
|
51
|
+
if (timing)
|
|
52
|
+
measure("debuff:update", this.updateStart, end);
|
|
53
|
+
}), hooks.beforeRender(() => {
|
|
54
|
+
if (this.steps === 0)
|
|
55
|
+
this.startFrame();
|
|
56
|
+
this.renderStart = performance.now();
|
|
57
|
+
}), hooks.afterRender((draw) => {
|
|
58
|
+
const end = performance.now();
|
|
59
|
+
if (timing)
|
|
60
|
+
measure("debuff:render", this.renderStart, end);
|
|
61
|
+
this.commit(end - this.renderStart, draw.quads, draw.drawCalls);
|
|
62
|
+
}));
|
|
63
|
+
if (typeof PerformanceObserver !== "undefined" && PerformanceObserver.supportedEntryTypes?.includes("longtask")) {
|
|
64
|
+
const observer = new PerformanceObserver((list) => {
|
|
65
|
+
for (const e of list.getEntries())
|
|
66
|
+
this.attributeLongTask(e.startTime, e.duration);
|
|
67
|
+
});
|
|
68
|
+
observer.observe({ type: "longtask", buffered: false });
|
|
69
|
+
this.cleanups.push(() => observer.disconnect());
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** Number of recorded frames (up to `size`). */
|
|
73
|
+
get length() {
|
|
74
|
+
return this.count;
|
|
75
|
+
}
|
|
76
|
+
/** Sample `i` frames ago (0 = latest). */
|
|
77
|
+
get(i) {
|
|
78
|
+
if (i < 0 || i >= this.count)
|
|
79
|
+
return undefined;
|
|
80
|
+
const k = (this.head - 1 - i + this.size) % this.size;
|
|
81
|
+
const f = this.fields;
|
|
82
|
+
return {
|
|
83
|
+
tick: f.tick[k] ?? 0,
|
|
84
|
+
scene: this.scenes[k],
|
|
85
|
+
intervalMs: f.interval[k] ?? 0,
|
|
86
|
+
updateMs: f.update[k] ?? 0,
|
|
87
|
+
renderMs: f.render[k] ?? 0,
|
|
88
|
+
steps: f.steps[k] ?? 0,
|
|
89
|
+
quads: f.quads[k] ?? 0,
|
|
90
|
+
drawCalls: f.drawCalls[k] ?? 0,
|
|
91
|
+
longTaskMs: f.longTask[k] ?? 0,
|
|
92
|
+
at: f.at[k] ?? 0,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/** The latest `n` samples, oldest first (JSON-friendly, for agents). */
|
|
96
|
+
recent(n = this.count) {
|
|
97
|
+
const out = [];
|
|
98
|
+
for (let i = Math.min(n, this.count) - 1; i >= 0; i--) {
|
|
99
|
+
const s = this.get(i);
|
|
100
|
+
if (s)
|
|
101
|
+
out.push(s);
|
|
102
|
+
}
|
|
103
|
+
return out;
|
|
104
|
+
}
|
|
105
|
+
dispose() {
|
|
106
|
+
for (const c of this.cleanups)
|
|
107
|
+
c();
|
|
108
|
+
}
|
|
109
|
+
startFrame() {
|
|
110
|
+
this.lastFrameStart = this.frameStart;
|
|
111
|
+
this.frameStart = performance.now();
|
|
112
|
+
this.updateMs = 0;
|
|
113
|
+
}
|
|
114
|
+
commit(renderMs, quads, drawCalls) {
|
|
115
|
+
const k = this.head;
|
|
116
|
+
const f = this.fields;
|
|
117
|
+
f.tick[k] = this.game.clock.tick;
|
|
118
|
+
f.interval[k] = this.lastFrameStart ? this.frameStart - this.lastFrameStart : 0;
|
|
119
|
+
f.update[k] = this.updateMs;
|
|
120
|
+
f.render[k] = renderMs;
|
|
121
|
+
f.steps[k] = this.steps;
|
|
122
|
+
f.quads[k] = quads;
|
|
123
|
+
f.drawCalls[k] = drawCalls;
|
|
124
|
+
f.longTask[k] = 0;
|
|
125
|
+
f.at[k] = this.frameStart;
|
|
126
|
+
this.scenes[k] = this.game.scene?.id;
|
|
127
|
+
this.head = (this.head + 1) % this.size;
|
|
128
|
+
this.count = Math.min(this.count + 1, this.size);
|
|
129
|
+
this.steps = 0;
|
|
130
|
+
this.onFrame?.(0);
|
|
131
|
+
}
|
|
132
|
+
attributeLongTask(start, duration) {
|
|
133
|
+
// Long-task entries arrive after the fact; credit the frame whose start precedes the task.
|
|
134
|
+
for (let i = 0; i < this.count; i++) {
|
|
135
|
+
const k = (this.head - 1 - i + this.size) % this.size;
|
|
136
|
+
if ((this.fields.at[k] ?? 0) <= start) {
|
|
137
|
+
this.fields.longTask[k] = (this.fields.longTask[k] ?? 0) + duration;
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function measure(name, start, end) {
|
|
144
|
+
try {
|
|
145
|
+
performance.measure(name, { start, end });
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
// User Timing L3 unsupported: skip.
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
const sessions = new WeakMap();
|
|
152
|
+
/**
|
|
153
|
+
* Shared dev state for a game: pause/step/speed, frame recording, an activity log and human notes.
|
|
154
|
+
* The overlay, dev hooks and the agent link all use the same session.
|
|
155
|
+
*/
|
|
156
|
+
export class DevSession {
|
|
157
|
+
game;
|
|
158
|
+
recorder;
|
|
159
|
+
activity = [];
|
|
160
|
+
notes = [];
|
|
161
|
+
/** Input recorded since page load, for replays (present once `attachInput` is called). */
|
|
162
|
+
recording;
|
|
163
|
+
/** Uncaught errors, unhandled rejections and loop errors, explained and de-duplicated (max 50). */
|
|
164
|
+
errors = [];
|
|
165
|
+
/** The error object the loop just reported, so its rethrow isn't counted twice. */
|
|
166
|
+
lastLoopError;
|
|
167
|
+
errorKeys = new WeakMap();
|
|
168
|
+
onError = (e) => {
|
|
169
|
+
if (e.error !== undefined && e.error === this.lastLoopError)
|
|
170
|
+
return;
|
|
171
|
+
this.addError(explainError(e.error ?? new Error(e.message)));
|
|
172
|
+
};
|
|
173
|
+
onRejection = (e) => this.addError(explainError(e.reason));
|
|
174
|
+
unsubscribeLoopError;
|
|
175
|
+
/** Who paused the game, or undefined while running. */
|
|
176
|
+
pausedBy;
|
|
177
|
+
/** Pause automatically when a frame exceeds this many milliseconds (0 = off). */
|
|
178
|
+
pauseOnSpikeMs = 0;
|
|
179
|
+
/** performance.now() of the last agent action (agent link); -Infinity if never. */
|
|
180
|
+
agentLastSeenAt = Number.NEGATIVE_INFINITY;
|
|
181
|
+
listeners = new Set();
|
|
182
|
+
refs = 0;
|
|
183
|
+
nextNote = 1;
|
|
184
|
+
constructor(game) {
|
|
185
|
+
this.game = game;
|
|
186
|
+
this.recorder = new FrameRecorder(game);
|
|
187
|
+
this.recorder.onFrame = () => {
|
|
188
|
+
const latest = this.recorder.get(0);
|
|
189
|
+
if (this.pauseOnSpikeMs > 0 && latest && latest.intervalMs > this.pauseOnSpikeMs && !this.pausedBy) {
|
|
190
|
+
this.pause("spike", `${latest.intervalMs.toFixed(1)} ms frame at tick ${latest.tick}`);
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
this.unsubscribeLoopError = game.hooks.error((error, context) => this.onLoopError(error, context));
|
|
194
|
+
addEventListener("error", this.onError);
|
|
195
|
+
addEventListener("unhandledrejection", this.onRejection);
|
|
196
|
+
}
|
|
197
|
+
/** The session for `game`, created on first use. Call `release()` when done. */
|
|
198
|
+
static acquire(game) {
|
|
199
|
+
let s = sessions.get(game);
|
|
200
|
+
if (!s) {
|
|
201
|
+
s = new DevSession(game);
|
|
202
|
+
sessions.set(game, s);
|
|
203
|
+
}
|
|
204
|
+
s.refs++;
|
|
205
|
+
return s;
|
|
206
|
+
}
|
|
207
|
+
release() {
|
|
208
|
+
if (--this.refs > 0)
|
|
209
|
+
return;
|
|
210
|
+
this.recorder.dispose();
|
|
211
|
+
this.recording?.dispose();
|
|
212
|
+
removeEventListener("error", this.onError);
|
|
213
|
+
this.unsubscribeLoopError();
|
|
214
|
+
removeEventListener("unhandledrejection", this.onRejection);
|
|
215
|
+
sessions.delete(this.game);
|
|
216
|
+
}
|
|
217
|
+
get paused() {
|
|
218
|
+
return this.pausedBy !== undefined;
|
|
219
|
+
}
|
|
220
|
+
/** An agent acted on this game in the last 30 seconds. */
|
|
221
|
+
get agentConnected() {
|
|
222
|
+
return this.agentsAttached > 0 || performance.now() - this.agentLastSeenAt < 30_000;
|
|
223
|
+
}
|
|
224
|
+
/** Agents holding an attach connection through the dev server (agent link). */
|
|
225
|
+
agentsAttached = 0;
|
|
226
|
+
/** Update attached agents from the dev server; logs connects and disconnects. */
|
|
227
|
+
setAgentsAttached(n) {
|
|
228
|
+
const was = this.agentsAttached > 0;
|
|
229
|
+
this.agentsAttached = n;
|
|
230
|
+
if (n > 0 && !was)
|
|
231
|
+
this.log("agent", "connected");
|
|
232
|
+
else if (n === 0 && was) {
|
|
233
|
+
this.agentLastSeenAt = Number.NEGATIVE_INFINITY;
|
|
234
|
+
this.log("agent", "disconnected");
|
|
235
|
+
}
|
|
236
|
+
else
|
|
237
|
+
this.changed();
|
|
238
|
+
}
|
|
239
|
+
agentSeen() {
|
|
240
|
+
const wasConnected = this.agentConnected;
|
|
241
|
+
this.agentLastSeenAt = performance.now();
|
|
242
|
+
if (!wasConnected)
|
|
243
|
+
this.log("agent", "connected");
|
|
244
|
+
else
|
|
245
|
+
this.changed();
|
|
246
|
+
}
|
|
247
|
+
pause(who = "you", detail) {
|
|
248
|
+
if (this.pausedBy)
|
|
249
|
+
return;
|
|
250
|
+
this.game.stop();
|
|
251
|
+
this.pausedBy = who;
|
|
252
|
+
this.log(who, "paused", detail);
|
|
253
|
+
}
|
|
254
|
+
resume(who = "you") {
|
|
255
|
+
if (!this.pausedBy)
|
|
256
|
+
return;
|
|
257
|
+
this.pausedBy = undefined;
|
|
258
|
+
this.game.start();
|
|
259
|
+
this.log(who, "resumed");
|
|
260
|
+
}
|
|
261
|
+
/** Advance exactly `n` fixed steps (pauses first, so the result stays put). */
|
|
262
|
+
step(n = 1, who = "you") {
|
|
263
|
+
if (!this.pausedBy)
|
|
264
|
+
this.pause(who);
|
|
265
|
+
this.game.step(n);
|
|
266
|
+
this.changed();
|
|
267
|
+
}
|
|
268
|
+
/** Start recording this input for replays. Idempotent. */
|
|
269
|
+
attachInput(input) {
|
|
270
|
+
this.recording ??= new InputRecording(this.game, input);
|
|
271
|
+
}
|
|
272
|
+
setSpeed(scale, who = "you") {
|
|
273
|
+
// Slow motion changes the simulation itself, so a replay (which always runs at 1×) can't match it.
|
|
274
|
+
if (scale !== 1)
|
|
275
|
+
this.recording?.warn(`Speed was set to ${scale}× during the session; replays run at 1×.`);
|
|
276
|
+
this.game.timeScale = scale;
|
|
277
|
+
this.log(who, "speed", `${scale}×`);
|
|
278
|
+
}
|
|
279
|
+
/** Set a param and log it with an undo that restores the previous value. */
|
|
280
|
+
setParam(group, key, value, who = "you") {
|
|
281
|
+
const g = this.game.params.group(group);
|
|
282
|
+
if (!g)
|
|
283
|
+
throw new Error(`Unknown param group "${group}". Known: ${Object.keys(this.game.params.describe()).join(", ")}`);
|
|
284
|
+
const previous = g.get(key);
|
|
285
|
+
if (previous === value)
|
|
286
|
+
return;
|
|
287
|
+
g.set(key, value);
|
|
288
|
+
this.log(who, "set", `${group}.${key} ${format(previous)} → ${format(value)}`, () => g.set(key, previous));
|
|
289
|
+
}
|
|
290
|
+
/** Flag the current moment with a note for an agent to pick up. */
|
|
291
|
+
note(text) {
|
|
292
|
+
const scene = this.game.scene;
|
|
293
|
+
const n = {
|
|
294
|
+
id: this.nextNote++,
|
|
295
|
+
at: Date.now(),
|
|
296
|
+
tick: this.game.clock.tick,
|
|
297
|
+
text,
|
|
298
|
+
state: scene?.inspect?.(),
|
|
299
|
+
frames: this.recorder.recent(30),
|
|
300
|
+
};
|
|
301
|
+
this.notes.push(n);
|
|
302
|
+
this.log("you", "noted", text);
|
|
303
|
+
return n;
|
|
304
|
+
}
|
|
305
|
+
/** The loop stopped on an error: record it with where it happened and show the game as paused by it. */
|
|
306
|
+
onLoopError(error, context) {
|
|
307
|
+
this.lastLoopError = error;
|
|
308
|
+
const explained = this.addError(explainError(error, context));
|
|
309
|
+
// The game already stopped itself; reflect that so "play" retries from here.
|
|
310
|
+
this.pausedBy = "error";
|
|
311
|
+
this.log("error", "stopped the game", `in ${context.phase}: ${explained.message}`);
|
|
312
|
+
}
|
|
313
|
+
addError(e) {
|
|
314
|
+
// Key on the location as first reported: source-mapping later changes `where`, and repeats must still match.
|
|
315
|
+
const key = errorKey(e);
|
|
316
|
+
const same = this.errors.find((x) => this.errorKeys.get(x) === key);
|
|
317
|
+
if (same) {
|
|
318
|
+
same.count++;
|
|
319
|
+
this.changed();
|
|
320
|
+
return same;
|
|
321
|
+
}
|
|
322
|
+
this.errors.push(e);
|
|
323
|
+
this.errorKeys.set(e, key);
|
|
324
|
+
if (this.errors.length > 50)
|
|
325
|
+
this.errors.shift();
|
|
326
|
+
this.changed();
|
|
327
|
+
// Point at the original source line, not the compiled module the browser ran.
|
|
328
|
+
void mapLocation(e).then((moved) => moved && this.changed());
|
|
329
|
+
return e;
|
|
330
|
+
}
|
|
331
|
+
/** Forget recorded errors (after fixing them). */
|
|
332
|
+
clearErrors() {
|
|
333
|
+
this.errors.length = 0;
|
|
334
|
+
this.changed();
|
|
335
|
+
}
|
|
336
|
+
log(who, action, detail, undo) {
|
|
337
|
+
this.activity.push({ at: Date.now(), who, action, ...(detail === undefined ? {} : { detail }), ...(undo ? { undo } : {}) });
|
|
338
|
+
if (this.activity.length > 200)
|
|
339
|
+
this.activity.shift();
|
|
340
|
+
this.changed();
|
|
341
|
+
}
|
|
342
|
+
/** Subscribe to state changes (pause, log, notes). Returns an unsubscribe function. */
|
|
343
|
+
subscribe(fn) {
|
|
344
|
+
this.listeners.add(fn);
|
|
345
|
+
return () => {
|
|
346
|
+
this.listeners.delete(fn);
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
changed() {
|
|
350
|
+
for (const fn of this.listeners)
|
|
351
|
+
fn();
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
const format = (v) => (typeof v === "number" && !Number.isInteger(v) ? v.toFixed(2) : String(v));
|
|
355
|
+
/**
|
|
356
|
+
* Explain a frame in plain words, so a red bar points somewhere useful.
|
|
357
|
+
* @internal exported for the overlay and tests
|
|
358
|
+
*/
|
|
359
|
+
export function diagnose(s, budgetMs = 1000 / 60) {
|
|
360
|
+
const work = s.updateMs + s.renderMs;
|
|
361
|
+
if (s.intervalMs <= budgetMs * 1.05)
|
|
362
|
+
return "on budget";
|
|
363
|
+
if (s.intervalMs <= budgetMs * HITCH && work <= budgetMs * 0.75)
|
|
364
|
+
return "a little late: normal display timing jitter, not a dropped frame";
|
|
365
|
+
const parts = [];
|
|
366
|
+
if (s.longTaskMs > 0)
|
|
367
|
+
parts.push(`the browser reported a ${s.longTaskMs.toFixed(0)} ms main-thread stall`);
|
|
368
|
+
if (s.steps > 1)
|
|
369
|
+
parts.push(`the loop caught up ${s.steps} steps after a late frame`);
|
|
370
|
+
if (work > budgetMs * 0.75) {
|
|
371
|
+
parts.push(s.updateMs >= s.renderMs
|
|
372
|
+
? `update took ${s.updateMs.toFixed(1)} ms`
|
|
373
|
+
: `render took ${s.renderMs.toFixed(1)} ms (${s.quads} quads, ${s.drawCalls} draw calls)`);
|
|
374
|
+
}
|
|
375
|
+
else if (!s.longTaskMs) {
|
|
376
|
+
parts.push(`the game only worked ${work.toFixed(1)} ms; the time went elsewhere (GC, another tab, the browser or OS)`);
|
|
377
|
+
}
|
|
378
|
+
return parts.join("; ");
|
|
379
|
+
}
|
|
380
|
+
/** A frame counts as a hitch (a visibly dropped frame) past this multiple of the budget. */
|
|
381
|
+
export const HITCH = 1.5;
|
|
382
|
+
/**
|
|
383
|
+
* Summarise recent frames into what matters: how much headroom the game has, and whether dropped
|
|
384
|
+
* frames come from the game's own work or from outside it.
|
|
385
|
+
*/
|
|
386
|
+
export function summarize(samples, budgetMs = 1000 / 60) {
|
|
387
|
+
const works = samples.map((s) => s.updateMs + s.renderMs).sort((a, b) => a - b);
|
|
388
|
+
const p95 = works[Math.min(works.length - 1, Math.floor(works.length * 0.95))] ?? 0;
|
|
389
|
+
let hitches = 0;
|
|
390
|
+
let gameHitches = 0;
|
|
391
|
+
let seconds = 0;
|
|
392
|
+
for (const s of samples) {
|
|
393
|
+
seconds += s.intervalMs / 1000;
|
|
394
|
+
if (s.intervalMs <= budgetMs * HITCH)
|
|
395
|
+
continue;
|
|
396
|
+
hitches++;
|
|
397
|
+
if (s.updateMs + s.renderMs > budgetMs * 0.75)
|
|
398
|
+
gameHitches++;
|
|
399
|
+
}
|
|
400
|
+
return {
|
|
401
|
+
frames: samples.length,
|
|
402
|
+
seconds,
|
|
403
|
+
avgWorkMs: works.length ? works.reduce((a, b) => a + b, 0) / works.length : 0,
|
|
404
|
+
p95WorkMs: p95,
|
|
405
|
+
headroom: Math.max(0, 1 - p95 / budgetMs),
|
|
406
|
+
hitches,
|
|
407
|
+
gameHitches,
|
|
408
|
+
outsideHitches: hitches - gameHitches,
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,49 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@debuffjp/dev",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Dev-only inspection hooks for debuff games, for tools and AI agents",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"game",
|
|
7
|
+
"gamedev",
|
|
8
|
+
"game-engine",
|
|
9
|
+
"2d",
|
|
10
|
+
"html5-game",
|
|
11
|
+
"browser-game",
|
|
12
|
+
"debuff",
|
|
13
|
+
"devtools",
|
|
14
|
+
"debugging",
|
|
15
|
+
"testing",
|
|
16
|
+
"replay",
|
|
17
|
+
"ai-agents",
|
|
18
|
+
"agents"
|
|
19
|
+
],
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"homepage": "https://debuff.jp",
|
|
22
|
+
"bugs": "https://github.com/debuffjp/debuff/issues",
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "git+https://github.com/debuffjp/debuff.git",
|
|
26
|
+
"directory": "packages/dev"
|
|
27
|
+
},
|
|
28
|
+
"type": "module",
|
|
29
|
+
"sideEffects": false,
|
|
30
|
+
"main": "./dist/index.js",
|
|
31
|
+
"types": "./dist/index.d.ts",
|
|
32
|
+
"exports": {
|
|
33
|
+
".": {
|
|
34
|
+
"types": "./dist/index.d.ts",
|
|
35
|
+
"default": "./dist/index.js"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"files": [
|
|
39
|
+
"dist",
|
|
40
|
+
"README.md"
|
|
41
|
+
],
|
|
42
|
+
"scripts": {
|
|
43
|
+
"build": "tsc -b"
|
|
44
|
+
},
|
|
45
|
+
"publishConfig": {
|
|
46
|
+
"access": "public",
|
|
47
|
+
"provenance": false
|
|
48
|
+
}
|
|
49
|
+
}
|