@sharpee/ext-testing 0.9.61-beta
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/LICENSE +21 -0
- package/dist/annotations/context.d.ts +16 -0
- package/dist/annotations/context.d.ts.map +1 -0
- package/dist/annotations/context.js +42 -0
- package/dist/annotations/context.js.map +1 -0
- package/dist/annotations/index.d.ts +6 -0
- package/dist/annotations/index.d.ts.map +1 -0
- package/dist/annotations/index.js +12 -0
- package/dist/annotations/index.js.map +1 -0
- package/dist/annotations/store.d.ts +11 -0
- package/dist/annotations/store.d.ts.map +1 -0
- package/dist/annotations/store.js +191 -0
- package/dist/annotations/store.js.map +1 -0
- package/dist/checkpoints/index.d.ts +3 -0
- package/dist/checkpoints/index.d.ts.map +1 -0
- package/dist/checkpoints/index.js +12 -0
- package/dist/checkpoints/index.js.map +1 -0
- package/dist/checkpoints/serializer.d.ts +21 -0
- package/dist/checkpoints/serializer.d.ts.map +1 -0
- package/dist/checkpoints/serializer.js +95 -0
- package/dist/checkpoints/serializer.js.map +1 -0
- package/dist/checkpoints/store.d.ts +20 -0
- package/dist/checkpoints/store.d.ts.map +1 -0
- package/dist/checkpoints/store.js +193 -0
- package/dist/checkpoints/store.js.map +1 -0
- package/dist/commands/index.d.ts +2 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +8 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/registry.d.ts +28 -0
- package/dist/commands/registry.d.ts.map +1 -0
- package/dist/commands/registry.js +70 -0
- package/dist/commands/registry.js.map +1 -0
- package/dist/context/debug-context.d.ts +21 -0
- package/dist/context/debug-context.d.ts.map +1 -0
- package/dist/context/debug-context.js +172 -0
- package/dist/context/debug-context.js.map +1 -0
- package/dist/context/index.d.ts +2 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +8 -0
- package/dist/context/index.js.map +1 -0
- package/dist/extension.d.ts +78 -0
- package/dist/extension.d.ts.map +1 -0
- package/dist/extension.js +938 -0
- package/dist/extension.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +63 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +375 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist-npm/annotations/context.d.ts +16 -0
- package/dist-npm/annotations/context.d.ts.map +1 -0
- package/dist-npm/annotations/context.js +42 -0
- package/dist-npm/annotations/context.js.map +1 -0
- package/dist-npm/annotations/index.d.ts +6 -0
- package/dist-npm/annotations/index.d.ts.map +1 -0
- package/dist-npm/annotations/index.js +12 -0
- package/dist-npm/annotations/index.js.map +1 -0
- package/dist-npm/annotations/store.d.ts +11 -0
- package/dist-npm/annotations/store.d.ts.map +1 -0
- package/dist-npm/annotations/store.js +191 -0
- package/dist-npm/annotations/store.js.map +1 -0
- package/dist-npm/checkpoints/index.d.ts +3 -0
- package/dist-npm/checkpoints/index.d.ts.map +1 -0
- package/dist-npm/checkpoints/index.js +12 -0
- package/dist-npm/checkpoints/index.js.map +1 -0
- package/dist-npm/checkpoints/serializer.d.ts +21 -0
- package/dist-npm/checkpoints/serializer.d.ts.map +1 -0
- package/dist-npm/checkpoints/serializer.js +95 -0
- package/dist-npm/checkpoints/serializer.js.map +1 -0
- package/dist-npm/checkpoints/store.d.ts +20 -0
- package/dist-npm/checkpoints/store.d.ts.map +1 -0
- package/dist-npm/checkpoints/store.js +193 -0
- package/dist-npm/checkpoints/store.js.map +1 -0
- package/dist-npm/commands/index.d.ts +2 -0
- package/dist-npm/commands/index.d.ts.map +1 -0
- package/dist-npm/commands/index.js +8 -0
- package/dist-npm/commands/index.js.map +1 -0
- package/dist-npm/commands/registry.d.ts +28 -0
- package/dist-npm/commands/registry.d.ts.map +1 -0
- package/dist-npm/commands/registry.js +70 -0
- package/dist-npm/commands/registry.js.map +1 -0
- package/dist-npm/context/debug-context.d.ts +21 -0
- package/dist-npm/context/debug-context.d.ts.map +1 -0
- package/dist-npm/context/debug-context.js +172 -0
- package/dist-npm/context/debug-context.js.map +1 -0
- package/dist-npm/context/index.d.ts +2 -0
- package/dist-npm/context/index.d.ts.map +1 -0
- package/dist-npm/context/index.js +8 -0
- package/dist-npm/context/index.js.map +1 -0
- package/dist-npm/extension.d.ts +78 -0
- package/dist-npm/extension.d.ts.map +1 -0
- package/dist-npm/extension.js +938 -0
- package/dist-npm/extension.js.map +1 -0
- package/dist-npm/index.d.ts +40 -0
- package/dist-npm/index.d.ts.map +1 -0
- package/dist-npm/index.js +63 -0
- package/dist-npm/index.js.map +1 -0
- package/dist-npm/types.d.ts +375 -0
- package/dist-npm/types.d.ts.map +1 -0
- package/dist-npm/types.js +8 -0
- package/dist-npm/types.js.map +1 -0
- package/package.json +42 -0
- package/src/annotations/context.ts +47 -0
- package/src/annotations/index.ts +6 -0
- package/src/annotations/store.ts +219 -0
- package/src/checkpoints/index.ts +2 -0
- package/src/checkpoints/serializer.ts +121 -0
- package/src/checkpoints/store.ts +188 -0
- package/src/commands/index.ts +1 -0
- package/src/commands/registry.ts +81 -0
- package/src/context/debug-context.ts +209 -0
- package/src/context/index.ts +1 -0
- package/src/extension.ts +1089 -0
- package/src/index.ts +69 -0
- package/src/types.ts +469 -0
- package/tsconfig.json +16 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command Registry
|
|
3
|
+
*
|
|
4
|
+
* Central registry for debug and test commands.
|
|
5
|
+
* Commands can be looked up by GDT code or test syntax.
|
|
6
|
+
*/
|
|
7
|
+
import type { CommandRegistry } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Create a new command registry
|
|
10
|
+
*/
|
|
11
|
+
export declare function createCommandRegistry(): CommandRegistry;
|
|
12
|
+
/**
|
|
13
|
+
* Parse a GDT-style command input
|
|
14
|
+
* Format: "CODE arg1 arg2" or just "CODE"
|
|
15
|
+
*/
|
|
16
|
+
export declare function parseGdtInput(input: string): {
|
|
17
|
+
code: string;
|
|
18
|
+
args: string[];
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Parse a test command input
|
|
22
|
+
* Format: "$command arg1 arg2" or just "$command"
|
|
23
|
+
*/
|
|
24
|
+
export declare function parseTestInput(input: string): {
|
|
25
|
+
syntax: string;
|
|
26
|
+
args: string[];
|
|
27
|
+
} | undefined;
|
|
28
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/commands/registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAiC,eAAe,EAAE,MAAM,aAAa,CAAC;AAElF;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,eAAe,CAoCvD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAO7E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,SAAS,CAa5F"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Command Registry
|
|
4
|
+
*
|
|
5
|
+
* Central registry for debug and test commands.
|
|
6
|
+
* Commands can be looked up by GDT code or test syntax.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.createCommandRegistry = createCommandRegistry;
|
|
10
|
+
exports.parseGdtInput = parseGdtInput;
|
|
11
|
+
exports.parseTestInput = parseTestInput;
|
|
12
|
+
/**
|
|
13
|
+
* Create a new command registry
|
|
14
|
+
*/
|
|
15
|
+
function createCommandRegistry() {
|
|
16
|
+
const byCode = new Map();
|
|
17
|
+
const byTestSyntax = new Map();
|
|
18
|
+
const allCommands = [];
|
|
19
|
+
const registry = {
|
|
20
|
+
register(command) {
|
|
21
|
+
// Register by code (uppercase for case-insensitive lookup)
|
|
22
|
+
byCode.set(command.code.toUpperCase(), command);
|
|
23
|
+
// Register by test syntax if provided
|
|
24
|
+
if (command.testSyntax) {
|
|
25
|
+
byTestSyntax.set(command.testSyntax.toLowerCase(), command);
|
|
26
|
+
}
|
|
27
|
+
allCommands.push(command);
|
|
28
|
+
},
|
|
29
|
+
getByCode(code) {
|
|
30
|
+
return byCode.get(code.toUpperCase());
|
|
31
|
+
},
|
|
32
|
+
getByTestSyntax(syntax) {
|
|
33
|
+
return byTestSyntax.get(syntax.toLowerCase());
|
|
34
|
+
},
|
|
35
|
+
getAll() {
|
|
36
|
+
return [...allCommands];
|
|
37
|
+
},
|
|
38
|
+
getByCategory(category) {
|
|
39
|
+
return allCommands.filter((cmd) => cmd.category === category);
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
return registry;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Parse a GDT-style command input
|
|
46
|
+
* Format: "CODE arg1 arg2" or just "CODE"
|
|
47
|
+
*/
|
|
48
|
+
function parseGdtInput(input) {
|
|
49
|
+
const trimmed = input.trim();
|
|
50
|
+
const parts = trimmed.split(/\s+/);
|
|
51
|
+
const code = parts[0] || '';
|
|
52
|
+
const args = parts.slice(1);
|
|
53
|
+
return { code: code.toUpperCase(), args };
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Parse a test command input
|
|
57
|
+
* Format: "$command arg1 arg2" or just "$command"
|
|
58
|
+
*/
|
|
59
|
+
function parseTestInput(input) {
|
|
60
|
+
const trimmed = input.trim();
|
|
61
|
+
if (!trimmed.startsWith('$')) {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
const withoutPrefix = trimmed.slice(1);
|
|
65
|
+
const parts = withoutPrefix.split(/\s+/);
|
|
66
|
+
const syntax = parts[0] || '';
|
|
67
|
+
const args = parts.slice(1);
|
|
68
|
+
return { syntax: syntax.toLowerCase(), args };
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/commands/registry.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAOH,sDAoCC;AAMD,sCAOC;AAMD,wCAaC;AAvED;;GAEG;AACH,SAAgB,qBAAqB;IACnC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC/C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAwB,CAAC;IACrD,MAAM,WAAW,GAAmB,EAAE,CAAC;IAEvC,MAAM,QAAQ,GAAoB;QAChC,QAAQ,CAAC,OAAqB;YAC5B,2DAA2D;YAC3D,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;YAEhD,sCAAsC;YACtC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;YAC9D,CAAC;YAED,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;QAED,SAAS,CAAC,IAAY;YACpB,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACxC,CAAC;QAED,eAAe,CAAC,MAAc;YAC5B,OAAO,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAChD,CAAC;QAED,MAAM;YACJ,OAAO,CAAC,GAAG,WAAW,CAAC,CAAC;QAC1B,CAAC;QAED,aAAa,CAAC,QAAyB;YACrC,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;QAChE,CAAC;KACF,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAgB,aAAa,CAAC,KAAa;IACzC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE5B,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,SAAgB,cAAc,CAAC,KAAa;IAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAE7B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE5B,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Debug Context Implementation
|
|
3
|
+
*
|
|
4
|
+
* Provides a unified context for debug and test commands to interact with the game world.
|
|
5
|
+
* Generalizes the pattern from Dungeo's GDTContext.
|
|
6
|
+
*/
|
|
7
|
+
import type { WorldModel, IFEntity } from '@sharpee/world-model';
|
|
8
|
+
import type { DebugContext } from '../types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Create a debug context for the given world
|
|
11
|
+
*/
|
|
12
|
+
export declare function createDebugContext(world: WorldModel): DebugContext;
|
|
13
|
+
/**
|
|
14
|
+
* Format entity for debug display
|
|
15
|
+
*/
|
|
16
|
+
export declare function formatEntity(entity: IFEntity): string;
|
|
17
|
+
/**
|
|
18
|
+
* Format location chain for an entity
|
|
19
|
+
*/
|
|
20
|
+
export declare function formatLocationChain(entity: IFEntity, world: WorldModel): string;
|
|
21
|
+
//# sourceMappingURL=debug-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-context.d.ts","sourceRoot":"","sources":["../../src/context/debug-context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,CAiKlE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,CAKrD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAkB/E"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Debug Context Implementation
|
|
4
|
+
*
|
|
5
|
+
* Provides a unified context for debug and test commands to interact with the game world.
|
|
6
|
+
* Generalizes the pattern from Dungeo's GDTContext.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.createDebugContext = createDebugContext;
|
|
10
|
+
exports.formatEntity = formatEntity;
|
|
11
|
+
exports.formatLocationChain = formatLocationChain;
|
|
12
|
+
const world_model_1 = require("@sharpee/world-model");
|
|
13
|
+
/**
|
|
14
|
+
* Create a debug context for the given world
|
|
15
|
+
*/
|
|
16
|
+
function createDebugContext(world) {
|
|
17
|
+
// Create AuthorModel for bypassing game rules
|
|
18
|
+
const author = new world_model_1.AuthorModel(world.getDataStore(), world);
|
|
19
|
+
// Debug flags storage
|
|
20
|
+
const flags = new Map();
|
|
21
|
+
// Find player entity
|
|
22
|
+
const player = world.getPlayer();
|
|
23
|
+
if (!player) {
|
|
24
|
+
throw new Error('Cannot create debug context: no player entity found');
|
|
25
|
+
}
|
|
26
|
+
const context = {
|
|
27
|
+
world,
|
|
28
|
+
author,
|
|
29
|
+
player,
|
|
30
|
+
flags,
|
|
31
|
+
// ========================================================================
|
|
32
|
+
// Entity Lookup
|
|
33
|
+
// ========================================================================
|
|
34
|
+
findEntity(idOrName) {
|
|
35
|
+
// Try exact ID match first
|
|
36
|
+
const byId = world.getEntity(idOrName);
|
|
37
|
+
if (byId)
|
|
38
|
+
return byId;
|
|
39
|
+
// Normalize search term: lowercase, convert hyphens to spaces
|
|
40
|
+
const searchLower = idOrName.toLowerCase();
|
|
41
|
+
const searchNormalized = searchLower.replace(/-/g, ' ');
|
|
42
|
+
const allEntities = world.getAllEntities();
|
|
43
|
+
// Exact name match (with normalized search)
|
|
44
|
+
const exactMatch = allEntities.find((e) => e.name?.toLowerCase() === searchNormalized ||
|
|
45
|
+
e.name?.toLowerCase() === searchLower);
|
|
46
|
+
if (exactMatch)
|
|
47
|
+
return exactMatch;
|
|
48
|
+
// Partial name match (with normalized search)
|
|
49
|
+
const partialMatch = allEntities.find((e) => e.name?.toLowerCase().includes(searchNormalized) ||
|
|
50
|
+
e.name?.toLowerCase().includes(searchLower));
|
|
51
|
+
if (partialMatch)
|
|
52
|
+
return partialMatch;
|
|
53
|
+
// ID contains search term
|
|
54
|
+
const idMatch = allEntities.find((e) => e.id.toLowerCase().includes(searchLower));
|
|
55
|
+
return idMatch;
|
|
56
|
+
},
|
|
57
|
+
findRoom(idOrName) {
|
|
58
|
+
const entity = context.findEntity(idOrName);
|
|
59
|
+
if (entity && entity.type === 'room') {
|
|
60
|
+
return entity;
|
|
61
|
+
}
|
|
62
|
+
// Search only rooms
|
|
63
|
+
const searchLower = idOrName.toLowerCase();
|
|
64
|
+
const rooms = world.getAllEntities().filter((e) => e.type === 'room');
|
|
65
|
+
const exactMatch = rooms.find((r) => r.name?.toLowerCase() === searchLower);
|
|
66
|
+
if (exactMatch)
|
|
67
|
+
return exactMatch;
|
|
68
|
+
const partialMatch = rooms.find((r) => r.name?.toLowerCase().includes(searchLower) ||
|
|
69
|
+
r.id.toLowerCase().includes(searchLower));
|
|
70
|
+
return partialMatch;
|
|
71
|
+
},
|
|
72
|
+
findEntities(predicate) {
|
|
73
|
+
return world.getAllEntities().filter(predicate);
|
|
74
|
+
},
|
|
75
|
+
// ========================================================================
|
|
76
|
+
// Location Queries
|
|
77
|
+
// ========================================================================
|
|
78
|
+
getPlayerLocation() {
|
|
79
|
+
const locationId = world.getLocation(player.id);
|
|
80
|
+
if (!locationId)
|
|
81
|
+
return undefined;
|
|
82
|
+
return world.getEntity(locationId);
|
|
83
|
+
},
|
|
84
|
+
getInventory() {
|
|
85
|
+
return world.getContents(player.id);
|
|
86
|
+
},
|
|
87
|
+
getContents(locationId) {
|
|
88
|
+
return world.getContents(locationId);
|
|
89
|
+
},
|
|
90
|
+
// ========================================================================
|
|
91
|
+
// Mutations (bypass game rules via AuthorModel)
|
|
92
|
+
// ========================================================================
|
|
93
|
+
teleportPlayer(roomId) {
|
|
94
|
+
const room = context.findRoom(roomId);
|
|
95
|
+
if (!room)
|
|
96
|
+
return false;
|
|
97
|
+
author.moveEntity(player.id, room.id);
|
|
98
|
+
return true;
|
|
99
|
+
},
|
|
100
|
+
moveObject(objectId, locationId) {
|
|
101
|
+
const object = context.findEntity(objectId);
|
|
102
|
+
const location = context.findEntity(locationId);
|
|
103
|
+
if (!object || !location)
|
|
104
|
+
return false;
|
|
105
|
+
author.moveEntity(object.id, location.id);
|
|
106
|
+
return true;
|
|
107
|
+
},
|
|
108
|
+
takeObject(objectId) {
|
|
109
|
+
const object = context.findEntity(objectId);
|
|
110
|
+
if (!object)
|
|
111
|
+
return false;
|
|
112
|
+
author.moveEntity(object.id, player.id);
|
|
113
|
+
return true;
|
|
114
|
+
},
|
|
115
|
+
removeObject(objectId) {
|
|
116
|
+
const object = context.findEntity(objectId);
|
|
117
|
+
if (!object)
|
|
118
|
+
return false;
|
|
119
|
+
// Move to limbo (null location)
|
|
120
|
+
author.moveEntity(object.id, 'limbo');
|
|
121
|
+
return true;
|
|
122
|
+
},
|
|
123
|
+
spawnObject(objectId, locationId) {
|
|
124
|
+
const object = context.findEntity(objectId);
|
|
125
|
+
const location = context.findEntity(locationId);
|
|
126
|
+
if (!object || !location)
|
|
127
|
+
return false;
|
|
128
|
+
author.moveEntity(object.id, location.id);
|
|
129
|
+
return true;
|
|
130
|
+
},
|
|
131
|
+
// ========================================================================
|
|
132
|
+
// Flag Operations
|
|
133
|
+
// ========================================================================
|
|
134
|
+
setFlag(name, value) {
|
|
135
|
+
flags.set(name, value);
|
|
136
|
+
},
|
|
137
|
+
getFlag(name) {
|
|
138
|
+
return flags.get(name) ?? false;
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
return context;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Format entity for debug display
|
|
145
|
+
*/
|
|
146
|
+
function formatEntity(entity) {
|
|
147
|
+
const traitTypes = entity.traits
|
|
148
|
+
? Array.from(entity.traits.values()).map((t) => t.type.split('.').pop()).join(', ')
|
|
149
|
+
: 'none';
|
|
150
|
+
return `${entity.id} (${entity.name || 'unnamed'}) [${traitTypes}]`;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Format location chain for an entity
|
|
154
|
+
*/
|
|
155
|
+
function formatLocationChain(entity, world) {
|
|
156
|
+
const chain = [entity.id];
|
|
157
|
+
let current = entity;
|
|
158
|
+
let depth = 0;
|
|
159
|
+
while (depth < 10) {
|
|
160
|
+
const locationId = world.getLocation(current.id);
|
|
161
|
+
if (!locationId)
|
|
162
|
+
break;
|
|
163
|
+
chain.push(locationId);
|
|
164
|
+
const location = world.getEntity(locationId);
|
|
165
|
+
if (!location)
|
|
166
|
+
break;
|
|
167
|
+
current = location;
|
|
168
|
+
depth++;
|
|
169
|
+
}
|
|
170
|
+
return chain.join(' -> ');
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=debug-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-context.js","sourceRoot":"","sources":["../../src/context/debug-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatLocationChain = exports.formatEntity = exports.createDebugContext = void 0;
|
|
4
|
+
var debug_context_js_1 = require("./debug-context.js");
|
|
5
|
+
Object.defineProperty(exports, "createDebugContext", { enumerable: true, get: function () { return debug_context_js_1.createDebugContext; } });
|
|
6
|
+
Object.defineProperty(exports, "formatEntity", { enumerable: true, get: function () { return debug_context_js_1.formatEntity; } });
|
|
7
|
+
Object.defineProperty(exports, "formatLocationChain", { enumerable: true, get: function () { return debug_context_js_1.formatLocationChain; } });
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":";;;AAAA,uDAA2F;AAAlF,sHAAA,kBAAkB,OAAA;AAAE,gHAAA,YAAY,OAAA;AAAE,uHAAA,mBAAmB,OAAA"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Testing Extension
|
|
3
|
+
*
|
|
4
|
+
* Main extension class that provides debug and testing capabilities.
|
|
5
|
+
* Implements the ITestingExtension interface.
|
|
6
|
+
*/
|
|
7
|
+
import type { WorldModel } from '@sharpee/world-model';
|
|
8
|
+
import type { TestingExtensionConfig, ITestingExtension, CommandRegistry, CheckpointStore, DebugContext, CommandResult, AnnotationStore, AnnotationType, Annotation } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Testing Extension implementation
|
|
11
|
+
*/
|
|
12
|
+
export declare class TestingExtension implements ITestingExtension {
|
|
13
|
+
readonly config: TestingExtensionConfig;
|
|
14
|
+
readonly commands: CommandRegistry;
|
|
15
|
+
readonly checkpoints: CheckpointStore;
|
|
16
|
+
readonly annotations: AnnotationStore;
|
|
17
|
+
private isDebugModeActive;
|
|
18
|
+
private lastCommand;
|
|
19
|
+
private lastResponse;
|
|
20
|
+
constructor(config?: TestingExtensionConfig);
|
|
21
|
+
/**
|
|
22
|
+
* Register built-in debug commands
|
|
23
|
+
*/
|
|
24
|
+
private registerBuiltInCommands;
|
|
25
|
+
/**
|
|
26
|
+
* Execute a GDT-style command
|
|
27
|
+
*/
|
|
28
|
+
executeGdtCommand(input: string, world: WorldModel): CommandResult;
|
|
29
|
+
/**
|
|
30
|
+
* Execute a test command ($command syntax)
|
|
31
|
+
*/
|
|
32
|
+
executeTestCommand(input: string, world: WorldModel): CommandResult;
|
|
33
|
+
/**
|
|
34
|
+
* Create a debug context for the world
|
|
35
|
+
*/
|
|
36
|
+
createContext(world: WorldModel): DebugContext;
|
|
37
|
+
/**
|
|
38
|
+
* Save a checkpoint
|
|
39
|
+
*/
|
|
40
|
+
saveCheckpoint(name: string, world: WorldModel): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Restore from a checkpoint
|
|
43
|
+
*/
|
|
44
|
+
restoreCheckpoint(name: string, world: WorldModel): Promise<boolean>;
|
|
45
|
+
/**
|
|
46
|
+
* Set context for annotation commands (called by transcript-tester after each command)
|
|
47
|
+
*/
|
|
48
|
+
setCommandContext(command: string, response: string): void;
|
|
49
|
+
/**
|
|
50
|
+
* Add an annotation directly (for # comments from transcript-tester)
|
|
51
|
+
*/
|
|
52
|
+
addAnnotation(type: AnnotationType, text: string, world: WorldModel): Annotation;
|
|
53
|
+
private cmdHelp;
|
|
54
|
+
private cmdTeleport;
|
|
55
|
+
private cmdTake;
|
|
56
|
+
private cmdMove;
|
|
57
|
+
private cmdRemove;
|
|
58
|
+
private cmdDisplayPlayer;
|
|
59
|
+
private cmdDisplayRoom;
|
|
60
|
+
private cmdDisplayObject;
|
|
61
|
+
private cmdListSaves;
|
|
62
|
+
private cmdDescribeEntity;
|
|
63
|
+
private cmdDisplayState;
|
|
64
|
+
private cmdDisplayExits;
|
|
65
|
+
private cmdNoDeaths;
|
|
66
|
+
private cmdRestoreDeaths;
|
|
67
|
+
private cmdKillEntity;
|
|
68
|
+
private cmdExit;
|
|
69
|
+
private cmdBug;
|
|
70
|
+
private cmdNote;
|
|
71
|
+
private cmdConfusing;
|
|
72
|
+
private cmdExpected;
|
|
73
|
+
private cmdBookmark;
|
|
74
|
+
private cmdSession;
|
|
75
|
+
private cmdReview;
|
|
76
|
+
private cmdExport;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=extension.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EACV,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,aAAa,EAEb,eAAe,EACf,cAAc,EACd,UAAU,EACX,MAAM,YAAY,CAAC;AA2BpB;;GAEG;AACH,qBAAa,gBAAiB,YAAW,iBAAiB;IACxD,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;IAEtC,OAAO,CAAC,iBAAiB,CAAkB;IAG3C,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,YAAY,CAAc;gBAEtB,MAAM,GAAE,sBAA2B;IAgC/C;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAuQ/B;;OAEG;IACH,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,aAAa;IAoBlE;;OAEG;IACH,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,aAAa;IAqBnE;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY;IAI9C;;OAEG;IACG,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpE;;OAEG;IACG,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IAU1E;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAK1D;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,UAAU;IAShF,OAAO,CAAC,OAAO;IAoBf,OAAO,CAAC,WAAW;IAwBnB,OAAO,CAAC,OAAO;IAwBf,OAAO,CAAC,OAAO;IA2Bf,OAAO,CAAC,SAAS;IAwBjB,OAAO,CAAC,gBAAgB;IAmBxB,OAAO,CAAC,cAAc;IA0BtB,OAAO,CAAC,gBAAgB;IAkCxB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,iBAAiB;IAqEzB,OAAO,CAAC,eAAe;IA2CvB,OAAO,CAAC,eAAe;IA0DvB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,aAAa;IA0BrB,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,MAAM;IAed,OAAO,CAAC,OAAO;IAef,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,UAAU;IAwClB,OAAO,CAAC,SAAS;IAsDjB,OAAO,CAAC,SAAS;CAQlB"}
|