@looop-games/cli 0.1.34 → 0.1.35
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/CHANGELOG.md +6 -0
- package/lib/agent-surface.mjs +6 -2
- package/lib/dev.mjs +1 -0
- package/lib/static-server.mjs +6 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -14,6 +14,12 @@ Versions: [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
14
14
|
|
|
15
15
|
## [Unreleased]
|
|
16
16
|
|
|
17
|
+
## [0.1.35] - 2026-09-02
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
|
|
21
|
+
- Reports landing in `.looop/agent-inbox/` are stamped with `engine`, the engine version `looop dev` was serving when the report was made — so a report read later, after an update, still says which engine produced the numbers.
|
|
22
|
+
|
|
17
23
|
## [0.1.34] - 2026-09-02
|
|
18
24
|
|
|
19
25
|
### Fixed
|
package/lib/agent-surface.mjs
CHANGED
|
@@ -69,9 +69,13 @@ const sha = (buf) => createHash('sha256').update(buf).digest('hex');
|
|
|
69
69
|
|
|
70
70
|
// Where each artifact path lands in the game repo. `skills/**` is the whole
|
|
71
71
|
// surface today; AGENTS.md is spliced rather than written whole.
|
|
72
|
+
// Targets are manifest keys, not host paths: forward slashes on every platform,
|
|
73
|
+
// because they are recorded in .looop/agent-surface.json, compared with
|
|
74
|
+
// `startsWith(`${dest}/`)`, and reported to the creator. `join(projectDir, dest)`
|
|
75
|
+
// turns one into a host path wherever the filesystem is touched.
|
|
72
76
|
function target(rel) {
|
|
73
77
|
if (rel === 'AGENTS.md') return 'AGENTS.md';
|
|
74
|
-
if (rel.startsWith('skills/')) return
|
|
78
|
+
if (rel.startsWith('skills/')) return `.claude/${rel}`;
|
|
75
79
|
return null; // unknown surface entry from a newer engine — ignore, don't guess
|
|
76
80
|
}
|
|
77
81
|
|
|
@@ -128,7 +132,7 @@ function contentMatchesRecord(abs, dest, placed) {
|
|
|
128
132
|
if (!entries.length) return true; // an empty folder holds nothing to lose
|
|
129
133
|
return entries.every((e) => {
|
|
130
134
|
const file = join(e.parentPath, e.name);
|
|
131
|
-
const rel =
|
|
135
|
+
const rel = `${dest}/${relative(abs, file).split('\\').join('/')}`;
|
|
132
136
|
return placed[rel] !== undefined && sha(readFileSync(file)) === placed[rel];
|
|
133
137
|
});
|
|
134
138
|
}
|
package/lib/dev.mjs
CHANGED
|
@@ -146,6 +146,7 @@ export async function dev({ cwd = process.cwd(), port, noMp = process.env.NO_MP
|
|
|
146
146
|
slug: project.slug,
|
|
147
147
|
projectDir: project.dir, // answers /__looop/whoami — see ports.mjs
|
|
148
148
|
log, // agent-inbox report lines ride the dev logger
|
|
149
|
+
engineVersion: engine.version ?? null, // stamped on agent-inbox reports
|
|
149
150
|
mounts: [
|
|
150
151
|
{ url: `/games/${project.slug}/`, dir: project.dir },
|
|
151
152
|
{ url: '/shared/', dir: generatedOverridesDir },
|
package/lib/static-server.mjs
CHANGED
|
@@ -113,6 +113,11 @@ export function createStaticServer({
|
|
|
113
113
|
// import map + globalThis.__LOOOP_SKELETON__ so startGame() can boot. Null for
|
|
114
114
|
// a v1 game (no bare `looop` import, no skeleton).
|
|
115
115
|
skeleton = null,
|
|
116
|
+
// The engine version this server serves, stamped onto every agent-inbox
|
|
117
|
+
// file as `engine`. A report is read off disk later against whatever the
|
|
118
|
+
// game is pinned to THEN; the server is the only side that knows what it
|
|
119
|
+
// was when the report was made (the page has no version of its own).
|
|
120
|
+
engineVersion = null,
|
|
116
121
|
}) {
|
|
117
122
|
// The injected skeleton is LIVE, not frozen at startup: a v2 hot-reload
|
|
118
123
|
// rebuilds the room with a fresh skeleton, and `setSkeleton` below pushes that
|
|
@@ -304,6 +309,7 @@ export function createStaticServer({
|
|
|
304
309
|
mkdirSync(inboxDir, { recursive: true });
|
|
305
310
|
const selfIgnore = join(inboxDir, '.gitignore');
|
|
306
311
|
if (!existsSync(selfIgnore)) writeFileSync(selfIgnore, '*\n');
|
|
312
|
+
if (engineVersion) envelope.engine = engineVersion;
|
|
307
313
|
const d = new Date();
|
|
308
314
|
const p = (n, w = 2) => String(n).padStart(w, '0');
|
|
309
315
|
const stamp = `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}-${p(d.getHours())}-${p(d.getMinutes())}-${p(d.getSeconds())}-${p(d.getMilliseconds(), 3)}`;
|