{"_id":"@1game/cli-1gameplay","_rev":"56-ce46d0f242c050060432c054ca886032","name":"@1game/cli-1gameplay","dist-tags":{"latest":"1.23.0"},"versions":{"1.8.0":{"name":"@1game/cli-1gameplay","version":"1.8.0","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/cli-1gameplay@1.8.0","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"bin":{"1gameplay":"./bin/1gameplay.mjs"},"dist":{"shasum":"ba744706cf798748b0358f729cc2f1c5ae885ce5","tarball":"https://registry.npmjs.org/@1game/cli-1gameplay/-/cli-1gameplay-1.8.0.tgz","fileCount":5,"integrity":"sha512-u6ryTKJgJOf6IqBcii/y1bUnPFUIvPY/lv/IlYdJFnHJExfdNBG8AUTFFIMn7iu32cXMPImKKMGY4L+pWtn9Yg==","signatures":[{"sig":"MEQCICV/TruFRocU2+F/Nw15hGgBYRW0m8KCwik/UCIhtnidAiBxX9svtZ4wgG0CndvPBif34yGX50JHwaYY51hLmXBmfA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":692375},"type":"module","private":false,"scripts":{"test":"pnpm run typecheck && pnpm run test:unit && pnpm run test:e2e","build":"pnpm run clean && pnpm run typecheck && pnpm run build:bundle","clean":"rimraf dist tsconfig.tsbuildinfo","test:e2e":"playwright test -c playwright.config.ts","test:unit":"vitest run -c vitest.unit.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","prepublish":"pnpm run build","test:watch":"vitest","build:bundle":"node ./scripts/bundle.mjs","test:integration":"vitest run -c vitest.config.ts test/**/*.integration.test.ts"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"deprecated":"Withdrawn: versions <=1.10.0 are no longer supported. Please upgrade to >=1.10.1 (current latest is 1.12.0).","description":"1Game gameplay recording CLI","directories":{},"_nodeVersion":"22.14.0","dependencies":{"memfs":"^4.51.1","sql.js":"^1.14.1","solid-js":"^1.9.0","@1game/cli":"1.8.0","playwright":"^1.58.1","better-sqlite3":"^12.6.2","@1game/engine-bundle":"1.8.0","@1game/1gamerecord-player-html":"1.8.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.6.1","esbuild":"^0.25.2","typescript":"^5.9.3","@types/node":"^25.2.1","@1game/protocol":"1.0.0","@1game/solid-dsl":"1.0.0","@playwright/test":"^1.58.1","@1game/1gamerecord":"2.0.0","@1game/render-data":"1.0.0","@vitest/coverage-v8":"^1.6.1","@1game/engine-worker":"1.0.0","@1game/render-engine":"1.0.0","@types/better-sqlite3":"^7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/cli-1gameplay_1.8.0_1783587975421_0.2087039216773705","host":"s3://npm-registry-packages-npm-production"}},"1.9.0":{"name":"@1game/cli-1gameplay","version":"1.9.0","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/cli-1gameplay@1.9.0","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"bin":{"1gameplay":"./bin/1gameplay.mjs"},"dist":{"shasum":"38741b0092de24d22b3ea3979dee787b17981ead","tarball":"https://registry.npmjs.org/@1game/cli-1gameplay/-/cli-1gameplay-1.9.0.tgz","fileCount":128,"integrity":"sha512-zNALuWAUWbnSKgYn5/GWGSVi5o7Q2d9HJ1p+WbK0auy4zaI/5ah+aI4080SvffsQlYZwVr3ckLVHQyvW0UzKXA==","signatures":[{"sig":"MEQCIHo7kFrVQMjO4qebG9khp1GN4tg73pKdgTbax6JN0G5fAiAhvKA/8CRm/pv7W9HN42OgaPwbtHLavIf33sKlu2BwPQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2432788},"main":"./dist/api.mjs","type":"module","types":"./lib/api/index.d.ts","exports":{".":{"types":"./lib/api/index.d.ts","import":"./dist/api.mjs","default":"./dist/api.mjs"},"./package.json":"./package.json"},"private":false,"scripts":{"test":"pnpm run typecheck && pnpm run test:unit && pnpm run test:e2e","build":"pnpm run clean && pnpm run typecheck && pnpm run build:bundle && pnpm run build:dts","clean":"rimraf dist lib tsconfig.tsbuildinfo tsconfig.dts.tsbuildinfo","test:e2e":"playwright test -c playwright.config.ts","build:dts":"tsc -p tsconfig.dts.json","test:unit":"vitest run -c vitest.unit.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","prepublish":"pnpm run build","test:watch":"vitest","build:bundle":"node ./scripts/bundle.mjs","test:integration":"vitest run -c vitest.config.ts test/**/*.integration.test.ts"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"deprecated":"Withdrawn: versions <=1.10.0 are no longer supported. Please upgrade to >=1.10.1 (current latest is 1.12.0).","description":"1Game gameplay recording CLI","directories":{},"_nodeVersion":"22.14.0","dependencies":{"memfs":"^4.51.1","sql.js":"^1.14.1","solid-js":"^1.9.0","@1game/cli":"1.9.0","better-sqlite3":"^12.6.2","@napi-rs/canvas":"^1.0.2","@1game/engine-bundle":"1.9.0","@1game/1gamerecord-player-html":"1.9.0","@fontpkg/source-han-sans-hw-sc":"2.5.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.6.1","esbuild":"^0.25.2","playwright":"^1.58.1","typescript":"^5.9.3","@types/node":"^25.2.1","@1game/protocol":"1.0.0","@1game/solid-dsl":"1.0.0","@playwright/test":"^1.58.1","@1game/1gamerecord":"2.0.0","@1game/render-data":"1.0.0","@vitest/coverage-v8":"^1.6.1","@1game/engine-worker":"1.0.0","@1game/render-engine":"1.0.0","@types/better-sqlite3":"^7.6.13","@1game/resource-runtime":"1.0.0","@1game/render-engine-node-polyfill":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli-1gameplay_1.9.0_1783764834233_0.760276535875978","host":"s3://npm-registry-packages-npm-production"}},"1.9.1":{"name":"@1game/cli-1gameplay","version":"1.9.1","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/cli-1gameplay@1.9.1","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"bin":{"1gameplay":"./bin/1gameplay.mjs"},"dist":{"shasum":"30fc2cc1a88e671dd2b8937684df50c64b32de9f","tarball":"https://registry.npmjs.org/@1game/cli-1gameplay/-/cli-1gameplay-1.9.1.tgz","fileCount":128,"integrity":"sha512-3FU0GWazNWM2H0iX62Hs15A2AK1/jdh3uik7KxZ6PbRsLGXBl3gnVS5fA9C1iQd+fiTEDbxO69zkDgfV97shAQ==","signatures":[{"sig":"MEYCIQDpkZwWeoAdSbb008Ay8lHZLYK8r4zllCzuIFcotKjsRwIhANauMqlHRxiLxWdiUg46YdJigvRNLPohexECgrkvOuDP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2432788},"main":"./dist/api.mjs","type":"module","types":"./lib/api/index.d.ts","exports":{".":{"types":"./lib/api/index.d.ts","import":"./dist/api.mjs","default":"./dist/api.mjs"},"./package.json":"./package.json"},"private":false,"scripts":{"test":"pnpm run typecheck && pnpm run test:unit && pnpm run test:e2e","build":"pnpm run clean && pnpm run typecheck && pnpm run build:bundle && pnpm run build:dts","clean":"rimraf dist lib tsconfig.tsbuildinfo tsconfig.dts.tsbuildinfo","test:e2e":"playwright test -c playwright.config.ts","build:dts":"tsc -p tsconfig.dts.json","test:unit":"vitest run -c vitest.unit.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","prepublish":"pnpm run build","test:watch":"vitest","build:bundle":"node ./scripts/bundle.mjs","test:integration":"vitest run -c vitest.config.ts test/**/*.integration.test.ts"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"deprecated":"Withdrawn: versions <=1.10.0 are no longer supported. Please upgrade to >=1.10.1 (current latest is 1.12.0).","description":"1Game gameplay recording CLI","directories":{},"_nodeVersion":"22.14.0","dependencies":{"memfs":"^4.51.1","sql.js":"^1.14.1","solid-js":"^1.9.0","@1game/cli":"1.9.1","better-sqlite3":"^12.6.2","@napi-rs/canvas":"^1.0.2","@1game/engine-bundle":"1.9.1","@1game/1gamerecord-player-html":"1.9.1","@fontpkg/source-han-sans-hw-sc":"2.5.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.6.1","esbuild":"^0.25.2","playwright":"^1.58.1","typescript":"^5.9.3","@types/node":"^25.2.1","@1game/protocol":"1.0.0","@1game/solid-dsl":"1.0.0","@playwright/test":"^1.58.1","@1game/1gamerecord":"2.0.0","@1game/render-data":"1.0.0","@vitest/coverage-v8":"^1.6.1","@1game/engine-worker":"1.0.0","@1game/render-engine":"1.0.0","@types/better-sqlite3":"^7.6.13","@1game/resource-runtime":"1.0.0","@1game/render-engine-node-polyfill":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli-1gameplay_1.9.1_1783765538635_0.2400635223328309","host":"s3://npm-registry-packages-npm-production"}},"1.10.0":{"name":"@1game/cli-1gameplay","version":"1.10.0","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/cli-1gameplay@1.10.0","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"bin":{"1gameplay":"./bin/1gameplay.mjs"},"dist":{"shasum":"7efc290663ed5e4d64194ab43385da01dd46dc96","tarball":"https://registry.npmjs.org/@1game/cli-1gameplay/-/cli-1gameplay-1.10.0.tgz","fileCount":130,"integrity":"sha512-LrfL5R86uuoVUp8b2ri8smPT77QSJVMqEoNutL+EVZN2G2j4z1a2K1RcYltDQr5pEV1qq/azlqDKgUusXnlM5g==","signatures":[{"sig":"MEUCIQCaPev3SuXQ6GuuzMH4thNtHtamWhP5eqRywXSrgIaf7gIgbWhXGUKilgVFboPmymZoK3ugFkw0ByTWDGec+HIj3yE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3491959},"main":"./dist/api.mjs","type":"module","types":"./lib/api/index.d.ts","exports":{".":{"types":"./lib/api/index.d.ts","import":"./dist/api.mjs","default":"./dist/api.mjs"},"./package.json":"./package.json"},"private":false,"scripts":{"test":"pnpm run typecheck && pnpm run test:unit && pnpm run test:e2e","build":"pnpm run clean && pnpm run typecheck && pnpm run build:bundle && pnpm run build:dts","clean":"rimraf dist lib tsconfig.tsbuildinfo tsconfig.dts.tsbuildinfo","test:e2e":"playwright test -c playwright.config.ts","build:dts":"tsc -p tsconfig.dts.json","test:unit":"vitest run -c vitest.unit.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","prepublish":"pnpm run build","test:watch":"vitest","build:bundle":"node ./scripts/bundle.mjs","test:integration":"vitest run -c vitest.config.ts test/**/*.integration.test.ts"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"deprecated":"Withdrawn: versions <=1.10.0 are no longer supported. Please upgrade to >=1.10.1 (current latest is 1.12.0).","description":"1Game gameplay recording CLI","directories":{},"_nodeVersion":"22.14.0","dependencies":{"memfs":"^4.51.1","sql.js":"^1.14.1","solid-js":"^1.9.0","@1game/cli":"1.10.0","better-sqlite3":"^12.6.2","@napi-rs/canvas":"^1.0.2","@1game/engine-bundle":"1.10.0","@1game/1gamerecord-player-html":"1.10.0","@fontpkg/source-han-sans-hw-sc":"2.5.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.6.1","esbuild":"^0.25.2","playwright":"^1.58.1","typescript":"^5.9.3","@types/node":"^25.2.1","@1game/protocol":"1.0.0","@1game/solid-dsl":"1.0.0","@playwright/test":"^1.58.1","@1game/1gamerecord":"2.0.0","@1game/render-data":"1.0.0","@vitest/coverage-v8":"^1.6.1","@1game/engine-worker":"1.0.0","@1game/render-engine":"1.0.0","@types/better-sqlite3":"^7.6.13","@1game/resource-runtime":"1.0.0","@1game/render-engine-node-polyfill":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli-1gameplay_1.10.0_1784481500458_0.21806490585833993","host":"s3://npm-registry-packages-npm-production"}},"1.10.1":{"name":"@1game/cli-1gameplay","version":"1.10.1","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/cli-1gameplay@1.10.1","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"bin":{"1gameplay":"./bin/1gameplay.mjs"},"dist":{"shasum":"35ad8dbe97a603e6d58744a330017a3bc91cda71","tarball":"https://registry.npmjs.org/@1game/cli-1gameplay/-/cli-1gameplay-1.10.1.tgz","fileCount":130,"integrity":"sha512-SV8Vg+N5K8N0FSvEr6v6G5rOi80XtdC2QUfkaL2KnDdKgYcsUnAQJhSpu9LOmMxL6QD5JatMcxwrSbwa2bKyww==","signatures":[{"sig":"MEUCICKZYR14RJeTOdrz7VNh2eiNCcbH8wNol+EVBqsTyUshAiEA2uf7cpL4cufQ8TUYTSesioaDgJDpmRIJerbDYEUFkIw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3494535},"main":"./dist/api.mjs","type":"module","types":"./lib/api/index.d.ts","exports":{".":{"types":"./lib/api/index.d.ts","import":"./dist/api.mjs","default":"./dist/api.mjs"},"./package.json":"./package.json"},"private":false,"scripts":{"test":"pnpm run typecheck && pnpm run test:unit && pnpm run test:e2e","build":"pnpm run clean && pnpm run typecheck && pnpm run build:bundle && pnpm run build:dts","clean":"rimraf dist lib tsconfig.tsbuildinfo tsconfig.dts.tsbuildinfo","test:e2e":"playwright test -c playwright.config.ts","build:dts":"tsc -p tsconfig.dts.json","test:unit":"vitest run -c vitest.unit.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","prepublish":"pnpm run build","test:watch":"vitest","build:bundle":"node ./scripts/bundle.mjs","test:integration":"vitest run -c vitest.config.ts test/**/*.integration.test.ts"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"1Game gameplay recording CLI","directories":{},"_nodeVersion":"22.14.0","dependencies":{"memfs":"^4.51.1","sql.js":"^1.14.1","solid-js":"^1.9.0","@1game/cli":"1.10.1","better-sqlite3":"^12.6.2","@napi-rs/canvas":"^1.0.2","@1game/engine-bundle":"1.10.1","@1game/1gamerecord-player-html":"1.10.1","@fontpkg/source-han-sans-hw-sc":"2.5.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.6.1","esbuild":"^0.25.2","playwright":"^1.58.1","typescript":"^5.9.3","@types/node":"^25.2.1","@1game/protocol":"1.0.0","@1game/solid-dsl":"1.0.0","@playwright/test":"^1.58.1","@1game/1gamerecord":"2.0.0","@1game/render-data":"1.0.0","@vitest/coverage-v8":"^1.6.1","@1game/engine-worker":"1.0.0","@1game/render-engine":"1.0.0","@types/better-sqlite3":"^7.6.13","@1game/resource-runtime":"1.0.0","@1game/render-engine-node-polyfill":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli-1gameplay_1.10.1_1784653772476_0.8837113127889589","host":"s3://npm-registry-packages-npm-production"}},"1.11.0":{"name":"@1game/cli-1gameplay","version":"1.11.0","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/cli-1gameplay@1.11.0","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"bin":{"1gameplay":"./bin/1gameplay.mjs"},"dist":{"shasum":"ef7e7f1f631d54b70034e4cd2e36dbc2cb59491b","tarball":"https://registry.npmjs.org/@1game/cli-1gameplay/-/cli-1gameplay-1.11.0.tgz","fileCount":134,"integrity":"sha512-DTaS+/Eyfelg0FDB3tfVWy2vEQkUyo+vRMhpPoblTpHs1/FPSjiLrFJdJwLi0lVKe1+JAcE7naMpD7+N5Ipq5Q==","signatures":[{"sig":"MEYCIQC/Ne2FKx0AYDm0a0OALd6rzRnhgSJVd3Nwm2EB1MEbmgIhAIZRXOy3CJs0FINihMFk3uvRZqKueczNVVoHXDVl/rId","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3556246},"main":"./dist/api.mjs","type":"module","types":"./lib/api/index.d.ts","exports":{".":{"types":"./lib/api/index.d.ts","import":"./dist/api.mjs","default":"./dist/api.mjs"},"./package.json":"./package.json"},"private":false,"scripts":{"test":"pnpm run typecheck && pnpm run test:unit && pnpm run test:e2e","build":"pnpm run clean && pnpm run typecheck && pnpm run build:bundle && pnpm run build:dts","clean":"rimraf dist lib tsconfig.tsbuildinfo tsconfig.dts.tsbuildinfo","test:e2e":"playwright test -c playwright.config.ts","build:dts":"tsc -p tsconfig.dts.json","test:unit":"vitest run -c vitest.unit.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","prepublish":"pnpm run build","test:watch":"vitest","build:bundle":"node ./scripts/bundle.mjs","test:integration":"vitest run -c vitest.config.ts test/**/*.integration.test.ts"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"1Game gameplay recording CLI","directories":{},"_nodeVersion":"22.14.0","dependencies":{"memfs":"^4.51.1","sql.js":"^1.14.1","solid-js":"^1.9.0","@1game/cli":"1.11.0","better-sqlite3":"^12.6.2","@napi-rs/canvas":"^1.0.2","@1game/engine-bundle":"1.11.0","@1game/1gamerecord-player-html":"1.11.0","@fontpkg/source-han-sans-hw-sc":"2.5.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.6.1","esbuild":"^0.25.2","playwright":"^1.58.1","typescript":"^5.9.3","@types/node":"^25.2.1","@1game/protocol":"1.0.0","@1game/solid-dsl":"1.0.0","@playwright/test":"^1.58.1","@1game/1gamerecord":"2.0.0","@1game/render-data":"1.0.0","@vitest/coverage-v8":"^1.6.1","@1game/engine-worker":"1.0.0","@1game/render-engine":"1.0.0","@1game/store-history":"1.0.0","@types/better-sqlite3":"^7.6.13","@1game/resource-runtime":"1.0.0","@1game/render-engine-node-polyfill":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli-1gameplay_1.11.0_1784915995175_0.4736292516939382","host":"s3://npm-registry-packages-npm-production"}},"1.12.0":{"name":"@1game/cli-1gameplay","version":"1.12.0","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/cli-1gameplay@1.12.0","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"bin":{"1gameplay":"./bin/1gameplay.mjs"},"dist":{"shasum":"4803040848a5086e94a1fce8ad4bc517b50e9b79","tarball":"https://registry.npmjs.org/@1game/cli-1gameplay/-/cli-1gameplay-1.12.0.tgz","fileCount":134,"integrity":"sha512-U2AmWRJVA9Xcma6G9AmZ1TweoJpPidUWVG3VKmcmi/cvzG1PphKe9ozHOMaocarGUV3iBmAHHUY2g/sgB93WpQ==","signatures":[{"sig":"MEUCIQDRDmJT8tR+aZP4i9Ifvvc38I92Cyev14+VI0e0HWuW8gIgBfcNEvlZriJ4IvR3qswmg6bIknNyTTC0jm03cD2sPwI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3558150},"main":"./dist/api.mjs","type":"module","types":"./lib/api/index.d.ts","exports":{".":{"types":"./lib/api/index.d.ts","import":"./dist/api.mjs","default":"./dist/api.mjs"},"./package.json":"./package.json"},"private":false,"scripts":{"test":"pnpm run typecheck && pnpm run test:unit && pnpm run test:e2e","build":"pnpm run clean && pnpm run typecheck && pnpm run build:bundle && pnpm run build:dts","clean":"rimraf dist lib tsconfig.tsbuildinfo tsconfig.dts.tsbuildinfo","test:e2e":"playwright test -c playwright.config.ts","build:dts":"tsc -p tsconfig.dts.json","test:unit":"vitest run -c vitest.unit.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","prepublish":"pnpm run build","test:watch":"vitest","build:bundle":"node ./scripts/bundle.mjs","test:integration":"vitest run -c vitest.config.ts test/**/*.integration.test.ts"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"1Game gameplay recording CLI","directories":{},"_nodeVersion":"22.14.0","dependencies":{"memfs":"^4.51.1","sql.js":"^1.14.1","solid-js":"^1.9.0","@1game/cli":"1.12.0","better-sqlite3":"^12.6.2","@napi-rs/canvas":"^1.0.2","@1game/engine-bundle":"1.12.0","@1game/1gamerecord-player-html":"1.12.0","@fontpkg/source-han-sans-hw-sc":"2.5.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.6.1","esbuild":"^0.25.2","playwright":"^1.58.1","typescript":"^5.9.3","@types/node":"^25.2.1","@1game/protocol":"1.0.0","@1game/solid-dsl":"1.0.0","@playwright/test":"^1.58.1","@1game/1gamerecord":"2.0.0","@1game/render-data":"1.0.0","@vitest/coverage-v8":"^1.6.1","@1game/engine-worker":"1.0.0","@1game/render-engine":"1.0.0","@1game/store-history":"1.0.0","@types/better-sqlite3":"^7.6.13","@1game/resource-runtime":"1.0.0","@1game/render-engine-node-polyfill":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli-1gameplay_1.12.0_1784992286523_0.681677148698274","host":"s3://npm-registry-packages-npm-production"}},"1.12.1":{"name":"@1game/cli-1gameplay","version":"1.12.1","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/cli-1gameplay@1.12.1","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"bin":{"1gameplay":"./bin/1gameplay.mjs"},"dist":{"shasum":"9e009a1da0e9625f9c7e82597a5310fda6614d2f","tarball":"https://registry.npmjs.org/@1game/cli-1gameplay/-/cli-1gameplay-1.12.1.tgz","fileCount":134,"integrity":"sha512-ORdQRW4tc+5gAA7i5FgV/zfjNda5J1gFHicQJTP2RU1jD8O+ejZf8/dlJmqUgb4R4dIS6x85DvO8w+HC4LeIwQ==","signatures":[{"sig":"MEUCIQCFpY9aytJLM2froWvoE2IOlbgRKkTGX78KuVRu9gyqowIgE+65nTWMZsn65ocnjtUIcjBW37bJDCFmM5A+qQNFJFY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3558150},"main":"./dist/api.mjs","type":"module","types":"./lib/api/index.d.ts","exports":{".":{"types":"./lib/api/index.d.ts","import":"./dist/api.mjs","default":"./dist/api.mjs"},"./package.json":"./package.json"},"private":false,"scripts":{"test":"pnpm run typecheck && pnpm run test:unit && pnpm run test:e2e","build":"pnpm run clean && pnpm run typecheck && pnpm run build:bundle && pnpm run build:dts","clean":"rimraf dist lib tsconfig.tsbuildinfo tsconfig.dts.tsbuildinfo","test:e2e":"playwright test -c playwright.config.ts","build:dts":"tsc -p tsconfig.dts.json","test:unit":"vitest run -c vitest.unit.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","prepublish":"pnpm run build","test:watch":"vitest","build:bundle":"node ./scripts/bundle.mjs","test:integration":"vitest run -c vitest.config.ts test/**/*.integration.test.ts"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"1Game gameplay recording CLI","directories":{},"_nodeVersion":"22.14.0","dependencies":{"memfs":"^4.51.1","sql.js":"^1.14.1","solid-js":"^1.9.0","@1game/cli":"1.12.1","better-sqlite3":"^12.6.2","@napi-rs/canvas":"^1.0.2","@1game/engine-bundle":"1.12.1","@1game/1gamerecord-player-html":"1.12.1","@fontpkg/source-han-sans-hw-sc":"2.5.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.6.1","esbuild":"^0.25.2","playwright":"^1.58.1","typescript":"^5.9.3","@types/node":"^25.2.1","@1game/protocol":"1.0.0","@1game/solid-dsl":"1.0.0","@playwright/test":"^1.58.1","@1game/1gamerecord":"2.0.0","@1game/render-data":"1.0.0","@vitest/coverage-v8":"^1.6.1","@1game/engine-worker":"1.0.0","@1game/render-engine":"1.0.0","@1game/store-history":"1.0.0","@types/better-sqlite3":"^7.6.13","@1game/resource-runtime":"1.0.0","@1game/render-engine-node-polyfill":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli-1gameplay_1.12.1_1785092853025_0.27438034678420853","host":"s3://npm-registry-packages-npm-production"}},"1.13.0":{"name":"@1game/cli-1gameplay","version":"1.13.0","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/cli-1gameplay@1.13.0","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"bin":{"1gameplay":"./bin/1gameplay.mjs"},"dist":{"shasum":"2b8af26db87a929b8fc128a6c9217dcc1ef5d5a2","tarball":"https://registry.npmjs.org/@1game/cli-1gameplay/-/cli-1gameplay-1.13.0.tgz","fileCount":134,"integrity":"sha512-9Hf+c6qlSVl5Y8/LS9PXDZz/1YV+ThJjOu/CCAJVav/S3A5xgqv5E3bo3It+I0O88zlo3ud3VL2CBXqJqySGGA==","signatures":[{"sig":"MEYCIQCNS2lBkjV91Ah5YmDGLoN9yBUuMY6rFXfJaQeiMcTvAwIhAOY+gS8u/48iqcXimRTv7PSfCa8u78NGGwfSh9PYp3X8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3566023},"main":"./dist/api.mjs","type":"module","types":"./lib/api/index.d.ts","exports":{".":{"types":"./lib/api/index.d.ts","import":"./dist/api.mjs","default":"./dist/api.mjs"},"./package.json":"./package.json"},"private":false,"scripts":{"test":"pnpm run typecheck && pnpm run test:unit && pnpm run test:e2e","build":"pnpm run clean && pnpm run typecheck && pnpm run build:bundle && pnpm run build:dts","clean":"rimraf dist lib tsconfig.tsbuildinfo tsconfig.dts.tsbuildinfo","test:e2e":"playwright test -c playwright.config.ts","build:dts":"tsc -p tsconfig.dts.json","test:unit":"vitest run -c vitest.unit.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","prepublish":"pnpm run build","test:watch":"vitest","build:bundle":"node ./scripts/bundle.mjs","test:integration":"vitest run -c vitest.config.ts test/**/*.integration.test.ts"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"1Game gameplay recording CLI","directories":{},"_nodeVersion":"22.14.0","dependencies":{"memfs":"^4.51.1","sql.js":"^1.14.1","solid-js":"^1.9.0","@1game/cli":"1.13.0","better-sqlite3":"^12.6.2","@napi-rs/canvas":"^1.0.2","@1game/engine-bundle":"1.13.0","@1game/1gamerecord-player-html":"1.13.0","@fontpkg/source-han-sans-hw-sc":"2.5.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.6.1","esbuild":"^0.25.2","playwright":"^1.58.1","typescript":"^5.9.3","@types/node":"^25.2.1","@1game/protocol":"1.0.0","@1game/solid-dsl":"1.0.0","@playwright/test":"^1.58.1","@1game/1gamerecord":"2.0.0","@1game/render-data":"1.0.0","@vitest/coverage-v8":"^1.6.1","@1game/engine-worker":"1.0.0","@1game/render-engine":"1.0.0","@1game/store-history":"1.0.0","@types/better-sqlite3":"^7.6.13","@1game/resource-runtime":"1.0.0","@1game/render-engine-node-polyfill":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli-1gameplay_1.13.0_1785158815821_0.7211139696708528","host":"s3://npm-registry-packages-npm-production"}},"1.14.0":{"name":"@1game/cli-1gameplay","version":"1.14.0","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/cli-1gameplay@1.14.0","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"bin":{"1gameplay":"./bin/1gameplay.mjs"},"dist":{"shasum":"aac20c88ad79916eccc5aaeb84621f41404e70d3","tarball":"https://registry.npmjs.org/@1game/cli-1gameplay/-/cli-1gameplay-1.14.0.tgz","fileCount":134,"integrity":"sha512-YNyqHOfeeGHf/5gim4WPIp/7bBB5XcmN86vMKJUcQ1dknD8pFf0vQCay9Y6tFBFpO6UY61tyC7iftQ/fObwDDg==","signatures":[{"sig":"MEYCIQCHXPpCSt4TzlyEgAHUDpvOGFMU9SxAV4GLmCycWZ7ugwIhAJRUeeIsi951CaCtQ6WcHUnqxNZrm4EOYms6qH882JsP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3744202},"main":"./dist/api.mjs","type":"module","types":"./lib/api/index.d.ts","exports":{".":{"types":"./lib/api/index.d.ts","import":"./dist/api.mjs","default":"./dist/api.mjs"},"./package.json":"./package.json"},"private":false,"scripts":{"test":"pnpm run typecheck && pnpm run test:unit && pnpm run test:e2e","build":"pnpm run clean && pnpm run typecheck && pnpm run build:bundle && pnpm run build:dts","clean":"rimraf dist lib tsconfig.tsbuildinfo tsconfig.dts.tsbuildinfo","test:e2e":"playwright test -c playwright.config.ts","build:dts":"tsc -p tsconfig.dts.json","test:unit":"vitest run -c vitest.unit.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","prepublish":"pnpm run build","test:watch":"vitest","build:bundle":"node ./scripts/bundle.mjs","test:integration":"vitest run -c vitest.config.ts test/**/*.integration.test.ts"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"1Game gameplay recording CLI","directories":{},"_nodeVersion":"22.14.0","dependencies":{"memfs":"^4.51.1","sql.js":"^1.14.1","solid-js":"^1.9.0","@1game/cli":"1.14.0","better-sqlite3":"^12.6.2","@napi-rs/canvas":"^1.0.2","@1game/engine-bundle":"1.14.0","@1game/1gamerecord-player-html":"1.14.0","@fontpkg/source-han-sans-hw-sc":"2.5.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.6.1","esbuild":"^0.25.2","playwright":"^1.58.1","typescript":"^5.9.3","@types/node":"^25.2.1","@1game/protocol":"1.0.0","@1game/solid-dsl":"1.0.0","@playwright/test":"^1.58.1","@1game/1gamerecord":"2.0.0","@1game/render-data":"1.0.0","@vitest/coverage-v8":"^1.6.1","@1game/engine-worker":"1.0.0","@1game/render-engine":"1.0.0","@1game/store-history":"1.0.0","@types/better-sqlite3":"^7.6.13","@1game/resource-runtime":"1.0.0","@1game/render-engine-node-polyfill":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli-1gameplay_1.14.0_1785645172712_0.5653390773369436","host":"s3://npm-registry-packages-npm-production"}},"1.14.1":{"name":"@1game/cli-1gameplay","version":"1.14.1","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/cli-1gameplay@1.14.1","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"bin":{"1gameplay":"./bin/1gameplay.mjs"},"dist":{"shasum":"ddf4fe129d05c5ccbf20c22b8c3fecf2a9fad648","tarball":"https://registry.npmjs.org/@1game/cli-1gameplay/-/cli-1gameplay-1.14.1.tgz","fileCount":134,"integrity":"sha512-fFXtC7QOuvQXUjILWvMfQJ7kcdSXobKyEVe/JlWgZe7GG4ljqtPHJ9+ybPa39wYnDPqYaUJ9wHX7im1pBfaL0g==","signatures":[{"sig":"MEUCICPTaelM8aCM7bM8dXLWVVqv/xsYVmFDQn3a/kaPE4EvAiEAnkCPfBAuupPDiwzZgS5/Iz08TJpIqQIPNacXX2b1C1A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3792622},"main":"./dist/api.mjs","type":"module","types":"./lib/api/index.d.ts","exports":{".":{"types":"./lib/api/index.d.ts","import":"./dist/api.mjs","default":"./dist/api.mjs"},"./package.json":"./package.json"},"private":false,"scripts":{"test":"pnpm run typecheck && pnpm run test:unit && pnpm run test:e2e","build":"pnpm run clean && pnpm run typecheck && pnpm run build:bundle && pnpm run build:dts","clean":"rimraf dist lib tsconfig.tsbuildinfo tsconfig.dts.tsbuildinfo","test:e2e":"playwright test -c playwright.config.ts","build:dts":"tsc -p tsconfig.dts.json","test:unit":"vitest run -c vitest.unit.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","prepublish":"pnpm run build","test:watch":"vitest","build:bundle":"node ./scripts/bundle.mjs","test:integration":"vitest run -c vitest.config.ts test/**/*.integration.test.ts"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"1Game gameplay recording CLI","directories":{},"_nodeVersion":"22.14.0","dependencies":{"memfs":"^4.51.1","sql.js":"^1.14.1","solid-js":"^1.9.0","@1game/cli":"1.14.1","better-sqlite3":"^12.6.2","@napi-rs/canvas":"^1.0.2","@1game/engine-bundle":"1.14.1","@1game/1gamerecord-player-html":"1.14.1","@fontpkg/source-han-sans-hw-sc":"2.5.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.6.1","esbuild":"^0.25.2","playwright":"^1.58.1","typescript":"^5.9.3","@types/node":"^25.2.1","@1game/protocol":"1.0.0","@1game/solid-dsl":"1.0.0","@playwright/test":"^1.58.1","@1game/1gamerecord":"2.0.0","@1game/render-data":"1.0.0","@vitest/coverage-v8":"^1.6.1","@1game/engine-worker":"1.0.0","@1game/render-engine":"1.0.0","@1game/store-history":"1.0.0","@types/better-sqlite3":"^7.6.13","@1game/resource-runtime":"1.0.0","@1game/render-engine-node-polyfill":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli-1gameplay_1.14.1_1785691301001_0.276737124492886","host":"s3://npm-registry-packages-npm-production"}},"1.15.0":{"name":"@1game/cli-1gameplay","version":"1.15.0","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/cli-1gameplay@1.15.0","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"bin":{"1gameplay":"./bin/1gameplay.mjs"},"dist":{"shasum":"7725ee59011b2966a12d011f53342e604e0d9468","tarball":"https://registry.npmjs.org/@1game/cli-1gameplay/-/cli-1gameplay-1.15.0.tgz","fileCount":134,"integrity":"sha512-/xJtaKY7+xNrZfxfR2KJy0GntB0EgdN0ifOdnihqzZfz93pbENHsClATqo9WnHjjyeZmoJ7WO0T5yiXUWzkDUg==","signatures":[{"sig":"MEQCIBarWaDt4m1YNCHgt+KbYBRIroC7Lna6xgxSolDc7le6AiB8jP6k3XhkCzx260g3ajJWyex51/kCpvwcNQ3x0GplcA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4385670},"main":"./dist/api.mjs","type":"module","types":"./lib/api/index.d.ts","exports":{".":{"types":"./lib/api/index.d.ts","import":"./dist/api.mjs","default":"./dist/api.mjs"},"./package.json":"./package.json"},"private":false,"scripts":{"test":"pnpm run typecheck && pnpm run test:unit && pnpm run test:e2e","build":"pnpm run clean && pnpm run typecheck && pnpm run build:bundle && pnpm run build:dts","clean":"rimraf dist lib tsconfig.tsbuildinfo tsconfig.dts.tsbuildinfo","test:e2e":"playwright test -c playwright.config.ts","build:dts":"tsc -p tsconfig.dts.json","test:unit":"vitest run -c vitest.unit.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","prepublish":"pnpm run build","test:watch":"vitest","build:bundle":"node ./scripts/bundle.mjs","test:integration":"vitest run -c vitest.config.ts test/**/*.integration.test.ts"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"1Game gameplay recording CLI","directories":{},"_nodeVersion":"22.14.0","dependencies":{"memfs":"^4.51.1","sql.js":"^1.14.1","solid-js":"^1.9.0","@1game/cli":"1.15.0","better-sqlite3":"^12.6.2","@napi-rs/canvas":"^1.0.2","@1game/engine-bundle":"1.15.0","@1game/1gamerecord-player-html":"1.15.0","@fontpkg/source-han-sans-hw-sc":"2.5.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.6.1","esbuild":"^0.25.2","playwright":"^1.58.1","typescript":"^5.9.3","@types/node":"^25.2.1","@1game/protocol":"1.0.0","@1game/solid-dsl":"1.0.0","@playwright/test":"^1.58.1","@1game/1gamerecord":"2.0.0","@1game/render-data":"1.0.0","@vitest/coverage-v8":"^1.6.1","@1game/engine-worker":"1.0.0","@1game/render-engine":"1.0.0","@1game/store-history":"1.0.0","@types/better-sqlite3":"^7.6.13","@1game/resource-runtime":"1.0.0","@1game/render-engine-node-polyfill":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli-1gameplay_1.15.0_1785865788499_0.8241285888173717","host":"s3://npm-registry-packages-npm-production"}},"1.15.1":{"name":"@1game/cli-1gameplay","version":"1.15.1","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/cli-1gameplay@1.15.1","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"bin":{"1gameplay":"./bin/1gameplay.mjs"},"dist":{"shasum":"e84169ef0ece013585a48d9ddd797a4bb65bffe9","tarball":"https://registry.npmjs.org/@1game/cli-1gameplay/-/cli-1gameplay-1.15.1.tgz","fileCount":134,"integrity":"sha512-i8+vNsIHnp/XdSIfSwQVzgcatkLc9REZetudQ/xesk+lDIJreIi7/n2koHRZs4l9XKqbmnjpj/O5FUO1UqM1UA==","signatures":[{"sig":"MEQCICK4ijFNasIa015QaEFmdq75IPzerZrD07vl233ShizxAiBpRjDIuj/gqN5J32pEFuvVw7Acr1boDO8Xb/Pj9wxgvg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4385670},"main":"./dist/api.mjs","type":"module","types":"./lib/api/index.d.ts","exports":{".":{"types":"./lib/api/index.d.ts","import":"./dist/api.mjs","default":"./dist/api.mjs"},"./package.json":"./package.json"},"private":false,"scripts":{"test":"pnpm run typecheck && pnpm run test:unit && pnpm run test:e2e","build":"pnpm run clean && pnpm run typecheck && pnpm run build:bundle && pnpm run build:dts","clean":"rimraf dist lib tsconfig.tsbuildinfo tsconfig.dts.tsbuildinfo","test:e2e":"playwright test -c playwright.config.ts","build:dts":"tsc -p tsconfig.dts.json","test:unit":"vitest run -c vitest.unit.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","prepublish":"pnpm run build","test:watch":"vitest","build:bundle":"node ./scripts/bundle.mjs","test:integration":"vitest run -c vitest.config.ts test/**/*.integration.test.ts"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"1Game gameplay recording CLI","directories":{},"_nodeVersion":"22.14.0","dependencies":{"memfs":"^4.51.1","sql.js":"^1.14.1","solid-js":"^1.9.0","@1game/cli":"1.15.1","better-sqlite3":"^12.6.2","@napi-rs/canvas":"^1.0.2","@1game/engine-bundle":"1.15.1","@1game/1gamerecord-player-html":"1.15.1","@fontpkg/source-han-sans-hw-sc":"2.5.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.6.1","esbuild":"^0.25.2","playwright":"^1.58.1","typescript":"^5.9.3","@types/node":"^25.2.1","@1game/protocol":"1.0.0","@1game/solid-dsl":"1.0.0","@playwright/test":"^1.58.1","@1game/1gamerecord":"2.0.0","@1game/render-data":"1.0.0","@vitest/coverage-v8":"^1.6.1","@1game/engine-worker":"1.0.0","@1game/render-engine":"1.0.0","@1game/store-history":"1.0.0","@types/better-sqlite3":"^7.6.13","@1game/resource-runtime":"1.0.0","@1game/render-engine-node-polyfill":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli-1gameplay_1.15.1_1785866352185_0.717498385100259","host":"s3://npm-registry-packages-npm-production"}},"1.16.0":{"name":"@1game/cli-1gameplay","version":"1.16.0","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/cli-1gameplay@1.16.0","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"bin":{"1gameplay":"./bin/1gameplay.mjs"},"dist":{"shasum":"4625abded298be56d9f4450e93f6fbd2073a06c1","tarball":"https://registry.npmjs.org/@1game/cli-1gameplay/-/cli-1gameplay-1.16.0.tgz","fileCount":134,"integrity":"sha512-J0nZlnXBGyAwvvu8/xxBKfUTrx9sVmNAwSBkOQcOJzIcv6WGi+UdnsG1DT4DfuUhEEe48qyJozeE6VGz+zWsSA==","signatures":[{"sig":"MEUCICkakFISpq08ihTnCXA6FRp3uViO1x/eCeOXhc9bU3xdAiEA+ZbHSXwSXDL0vFYdOdiUv4wfqSdTO3ElmQtY0H/LZqs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4432768},"main":"./dist/api.mjs","type":"module","types":"./lib/api/index.d.ts","exports":{".":{"types":"./lib/api/index.d.ts","import":"./dist/api.mjs","default":"./dist/api.mjs"},"./package.json":"./package.json"},"private":false,"scripts":{"test":"pnpm run typecheck && pnpm run test:unit && pnpm run test:e2e","build":"pnpm run clean && pnpm run typecheck && pnpm run build:bundle && pnpm run build:dts","clean":"rimraf dist lib tsconfig.tsbuildinfo tsconfig.dts.tsbuildinfo","test:e2e":"playwright test -c playwright.config.ts","build:dts":"tsc -p tsconfig.dts.json","test:unit":"vitest run -c vitest.unit.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","prepublish":"pnpm run build","test:watch":"vitest","build:bundle":"node ./scripts/bundle.mjs","test:integration":"vitest run -c vitest.config.ts test/**/*.integration.test.ts"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"1Game gameplay recording CLI","directories":{},"_nodeVersion":"22.14.0","dependencies":{"memfs":"^4.51.1","sql.js":"^1.14.1","solid-js":"^1.9.0","@1game/cli":"1.16.0","better-sqlite3":"^12.6.2","@napi-rs/canvas":"^1.0.2","@1game/engine-bundle":"1.16.0","@1game/1gamerecord-player-html":"1.16.0","@fontpkg/source-han-sans-hw-sc":"2.5.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.6.1","esbuild":"^0.25.2","playwright":"^1.58.1","typescript":"^5.9.3","@types/node":"^25.2.1","@1game/protocol":"1.0.0","@1game/solid-dsl":"1.0.0","@playwright/test":"^1.58.1","@1game/1gamerecord":"2.0.0","@1game/render-data":"1.0.0","@vitest/coverage-v8":"^1.6.1","@1game/engine-worker":"1.0.0","@1game/render-engine":"1.0.0","@1game/store-history":"1.0.0","@types/better-sqlite3":"^7.6.13","@1game/resource-runtime":"1.0.0","@1game/render-engine-node-polyfill":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli-1gameplay_1.16.0_1786025551877_0.25894594926920367","host":"s3://npm-registry-packages-npm-production"}},"1.17.0":{"name":"@1game/cli-1gameplay","version":"1.17.0","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/cli-1gameplay@1.17.0","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"bin":{"1gameplay":"./bin/1gameplay.mjs"},"dist":{"shasum":"1a6667e3506b9ba2f62904addbfb1c22bd7226f1","tarball":"https://registry.npmjs.org/@1game/cli-1gameplay/-/cli-1gameplay-1.17.0.tgz","fileCount":136,"integrity":"sha512-cC/0OO0ZbLujwdenmq0Vr0hjU8Yi26ewjxxu1QqowAWcdsug1iBVqSr6vV/BZ4GRasySkVQODC3dgRhPflO4Rw==","signatures":[{"sig":"MEUCIQDZSOYaqWznWxRuYzYvis12KZQzERpM0Ljwjy2QHRUKRAIgHpUkhnp0ktzP2t/9I4mgpoCOiYtI4NQvpYK9ggmnyj4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4591655},"main":"./dist/api.mjs","type":"module","types":"./lib/api/index.d.ts","exports":{".":{"types":"./lib/api/index.d.ts","import":"./dist/api.mjs","default":"./dist/api.mjs"},"./package.json":"./package.json"},"private":false,"scripts":{"test":"pnpm run typecheck && pnpm run test:unit && pnpm run test:e2e","build":"pnpm run clean && pnpm run typecheck && pnpm run build:bundle && pnpm run build:dts","clean":"rimraf dist lib tsconfig.tsbuildinfo tsconfig.dts.tsbuildinfo","test:e2e":"playwright test -c playwright.config.ts","build:dts":"tsc -p tsconfig.dts.json","test:unit":"vitest run -c vitest.unit.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","prepublish":"pnpm run build","test:watch":"vitest","build:bundle":"node ./scripts/bundle.mjs","test:integration":"vitest run -c vitest.config.ts test/**/*.integration.test.ts"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"1Game gameplay recording CLI","directories":{},"_nodeVersion":"22.14.0","dependencies":{"memfs":"^4.51.1","sql.js":"^1.14.1","solid-js":"^1.9.0","@1game/cli":"1.17.0","better-sqlite3":"^12.6.2","@napi-rs/canvas":"^1.0.2","@1game/engine-bundle":"1.17.0","@1game/1gamerecord-player-html":"1.17.0","@fontpkg/source-han-sans-hw-sc":"2.5.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.6.1","esbuild":"^0.25.2","playwright":"^1.58.1","typescript":"^5.9.3","@types/node":"^25.2.1","@1game/protocol":"1.0.0","@1game/solid-dsl":"1.0.0","@playwright/test":"^1.58.1","@1game/1gamerecord":"2.0.0","@1game/render-data":"1.0.0","@vitest/coverage-v8":"^1.6.1","@1game/engine-worker":"1.0.0","@1game/render-engine":"1.0.0","@1game/store-history":"1.0.0","@types/better-sqlite3":"^7.6.13","@1game/resource-runtime":"1.0.0","@1game/build-vite-preset":"0.0.0","@1game/render-engine-node-polyfill":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli-1gameplay_1.17.0_1786464861689_0.6593358558954239","host":"s3://npm-registry-packages-npm-production"}},"1.17.1":{"name":"@1game/cli-1gameplay","version":"1.17.1","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/cli-1gameplay@1.17.1","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"bin":{"1gameplay":"./bin/1gameplay.mjs"},"dist":{"shasum":"f28286e7fbaa922a41739fcd3961bc8128d6f101","tarball":"https://registry.npmjs.org/@1game/cli-1gameplay/-/cli-1gameplay-1.17.1.tgz","fileCount":136,"integrity":"sha512-RhF0PGP65+hJXESK2y1eGTDXduC+9CTVw59E6Q9CIm0sphhL5bLZVb5qo/K92tAH+rYHcY0h7jiE14gnIf3GaA==","signatures":[{"sig":"MEQCIFfedprOb0wgIPUm3/8TcCR/VFIK01NXmZIBo+1QaaV3AiB0hZb97abzk5Ni46X9pDbiubiY8g7zbXC7jlpmVJPK1A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4591655},"main":"./dist/api.mjs","type":"module","types":"./lib/api/index.d.ts","exports":{".":{"types":"./lib/api/index.d.ts","import":"./dist/api.mjs","default":"./dist/api.mjs"},"./package.json":"./package.json"},"private":false,"scripts":{"test":"pnpm run typecheck && pnpm run test:unit && pnpm run test:e2e","build":"pnpm run clean && pnpm run typecheck && pnpm run build:bundle && pnpm run build:dts","clean":"rimraf dist lib tsconfig.tsbuildinfo tsconfig.dts.tsbuildinfo","test:e2e":"playwright test -c playwright.config.ts","build:dts":"tsc -p tsconfig.dts.json","test:unit":"vitest run -c vitest.unit.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","prepublish":"pnpm run build","test:watch":"vitest","build:bundle":"node ./scripts/bundle.mjs","test:integration":"vitest run -c vitest.config.ts test/**/*.integration.test.ts"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"1Game gameplay recording CLI","directories":{},"_nodeVersion":"22.14.0","dependencies":{"memfs":"^4.51.1","sql.js":"^1.14.1","solid-js":"^1.9.0","@1game/cli":"1.17.1","better-sqlite3":"^12.6.2","@napi-rs/canvas":"^1.0.2","@1game/engine-bundle":"1.17.1","@1game/1gamerecord-player-html":"1.17.1","@fontpkg/source-han-sans-hw-sc":"2.5.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.6.1","esbuild":"^0.25.2","playwright":"^1.58.1","typescript":"^5.9.3","@types/node":"^25.2.1","@1game/protocol":"1.0.0","@1game/solid-dsl":"1.0.0","@playwright/test":"^1.58.1","@1game/1gamerecord":"2.0.0","@1game/render-data":"1.0.0","@vitest/coverage-v8":"^1.6.1","@1game/engine-worker":"1.0.0","@1game/render-engine":"1.0.0","@1game/store-history":"1.0.0","@types/better-sqlite3":"^7.6.13","@1game/resource-runtime":"1.0.0","@1game/build-vite-preset":"0.0.0","@1game/render-engine-node-polyfill":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli-1gameplay_1.17.1_1786465271951_0.6999814656515977","host":"s3://npm-registry-packages-npm-production"}},"1.17.2":{"name":"@1game/cli-1gameplay","version":"1.17.2","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/cli-1gameplay@1.17.2","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"bin":{"1gameplay":"./bin/1gameplay.mjs"},"dist":{"shasum":"8b865bd97785e0328f6b86418b11ffa9c78fe012","tarball":"https://registry.npmjs.org/@1game/cli-1gameplay/-/cli-1gameplay-1.17.2.tgz","fileCount":136,"integrity":"sha512-XkbPFngB5egAyON0/snPmQIQaLHbSS11bVizYbtRw7iwxmsl4TRx9xwp54Obm/BJQs5hr7NZL7v9wIK7k4nCzw==","signatures":[{"sig":"MEUCICULUgsagTpcHRTb3f5I519iF/PrckaYC+dBQRl7+b1ZAiEAwvhRgPKWW/+qDPeV4c5fuHrL6cuU7LMmOoWUL/Q6jDo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4591655},"main":"./dist/api.mjs","type":"module","types":"./lib/api/index.d.ts","exports":{".":{"types":"./lib/api/index.d.ts","import":"./dist/api.mjs","default":"./dist/api.mjs"},"./package.json":"./package.json"},"private":false,"scripts":{"test":"pnpm run typecheck && pnpm run test:unit && pnpm run test:e2e","build":"pnpm run clean && pnpm run typecheck && pnpm run build:bundle && pnpm run build:dts","clean":"rimraf dist lib tsconfig.tsbuildinfo tsconfig.dts.tsbuildinfo","test:e2e":"playwright test -c playwright.config.ts","build:dts":"tsc -p tsconfig.dts.json","test:unit":"vitest run -c vitest.unit.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","prepublish":"pnpm run build","test:watch":"vitest","build:bundle":"node ./scripts/bundle.mjs","test:integration":"vitest run -c vitest.config.ts test/**/*.integration.test.ts"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"1Game gameplay recording CLI","directories":{},"_nodeVersion":"22.14.0","dependencies":{"memfs":"^4.51.1","sql.js":"^1.14.1","solid-js":"^1.9.0","@1game/cli":"1.17.2","better-sqlite3":"^12.6.2","@napi-rs/canvas":"^1.0.2","@1game/engine-bundle":"1.17.2","@1game/1gamerecord-player-html":"1.17.2","@fontpkg/source-han-sans-hw-sc":"2.5.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.6.1","esbuild":"^0.25.2","playwright":"^1.58.1","typescript":"^5.9.3","@types/node":"^25.2.1","@1game/protocol":"1.0.0","@1game/solid-dsl":"1.0.0","@playwright/test":"^1.58.1","@1game/1gamerecord":"2.0.0","@1game/render-data":"1.0.0","@vitest/coverage-v8":"^1.6.1","@1game/engine-worker":"1.0.0","@1game/render-engine":"1.0.0","@1game/store-history":"1.0.0","@types/better-sqlite3":"^7.6.13","@1game/resource-runtime":"1.0.0","@1game/build-vite-preset":"0.0.0","@1game/render-engine-node-polyfill":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli-1gameplay_1.17.2_1786500658352_0.4484447840547854","host":"s3://npm-registry-packages-npm-production"}},"1.18.0":{"name":"@1game/cli-1gameplay","version":"1.18.0","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/cli-1gameplay@1.18.0","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"bin":{"1gameplay":"./bin/1gameplay.mjs"},"dist":{"shasum":"bdb0d98358bfbb490954586b866d914a50698fe6","tarball":"https://registry.npmjs.org/@1game/cli-1gameplay/-/cli-1gameplay-1.18.0.tgz","fileCount":138,"integrity":"sha512-E9BRRw4pe+LOG5XEMjtccFx65IYoZIpGMeu+ug2Rp4yvERfb6oU/B8EigXg5U7hav07HfSIDbxNiztsXR16ukw==","signatures":[{"sig":"MEUCIA8hD6dbwLGbf1U3Eq/roCNtjOaJ3Dxi8dCJ4lfGw+A6AiEAooDcMrxSqtfRNNeRtZf+Oo9HWlly18YmrgXPW2g+JSw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4687302},"main":"./dist/api.mjs","type":"module","types":"./lib/api/index.d.ts","exports":{".":{"types":"./lib/api/index.d.ts","import":"./dist/api.mjs","default":"./dist/api.mjs"},"./package.json":"./package.json"},"private":false,"scripts":{"test":"pnpm run typecheck && pnpm run test:unit && pnpm run test:e2e","build":"pnpm run clean && pnpm run typecheck && pnpm run build:bundle && pnpm run build:dts","clean":"rimraf dist lib tsconfig.tsbuildinfo tsconfig.dts.tsbuildinfo","test:e2e":"playwright test -c playwright.config.ts","build:dts":"tsc -p tsconfig.dts.json","test:unit":"vitest run -c vitest.unit.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","prepublish":"pnpm run build","test:watch":"vitest","build:bundle":"node ./scripts/bundle.mjs","test:integration":"vitest run -c vitest.config.ts test/**/*.integration.test.ts"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"1Game gameplay recording CLI","directories":{},"_nodeVersion":"22.14.0","dependencies":{"memfs":"^4.51.1","sql.js":"^1.14.1","solid-js":"^1.9.0","@1game/cli":"1.18.0","better-sqlite3":"^12.6.2","@napi-rs/canvas":"^1.0.2","@1game/engine-bundle":"1.18.0","@1game/1gamerecord-player-html":"1.18.0","@fontpkg/source-han-sans-hw-sc":"2.5.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.6.1","esbuild":"^0.25.2","playwright":"^1.58.1","typescript":"^5.9.3","@types/node":"^25.2.1","@1game/protocol":"1.0.0","@1game/solid-dsl":"1.0.0","@playwright/test":"^1.58.1","@1game/1gamerecord":"2.0.0","@1game/render-data":"1.0.0","@vitest/coverage-v8":"^1.6.1","@1game/engine-worker":"1.0.0","@1game/render-engine":"1.0.0","@1game/store-history":"1.0.0","@types/better-sqlite3":"^7.6.13","@1game/resource-runtime":"1.0.0","@1game/build-vite-preset":"0.0.0","@1game/render-engine-node-polyfill":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli-1gameplay_1.18.0_1786988116024_0.5913993343536657","host":"s3://npm-registry-packages-npm-production"}},"1.19.0":{"name":"@1game/cli-1gameplay","version":"1.19.0","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/cli-1gameplay@1.19.0","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"bin":{"1gameplay":"./bin/1gameplay.mjs"},"dist":{"shasum":"88ab977660675b1c5d983a7f5cc746ad9ec41479","tarball":"https://registry.npmjs.org/@1game/cli-1gameplay/-/cli-1gameplay-1.19.0.tgz","fileCount":148,"integrity":"sha512-oagPqOJaCi2NC3xWRNLFCRfh/0ip6hJPc3k64tAu2XzfKLHpIvLydMJXMJlI26bi18zWFN6h4zNFi6NW2bZjLA==","signatures":[{"sig":"MEYCIQC8jugDQXEjsm+cNVDGnCGrwJz3hNXtVXlDAeRsa+x0fAIhAM/PcgOLoTTlXfp/yhUrToLNghjW4R2eFckbyKVpJqOj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4751678},"main":"./dist/api.mjs","type":"module","types":"./lib/api/index.d.ts","exports":{".":{"types":"./lib/api/index.d.ts","import":"./dist/api.mjs","default":"./dist/api.mjs"},"./package.json":"./package.json"},"private":false,"scripts":{"test":"pnpm run typecheck && pnpm run test:unit && pnpm run test:e2e","build":"pnpm run clean && pnpm run typecheck && pnpm run build:bundle && pnpm run build:dts","clean":"rimraf dist lib tsconfig.tsbuildinfo tsconfig.dts.tsbuildinfo","test:e2e":"playwright test -c playwright.config.ts","build:dts":"tsc -p tsconfig.dts.json","test:unit":"vitest run -c vitest.unit.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","prepublish":"pnpm run build","test:watch":"vitest","build:bundle":"node ./scripts/bundle.mjs","test:integration":"vitest run -c vitest.config.ts test/**/*.integration.test.ts"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"1Game gameplay recording CLI","directories":{},"_nodeVersion":"22.14.0","dependencies":{"memfs":"^4.51.1","sql.js":"^1.14.1","solid-js":"^1.9.0","@1game/cli":"1.19.0","better-sqlite3":"^12.6.2","@napi-rs/canvas":"^1.0.2","@1game/engine-bundle":"1.19.0","@1game/1gamerecord-player-html":"1.19.0","@fontpkg/source-han-sans-hw-sc":"2.5.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.6.1","esbuild":"^0.25.2","playwright":"^1.58.1","typescript":"^5.9.3","@types/node":"^25.2.1","@1game/protocol":"1.0.0","@playwright/test":"^1.58.1","@1game/1gamerecord":"2.0.0","@1game/render-data":"1.0.0","@vitest/coverage-v8":"^1.6.1","@1game/engine-worker":"1.0.0","@1game/render-engine":"1.0.0","@1game/solid-runtime":"1.0.0","@1game/store-history":"1.0.0","@types/better-sqlite3":"^7.6.13","@1game/resource-runtime":"1.0.0","@1game/build-vite-preset":"0.0.0","@1game/render-engine-node-polyfill":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli-1gameplay_1.19.0_1787246465077_0.11108399275616776","host":"s3://npm-registry-packages-npm-production"}},"1.20.0":{"name":"@1game/cli-1gameplay","version":"1.20.0","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/cli-1gameplay@1.20.0","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"bin":{"1gameplay":"./bin/1gameplay.mjs"},"dist":{"shasum":"9aa55a7618514d0ff662676e1c714aa6578b17a9","tarball":"https://registry.npmjs.org/@1game/cli-1gameplay/-/cli-1gameplay-1.20.0.tgz","fileCount":164,"integrity":"sha512-VndmWZ38+dZgv5WzXvKaggg5vcNgdB0KVpgm2Akf0yCJeE7hnzz0ZfEAgz7+bvfpTl0Z33lAaDTAlPINe5P/Yw==","signatures":[{"sig":"MEUCIQCMP2VU1qbfS/AUWcQ1b3WUXB4GMpw01d/frQdQ9PXjtAIgVvtFF8Rz7z7OaHPXId3H3/z6vSxuPjG0ewGOAfCe7Cs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4876228},"main":"./dist/api.mjs","type":"module","types":"./lib/api/index.d.ts","exports":{".":{"types":"./lib/api/index.d.ts","import":"./dist/api.mjs","default":"./dist/api.mjs"},"./package.json":"./package.json"},"private":false,"scripts":{"test":"pnpm run typecheck && pnpm run test:unit && pnpm run test:e2e","build":"pnpm run clean && pnpm run typecheck && pnpm run build:bundle && pnpm run build:dts","clean":"rimraf dist lib tsconfig.tsbuildinfo tsconfig.dts.tsbuildinfo","test:e2e":"playwright test -c playwright.config.ts","build:dts":"tsc -p tsconfig.dts.json","test:unit":"vitest run -c vitest.unit.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","prepublish":"pnpm run build","test:watch":"vitest","build:bundle":"node ./scripts/bundle.mjs","test:integration":"vitest run -c vitest.config.ts test/**/*.integration.test.ts"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"1Game gameplay recording CLI","directories":{},"_nodeVersion":"22.14.0","dependencies":{"memfs":"^4.51.1","sql.js":"^1.14.1","solid-js":"^1.9.0","@1game/cli":"1.20.0","better-sqlite3":"^12.6.2","@napi-rs/canvas":"^1.0.2","@1game/engine-bundle":"1.20.0","@1game/1gamerecord-player-html":"1.20.0","@fontpkg/source-han-sans-hw-sc":"2.5.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.6.1","esbuild":"^0.25.2","playwright":"^1.58.1","typescript":"^5.9.3","@types/node":"^25.2.1","@1game/protocol":"1.0.0","@playwright/test":"^1.58.1","@1game/1gamerecord":"2.0.0","@1game/render-data":"1.0.0","@vitest/coverage-v8":"^1.6.1","@1game/engine-worker":"1.0.0","@1game/render-engine":"1.0.0","@1game/solid-runtime":"1.0.0","@1game/store-history":"1.0.0","@types/better-sqlite3":"^7.6.13","@1game/resource-runtime":"1.0.0","@1game/build-vite-preset":"0.0.0","@1game/render-engine-node-polyfill":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli-1gameplay_1.20.0_1787844435963_0.02375503734007056","host":"s3://npm-registry-packages-npm-production"}},"1.21.0":{"name":"@1game/cli-1gameplay","version":"1.21.0","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/cli-1gameplay@1.21.0","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"bin":{"1gameplay":"./bin/1gameplay.mjs"},"dist":{"shasum":"a87a684b4c1bb2d7b51d75d39fe5b0e2198707c5","tarball":"https://registry.npmjs.org/@1game/cli-1gameplay/-/cli-1gameplay-1.21.0.tgz","fileCount":166,"integrity":"sha512-401v2yf8zOQXEbAR/4bwQXcWB1v+d3lV6BRvEETtkztd+HiQmWPqahWBE4tSdLeffp/PkBEDZFtG6ENvsx/LpA==","signatures":[{"sig":"MEUCIQD49QaV8mbNat9FnDfp5HDafRvIhRn4paynKBFCCoNklwIgAVWJIKv61a/jVJWNI/c6gPV3uSGeyP9dwG5zdrenl+0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4996999},"main":"./dist/api.mjs","type":"module","types":"./lib/api/index.d.ts","exports":{".":{"types":"./lib/api/index.d.ts","import":"./dist/api.mjs","default":"./dist/api.mjs"},"./package.json":"./package.json"},"private":false,"scripts":{"test":"pnpm run typecheck && pnpm run test:unit && pnpm run test:e2e","build":"pnpm run clean && pnpm run typecheck && pnpm run build:bundle && pnpm run build:dts","clean":"rimraf dist lib tsconfig.tsbuildinfo tsconfig.dts.tsbuildinfo","test:e2e":"playwright test -c playwright.config.ts","build:dts":"tsc -p tsconfig.dts.json","test:unit":"vitest run -c vitest.unit.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","prepublish":"pnpm run build","test:watch":"vitest","build:bundle":"node ./scripts/bundle.mjs","test:integration":"vitest run -c vitest.config.ts test/**/*.integration.test.ts"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"1Game gameplay recording CLI","directories":{},"_nodeVersion":"22.14.0","dependencies":{"memfs":"^4.51.1","sql.js":"^1.14.1","solid-js":"^1.9.0","@1game/cli":"1.21.0","better-sqlite3":"^12.6.2","@napi-rs/canvas":"^1.0.2","@1game/engine-bundle":"1.21.0","@1game/1gamerecord-player-html":"1.21.0","@fontpkg/source-han-sans-hw-sc":"2.5.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.6.1","esbuild":"^0.25.2","playwright":"^1.58.1","typescript":"^5.9.3","@types/node":"^25.2.1","@1game/protocol":"1.0.0","@playwright/test":"^1.58.1","@1game/1gamerecord":"2.0.0","@1game/render-data":"1.0.0","@vitest/coverage-v8":"^1.6.1","@1game/engine-worker":"1.0.0","@1game/render-engine":"1.0.0","@1game/solid-runtime":"1.0.0","@1game/store-history":"1.0.0","@types/better-sqlite3":"^7.6.13","@1game/resource-runtime":"1.0.0","@1game/build-vite-preset":"0.0.0","@1game/render-engine-node-polyfill":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli-1gameplay_1.21.0_1788340351699_0.7702207092083664","host":"s3://npm-registry-packages-npm-production"}},"1.22.0":{"name":"@1game/cli-1gameplay","version":"1.22.0","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/cli-1gameplay@1.22.0","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"bin":{"1gameplay":"./bin/1gameplay.mjs"},"dist":{"shasum":"329f4fc6741cda7f3b45287753c779b00239c5ae","tarball":"https://registry.npmjs.org/@1game/cli-1gameplay/-/cli-1gameplay-1.22.0.tgz","fileCount":190,"integrity":"sha512-WY9jdQodqP4oQdndHafAX0LpCrjbhbF2dCV5AUieZNL09nkGgVnOv6fLeUiDQa0uOVzvGq30OhhDLOAg3re8Qg==","signatures":[{"sig":"MEQCIDydt2wV+QW/svtx03jGPRxnHG3gVlvk6U13sZScVltnAiBJf7nT03JuvoBZ6loXovlKNejzG1lL0RUHd/BjyFsRkA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBAlvbEkJypsTWPcb8O7onmfT98LDbB6KVRV8GEe+F82AiEA9ndXT0g/efvBqZphEntG4yTx9wImTVXQjomeT8CBA/Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5313143},"main":"./dist/api.mjs","type":"module","types":"./lib/api/index.d.ts","exports":{".":{"types":"./lib/api/index.d.ts","import":"./dist/api.mjs","default":"./dist/api.mjs"},"./package.json":"./package.json"},"private":false,"scripts":{"test":"pnpm run typecheck && pnpm run test:unit && pnpm run test:integration && pnpm run test:e2e","build":"pnpm run clean && pnpm run typecheck && pnpm run build:bundle && pnpm run build:dts","clean":"rimraf dist lib tsconfig.tsbuildinfo tsconfig.dts.tsbuildinfo","test:e2e":"playwright test -c playwright.config.ts","build:dts":"tsc -p tsconfig.dts.json","test:unit":"vitest run -c vitest.unit.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","prepublish":"pnpm run build","test:watch":"vitest","build:bundle":"node ./scripts/bundle.mjs","test:integration":"vitest run -c vitest.integration.config.ts"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"1Game gameplay recording CLI","directories":{},"_nodeVersion":"22.14.0","dependencies":{"memfs":"^4.51.1","sql.js":"^1.14.1","solid-js":"^1.9.0","@1game/cli":"1.22.0","better-sqlite3":"^12.6.2","@napi-rs/canvas":"^1.0.2","@1game/engine-bundle":"1.22.0","@1game/1gamerecord-player-html":"1.22.0","@fontpkg/source-han-sans-hw-sc":"2.5.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.6.1","esbuild":"^0.25.2","playwright":"^1.58.1","typescript":"^5.9.3","@types/node":"^25.2.1","@1game/protocol":"1.0.0","@playwright/test":"^1.58.1","@1game/1gamerecord":"2.0.0","@1game/render-data":"1.0.0","@vitest/coverage-v8":"^1.6.1","@1game/engine-worker":"1.0.0","@1game/render-engine":"1.0.0","@1game/solid-runtime":"1.0.0","@1game/store-history":"1.0.0","@types/better-sqlite3":"^7.6.13","@1game/resource-runtime":"1.0.0","@1game/build-vite-preset":"0.0.0","@1game/render-engine-node-polyfill":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli-1gameplay_1.22.0_1789905337933_0.2585189937654009","host":"s3://npm-registry-packages-npm-production"}},"1.22.2":{"name":"@1game/cli-1gameplay","version":"1.22.2","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/cli-1gameplay@1.22.2","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"bin":{"1gameplay":"./bin/1gameplay.mjs"},"dist":{"shasum":"3c14c927dd0663b6d91312159c821228fcd5b980","tarball":"https://registry.npmjs.org/@1game/cli-1gameplay/-/cli-1gameplay-1.22.2.tgz","fileCount":194,"integrity":"sha512-/MjbIy/OK30ykQLX274L4o6ioP/neWh13K/Dz919u+12tko5m7n3T/m63ZxdYhE8Ot+21NC7w/3oA+sYey1hBQ==","signatures":[{"sig":"MEUCIF1wjEJIca1KSbPXpZ1e6cELQ5YhSCZND6pmAhMaO7DmAiEAxh5q95pcejTYPf4WWWklu1Msv0FYOahgw7Pff2/yjo8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIB991I7yWyaghHy2VkJ5A950vrB0ZVq+ZniFBdAhog9MAiAqXvBbMCt7F275KmkMuLi2dswZD9Wak3FPATdUlHOW9w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5337660},"main":"./dist/api.mjs","type":"module","types":"./lib/api/index.d.ts","exports":{".":{"types":"./lib/api/index.d.ts","import":"./dist/api.mjs","default":"./dist/api.mjs"},"./package.json":"./package.json"},"private":false,"scripts":{"test":"pnpm run typecheck && pnpm run test:unit && pnpm run test:integration && pnpm run test:e2e","build":"pnpm run clean && pnpm run typecheck && pnpm run build:bundle && pnpm run build:dts","clean":"rimraf dist lib tsconfig.tsbuildinfo tsconfig.dts.tsbuildinfo","test:e2e":"playwright test -c playwright.config.ts","build:dts":"tsc -p tsconfig.dts.json","test:unit":"vitest run -c vitest.unit.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","prepublish":"pnpm run build","test:watch":"vitest","build:bundle":"node ./scripts/bundle.mjs","test:integration":"vitest run -c vitest.integration.config.ts"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"1Game gameplay recording CLI","directories":{},"_nodeVersion":"22.14.0","dependencies":{"memfs":"^4.51.1","sql.js":"^1.14.1","solid-js":"^1.9.0","@1game/cli":"1.22.2","better-sqlite3":"^12.6.2","@napi-rs/canvas":"^1.0.2","@1game/engine-bundle":"1.22.2","@1game/1gamerecord-player-html":"1.22.2","@fontpkg/source-han-sans-hw-sc":"2.5.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.6.1","esbuild":"^0.25.2","playwright":"^1.58.1","typescript":"^5.9.3","@types/node":"^25.2.1","@1game/protocol":"1.0.0","@playwright/test":"^1.58.1","@1game/1gamerecord":"2.0.0","@1game/render-data":"1.0.0","@vitest/coverage-v8":"^1.6.1","@1game/engine-worker":"1.0.0","@1game/render-engine":"1.0.0","@1game/solid-runtime":"1.0.0","@1game/store-history":"1.0.0","@types/better-sqlite3":"^7.6.13","@1game/resource-runtime":"1.0.0","@1game/build-vite-preset":"0.0.0","@1game/render-engine-node-polyfill":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli-1gameplay_1.22.2_1790026078431_0.1331444552114387","host":"s3://npm-registry-packages-npm-production"}},"1.22.1":{"name":"@1game/cli-1gameplay","version":"1.22.1","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/cli-1gameplay@1.22.1","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"bin":{"1gameplay":"./bin/1gameplay.mjs"},"dist":{"shasum":"8b3b06d00f15d4a456f1377fb92e0e00538422d2","tarball":"https://registry.npmjs.org/@1game/cli-1gameplay/-/cli-1gameplay-1.22.1.tgz","fileCount":194,"integrity":"sha512-/1ycx02OQBAAlh8xUkLcDdLgk8lNnkHgs8hRCVZPC2HPtG98n33FwnKt3M3GZ7pd6+NVBIU6vtyYaHJ6O0jo3w==","signatures":[{"sig":"MEYCIQC7PcBGptlKR99+9jao9nCb5xvG+96U9oUWD9xt7pz3+wIhANF68PwfspZwWff+c/Z1qve7Ka2GbpI1BSE9hpgw2836","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQC7iP51nYipoDuuur6ugXvYgVRdTn74lIPhGzAQhb+RVQIgSFDT0JMJBLnyYzcKqKjlGbLMd3rZO9JxZdIDmQm7R/w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5337660},"main":"./dist/api.mjs","type":"module","types":"./lib/api/index.d.ts","exports":{".":{"types":"./lib/api/index.d.ts","import":"./dist/api.mjs","default":"./dist/api.mjs"},"./package.json":"./package.json"},"private":false,"scripts":{"test":"pnpm run typecheck && pnpm run test:unit && pnpm run test:integration && pnpm run test:e2e","build":"pnpm run clean && pnpm run typecheck && pnpm run build:bundle && pnpm run build:dts","clean":"rimraf dist lib tsconfig.tsbuildinfo tsconfig.dts.tsbuildinfo","test:e2e":"playwright test -c playwright.config.ts","build:dts":"tsc -p tsconfig.dts.json","test:unit":"vitest run -c vitest.unit.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","prepublish":"pnpm run build","test:watch":"vitest","build:bundle":"node ./scripts/bundle.mjs","test:integration":"vitest run -c vitest.integration.config.ts"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"1Game gameplay recording CLI","directories":{},"_nodeVersion":"22.14.0","dependencies":{"memfs":"^4.51.1","sql.js":"^1.14.1","solid-js":"^1.9.0","@1game/cli":"1.22.1","better-sqlite3":"^12.6.2","@napi-rs/canvas":"^1.0.2","@1game/engine-bundle":"1.22.1","@1game/1gamerecord-player-html":"1.22.1","@fontpkg/source-han-sans-hw-sc":"2.5.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.6.1","esbuild":"^0.25.2","playwright":"^1.58.1","typescript":"^5.9.3","@types/node":"^25.2.1","@1game/protocol":"1.0.0","@playwright/test":"^1.58.1","@1game/1gamerecord":"2.0.0","@1game/render-data":"1.0.0","@vitest/coverage-v8":"^1.6.1","@1game/engine-worker":"1.0.0","@1game/render-engine":"1.0.0","@1game/solid-runtime":"1.0.0","@1game/store-history":"1.0.0","@types/better-sqlite3":"^7.6.13","@1game/resource-runtime":"1.0.0","@1game/build-vite-preset":"0.0.0","@1game/render-engine-node-polyfill":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli-1gameplay_1.22.1_1790026203591_0.9005186890657264","host":"s3://npm-registry-packages-npm-production"}},"1.23.0":{"_id":"@1game/cli-1gameplay@1.23.0","bin":{"1gameplay":"./bin/1gameplay.mjs"},"dist":{"shasum":"68d04cdfb02b07605c8927abc56db738b375bc05","tarball":"https://registry.npmjs.org/@1game/cli-1gameplay/-/cli-1gameplay-1.23.0.tgz","fileCount":196,"integrity":"sha512-soL1MyLNkkxKYsLWYLURvMNw/oCKw4ORY7NG8p04WIC+V1ZDKaAPiRzY7Bt7d7J1MdietmHpEgjRgJgr1IFkrg==","signatures":[{"sig":"MEUCICAcJl2NKoMfOzVTyRLXilG9jSKl3ovgXGNSwxQ7xi9ZAiEAleyEUhOFw1I8F0FKOBqKBUi6fxKai7gAIxWAWPCg1aQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIAKdpSglMcU+ySW0lqxhWosGgOMvwFn0QoYIw5fHUaeHAiAbOS4HCKBSd18jT+Xi8tsgWFANd5BhjJZq6BCvW2HLSQ=="}],"unpackedSize":5360799},"main":"./dist/api.mjs","name":"@1game/cli-1gameplay","type":"module","types":"./lib/api/index.d.ts","author":"linlinfaxin@163.com","exports":{".":{"types":"./lib/api/index.d.ts","import":"./dist/api.mjs","default":"./dist/api.mjs"},"./package.json":"./package.json"},"license":"MIT","private":false,"scripts":{"test":"pnpm run typecheck && pnpm run test:unit && pnpm run test:integration && pnpm run test:e2e","build":"pnpm run clean && pnpm run typecheck && pnpm run build:bundle && pnpm run build:dts","clean":"rimraf dist lib tsconfig.tsbuildinfo tsconfig.dts.tsbuildinfo","test:e2e":"playwright test -c playwright.config.ts","build:dts":"tsc -p tsconfig.dts.json","test:unit":"vitest run -c vitest.unit.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","prepublish":"pnpm run build","test:watch":"vitest","build:bundle":"node ./scripts/bundle.mjs","test:integration":"vitest run -c vitest.integration.config.ts"},"version":"1.23.0","_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"1Game gameplay recording CLI","directories":{},"maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"_nodeVersion":"22.14.0","dependencies":{"memfs":"^4.51.1","sql.js":"^1.14.1","solid-js":"^1.9.0","@1game/cli":"1.23.0","better-sqlite3":"^12.6.2","@napi-rs/canvas":"^1.0.2","@1game/engine-bundle":"1.23.0","@1game/1gamerecord-player-html":"1.23.0","@fontpkg/source-han-sans-hw-sc":"2.5.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.6.1","esbuild":"^0.25.2","playwright":"^1.58.1","typescript":"^5.9.3","@types/node":"^25.2.1","@1game/protocol":"1.0.0","@playwright/test":"^1.58.1","@1game/1gamerecord":"2.0.0","@1game/render-data":"1.0.0","@vitest/coverage-v8":"^1.6.1","@1game/engine-worker":"1.0.0","@1game/render-engine":"1.0.0","@1game/solid-runtime":"1.0.0","@1game/store-history":"1.0.0","@types/better-sqlite3":"^7.6.13","@1game/resource-runtime":"1.0.0","@1game/build-vite-preset":"0.0.0","@1game/render-engine-node-polyfill":"1.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cli-1gameplay_1.23.0_1790596775633_0.5000076606403097"}}},"time":{"created":"2026-05-25T15:30:31.778Z","modified":"2026-09-28T11:59:35.978Z","1.0.0":"2026-05-25T15:30:32.043Z","1.0.1":"2026-05-26T10:31:45.592Z","1.1.0":"2026-05-27T14:37:57.071Z","1.2.0":"2026-05-28T06:06:17.011Z","1.2.1":"2026-05-28T13:48:23.895Z","1.3.0":"2026-05-29T14:32:00.230Z","1.4.0":"2026-06-01T10:31:41.655Z","1.4.1":"2026-06-02T18:39:34.337Z","1.5.0":"2026-06-09T09:51:40.730Z","1.6.0":"2026-06-25T18:15:00.686Z","1.7.0":"2026-07-01T14:07:00.418Z","1.7.1":"2026-07-02T09:34:00.239Z","1.7.2":"2026-07-03T12:07:31.526Z","1.7.3":"2026-07-03T15:33:09.995Z","1.7.4":"2026-07-06T14:12:50.704Z","1.8.0":"2026-07-09T09:06:15.670Z","1.9.0":"2026-07-11T10:13:54.391Z","1.9.1":"2026-07-11T10:25:38.788Z","1.10.0":"2026-07-19T17:18:20.666Z","1.10.1":"2026-07-21T17:09:32.697Z","1.11.0":"2026-07-24T17:59:55.415Z","1.12.0":"2026-07-25T15:11:26.757Z","1.12.1":"2026-07-26T19:07:33.177Z","1.13.0":"2026-07-27T13:26:55.995Z","1.14.0":"2026-08-02T04:32:52.847Z","1.14.1":"2026-08-02T17:21:41.229Z","1.15.0":"2026-08-04T17:49:48.697Z","1.15.1":"2026-08-04T17:59:12.371Z","1.16.0":"2026-08-06T14:12:32.061Z","1.17.0":"2026-08-11T16:14:21.878Z","1.17.1":"2026-08-11T16:21:12.144Z","1.17.2":"2026-08-12T02:10:58.570Z","1.18.0":"2026-08-17T17:35:16.247Z","1.19.0":"2026-08-20T17:21:05.307Z","1.20.0":"2026-08-27T15:27:16.145Z","1.21.0":"2026-09-02T09:12:31.881Z","1.22.0":"2026-09-20T11:55:38.057Z","1.22.2":"2026-09-21T21:27:58.536Z","1.22.1":"2026-09-21T21:30:03.691Z","1.23.0":"2026-09-28T11:59:35.791Z"},"author":"linlinfaxin@163.com","license":"MIT","description":"1Game gameplay recording CLI","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"readme":"# @1game/cli-1gameplay（1gameplay）\n\n`@1game/cli-1gameplay` 是 1Game 的无头录制与回放工具包，命令名为 `1gameplay`。\n\n> 日常入口是 `1gameplay` 命令。本包同时导出给 `@1game/test` 使用的 JS API（`addFrameComments` / `listFrameComments` / `bundleReplayHtml` 等）；不承诺其它内部模块路径稳定。\n\n本 README 面向使用者，说明如何构建、如何执行常用命令、以及常见错误处理方式。\n\n## 快速开始\n\n在仓库根目录安装依赖：\n\n- `pnpm install`\n\n构建 CLI 包：\n\n- `pnpm run build`（工作目录：`packages-public/cli-1gameplay`）\n\n查看帮助：\n\n- `node ./bin/1gameplay.mjs --help`（工作目录：`packages-public/cli-1gameplay`）\n\n> 说明：命令入口位于 `bin/1gameplay.mjs`，会调用 `dist/cli.mjs` 导出的 `runCli`。\n\n## 归档格式说明（v2）\n\n- **唯一形态**：单个 SQLite 文件，扩展名为 `.1gamerecord`（例如 `out/demo.1gamerecord`）。\n- **存储**：符合 [SQLite Archive (sqlar)](https://www.sqlite.org/sqlar.html) 的 `sqlar` 表存放 `bundle/game.worker.js` 与 `bundle/worker-bootstrap.js`；结构化表 `record_meta`、`frames`（DAG）、`record_branches`（refs）、`events`、`store_rows`、`kv_store` / `kv_store_journal`、`runtime_logs`（可选，`step --capture-console` 采集的 console 调试元数据）、`runtime_perf`（可选，`step --perf summary` 写一行 `1gameplay.perf.summary/1`；`frames|trace` 写逐帧 `1gameplay.perf.frame/1`）等存放录制与元数据（不再使用目录 + ndjson 主存储）。Schema 版本见 `GAMEPLAY_SCHEMA_VERSION`。\n- **破坏性变更**：v2 **不再**支持旧「目录归档」；传入目录会得到 `CLI_BAD_ARGS`（见错误提示）。不提供自动迁移命令。\n- `frame query|diff|batch` 使用 **frame protocol**：stdout 固定为 JSON envelope（成功 `1gameplay.frame`，失败 `1gameplay.error`），并按错误类型映射退出码（见下文）。`frame screenshot` 成功为 `1gameplay.screenshot.v1`；`frame paint` 成功为 `1gameplay.paint.snapshot/1`。\n\n与 `1game init` 默认约定的配合：`1game init` 生成的项目将构建输出目录设为 `out/`，并在 `.gitignore` 中忽略 `out/`、`*.1gamerecord` 与 `*.1gamerecord.swp`。下文示例将录制文件与回放 HTML 也放在 `out/` 下，便于与浏览器构建产物一起被忽略、避免误提交。\n\n## `--dry-run` / `.swp` 试跑会话\n\n用途：在不改主档的前提下做完整 `step` 试跑（可多帧追加）；其它命令加 `--dry-run` 时读写 sidecar `<archive>.swp`。\n\n规则：\n\n- 无 `--dry-run` → 只碰主档；主档读取不受 `.swp` 影响\n- 有 `--dry-run` → 只碰 `.swp`\n- **仅** `step --dry-run` 会在 `.swp` 缺失时从主档复制创建；其它命令要求 `.swp` 已存在\n- 存在 `.swp` 时，无 `--dry-run` 的主档**写入**硬失败（含 `create --out` 同一路径；`create` 本身不支持 `--dry-run`）\n- 不提供 commit/abort 子命令：采纳 `mv <archive>.swp <archive>`，丢弃 `rm <archive>.swp`\n\n`step --dry-run` 会把真实 step 提交进 sidecar（可 `--from-frame` 截断暂存时间线），不是进程内假 tick。观察用 `frame query --dry-run` / `frame paint --dry-run`。\n\n示例：\n\n```bash\n1gameplay step out/demo.1gamerecord --dry-run --ms 16 --event '...'\n1gameplay frame query out/demo.1gamerecord --dry-run --at last --select store:state\n1gameplay step out/demo.1gamerecord --dry-run --ms 16 --repeat 2\n1gameplay step out/demo.1gamerecord --ms 16   # 有 .swp 时失败\nmv out/demo.1gamerecord.swp out/demo.1gamerecord\n```\n\n## 命令总览\n\n```text\n1gameplay create --entry <path> --out <file.1gamerecord>\n1gameplay branch create <file.1gamerecord> [--dry-run] --name <语义化分支名> [--at <seq|last>] [--from-branch <id>]\n1gameplay branch list <file.1gamerecord> [--dry-run]\n1gameplay branch checkout <file.1gamerecord> [--dry-run] (--branch <id> | --name <label>)\n1gameplay step <file.1gamerecord> [--dry-run] [--ms <n>=100] [--repeat <n>] [--until <pred>] [--until-not] [--until-ms <n>] [--event <json>] [--event-file <path>] [--from-frame <seq>] [--branch <id>] [--perf off|summary|frames|trace] [--perf-max-frames <n>] [--surface record|display] [--flush] [--capture-console off|error|warn|info|log|debug|all] [--console-max-per-step <n>] [--console-max-bytes <n>]\n1gameplay obs report <file.1gamerecord> [--profile lab.worker|lab.display|lab.paint|device.budget] [--at last|spike|<seq>] [--out report.json]\n1gameplay comments add <file.1gamerecord> [--dry-run] --at <seq|last> --body <text> [--author-id <id>] [--anchor-json <json>] [--comment-id <id>]\n1gameplay frames list <file.1gamerecord> [--dry-run] [--from <n>=0] [--to <n>=0]\n1gameplay frame query <file.1gamerecord> [--dry-run] --at <seq|last> --select <expr>... [--payload summary|full]\n1gameplay frame diff <file.1gamerecord> [--dry-run] --from <seq> --to <seq|last> --select <expr>... [--payload summary|full]\n1gameplay frame batch <file.1gamerecord> [--dry-run] --plan-file <path> [--payload summary|full]\n1gameplay frame screenshot <file.1gamerecord> [--dry-run] --at <seq|last> --out <file.png|jpg> [--scene-stable-uid <stableUid>] [--width <n>] [--height <n>] [--dpr <n>] [--format png|jpeg] [--quality <1-100>]\n1gameplay frame paint <file.1gamerecord> [--dry-run] --at <seq|last> [--scene-stable-uid <stableUid>] [--width <n>] [--height <n>] [--dpr <n>] [--top <0-20>]\n1gameplay bundle-player-html <file.1gamerecord> [--dry-run] --out <replay.html> [--title <s>] [--single-html|--multi-file]\n1gameplay frames delete <file.1gamerecord> [--dry-run] (--after <seq|last> | --last <n>)\n1gameplay record extract <file.1gamerecord> [--dry-run] --out <file.1gamerecord> (--from-seq <n> --to-seq <n> | --from-ms <n> --to-ms <n>) [--merge-diff [n]] [--branch-meta]\n```\n\n`bundle-player-html` 默认单文件会把归档 **gzip 后再 base64** 写入 `recordBase64`（并带 `recordEncoding: \"gzip\"`）。\n\n## 使用说明\n\n### 1) 创建归档：`create`\n\n用途：通过 `1game build --target worker --with-record` 将入口构建成 `game.worker.js`（仅用户代码 + virtual solid re-export shim；`@1game/engine-bundle/runtime/*` 通过 externalization 在运行时按 `./engine/*.mjs` 或 CDN URL 加载，详见 `docs/engine-cdn-resolution.md`），并初始化 `.1gamerecord` 文件（`record_meta.bundleFormat` 恒为 `buildjs-worker`，bundle 写入 `sqlar`）。本地模式下引擎运行时文件被同步捕获到 `bundle/engine/*`；CDN 模式（`ONEGAME_ENGINE_CDN_BASE`）下仅 `game.worker.js` 入档（`engineExternal.files` 仍记录引用的 runtime basename），Node 无头运行时优先用版本严格匹配的本地 `@1game/engine-bundle`，否则再从 CDN 拉取。\n\n> **录制运行时**：归档内的 `game.worker.js` 必须包含 `@1game/engine-bundle/runtime/record`（sql.js / 回放 RPC）导入。`create` 会自动传入 `--with-record`。后续 `step` / `frame` / `bundle-player-html` / `@1game/test openGame` 都依赖该 worker；手工 `1game build` 的纯游玩包默认不含 record，不能直接拿去当归档 worker。\n\n示例：\n\n- `1gameplay create --entry src/game.tsx --out out/demo.1gamerecord`\n\n`create` 成功输出会附带 `sceneStableUids`（当前所有 scene 的 `stableUid`）。单 scene 时后续 `--click` / `hit:point=x,y` / `--event` **可省略** uid；多个 scene 正在渲染时省略会失败，须复制 uid 或传 `--scene-stable-uid`。\n\n关键参数：\n\n- `--entry`：游戏入口文件路径（必填）\n- `--out`：输出 `.1gamerecord` 文件路径（必填）。若同路径已有 `<archive>.swp`，创建会失败（先 `mv`/`rm` 暂存）。\n\n成功输出：stdout 一行 JSON，包含 `ok`、`archivePath`、`frameCount`，以及 `bundle.sha256`。\n\n**构建缓存**：`create` 的 `1game build --target worker --with-record` 产物（`game.worker.js` + `engine/*`）按**构建输入**（entry / 项目源码内容哈希 / `1game.config.ts` / `@1game/cli` 与 `@1game/engine-bundle` 版本 / 工作区依赖 `lib`·`dist` 产物 / 影响构建的 `ONEGAME_*` 环境变量）缓存在项目 `node_modules/.cache/1gameplay-build/`（条目数上限，超出淘汰最旧）。输入不变时直接复用，源码一变即失效重建。因为 Tier-1 混淆是随机的，缓存必须按输入而不是产物寻址；命中时 `bundle.sha256` 会与上次一致（同一份输入的 sha256 从此稳定，不再每次随机）。设 `ONEGAME_BUILD_CACHE=0`（或 `false` / `off`）可完全关闭读写。构建期间若有人改写源码（并发用例 / watcher / 编辑器自动保存），该次产物照常返回给调用方，但**不会**落盘——写入前会重新指纹一遍输入，任何变化（包括内容改回原样但 mtime 变了）都放弃写入，避免留下\"键与字节不符\"的条目。实现见 `src/util/build-worker-cache.ts`。\n\n### 创建分支：`branch create`\n\n在指定帧 fork 一条新 ref（不复制帧）。**必须** `--name` 语义化分支名（不可与已有 label 重复，也不能写成生成 `branchId`）。省略 `--at` 时在父分支 HEAD fork；`--from-branch` 默认档案 `activeBranchId`。成功后该新 ref 成为 active，后续 `step` 在其上 append。\n\n- `1gameplay branch create out/demo.1gamerecord --name 探活岔路`\n- `1gameplay branch create out/demo.1gamerecord --name 探活岔路 --at 12 --from-branch main`\n\n### 列出 / 切换 / 修复活动分支：`branch list` / `branch checkout` / `branch repair-checkout`\n\n只读列出全部分支，或只改活动指针（不碰 `frames` / store）。日常调试保持单分支，不必调用。\n\n- `1gameplay branch list out/demo.1gamerecord`\n- `1gameplay branch checkout out/demo.1gamerecord --branch <branch_id>`\n- `1gameplay branch checkout out/demo.1gamerecord --name 岔路`\n- `1gameplay branch repair-checkout out/demo.1gamerecord` — 把磁盘 `activeBranchId` / `activeFrameId` / `statePointer` 写成读路径 `resolvePlayhead` 的结果（途中 playhead 保留；`statePointer` 仍是活动 ref HEAD）\n\n`branch create` / `branch checkout` 的信封带 `result.checkout`（`activeBranchId` / playhead `activeFrameId` / 描述 HEAD 的 `statePointer`，与 `step` 的 `meta.checkout` 同一组字段）。`--name` 与 `branch create --name` 共用一套 label 归一化（trim + 折叠连续空格），创建时敲的原文一定查得到。\n\n每条分支含 `branchId`、`label`、`headFrameId`、路径深度 `frameCount`、`isActive`（磁盘 checkout 精确命中该行）、`isResolvedActive`（读路径 soft-repair 结果）。信封另有 `result.checkout`（`diskActiveBranchId` / `resolvedBranchId` / `needsRepair` / `mustRepair` / `reasons`）。`needsRepair` 为真当 checkout id 坏了、磁盘 `activeFrameId` 不在活动 ref 上（每次打开都会把 playhead 搬到 HEAD），或磁盘 `statePointer` 不等于活动 ref HEAD（与 `step` 同一组字段）。该不该先跑 `branch repair-checkout` 看 `reasons[].severity`：`must-repair` 必须先修，`self-healing`（例如只是 `statePointer` 过期）的下一次 `step` 会自己写对，不会 hard-fail。后续 `--at last` / `step` append 都走当前活动路径。\n\n`branch list` 与 `branch repair-checkout` 在坏 checkout 上照旧能跑（读路径 soft-repair 到 `resolvedBranchId`），`activeBranchId` 不是合法 JSON 时也一样，`reasons[].code` 给的是 `active_branch_unparseable`。其余写命令与需要开 host 的读命令（`step` / `branch create` / `branch delete` / `frames delete` / `frame screenshot` / `frame query` / `frame paint`）会报 `CHECKOUT_BROKEN`（退出码 `2`），`details.kind` 就是 `reasons[].code` 里 `active_branch_*` 那三个——含 `activeBranchId` 不是合法 JSON：host 读 KV 不能把解析失败收成「没有 checkout」再画出回退 ref 的帧。`branch delete` 会回收帧且不可逆，所以它也在这道闸门后面：先修 checkout 再删。`comments add` 同样在闸门后面——它按 `frame_id` 写，坐标却是读路径 soft-repair 出来的，不拦就等于把评论挂到回退的那条 ref 上。\n\n### 删除分支：`branch delete`\n\n摘掉一条 ref，并回收**只有它能到达**的帧（连同这些帧的 store / KV / 事件 / 评论 / 输入快照行）；与兄弟 ref 共享的 fork 前缀保留。不可逆。\n\n- `1gameplay branch delete out/demo.1gamerecord --name 岔路 --plan-only` — 只在事务里算回收量再回滚，不改文件\n- `1gameplay branch delete out/demo.1gamerecord --branch <branch_id>`\n\n`--branch` 与 `--name` 互斥，`--name` 与 `branch create --name` 共用同一套 label 归一化。拒绝的四种情形：`main`（按 `branch_id` 身份判断，不按拼写——自建的、label 恰好叫 `main` 的 ref 可以删）、档里只剩一条 ref、当前 checkout 的 ref（先 `branch checkout` 到别处）、以及 `--keep-frames` 下该 ref 还有独占帧。回执的 `reparentedBranchIds` 是改指到父级的子 ref，`playheadRepaired` 表示 playhead 原本落在被回收的帧上、已被拉回活动 HEAD。\n\n`--dry-run` / `--plan-only` / `--keep-frames` 只接受布尔开关，参数名也必须是上面这几个：`--plan-only=yes` 和 `--plan-onlyy` 都报错退出，不会被当成「没传」然后真删。失败信封的 `details.kind` 给出成因（`unknown_ref` / `ambiguous_label` / `root_ref` / `only_ref` / `ref_checked_out` / `exclusive_frames`），参数类错误给 `details.param`——不要去匹配提示文案。\n\n### 2) 继续步进：`step`\n\n用途：在已有 `.1gamerecord` 上继续执行逻辑帧，可注入事件。\n\n示例：\n\n- `1gameplay step out/demo.1gamerecord --ms 16.666`\n- `1gameplay step out/demo.1gamerecord`（不传 `--ms` 时默认 `100`）\n- `1gameplay step out/demo.1gamerecord --ms 16 --repeat 10`\n- `1gameplay step out/demo.1gamerecord --ms 16 --until store:state:anim.phase=idle --until-ms 800`\n- `1gameplay step out/demo.1gamerecord --click 100,100`\n- `1gameplay step out/demo.1gamerecord --ms 16 --event '{\"type\":\"hover\",\"sceneStableUid\":\"<sceneStableUid>\",\"data\":{\"id\":1,\"x\":1,\"y\":2,\"time\":0,\"domClientX\":1,\"domClientY\":2}}'`\n- `1gameplay step out/demo.1gamerecord --event '{\"type\":\"click\",\"sceneStableUid\":\"<sceneStableUid>\",\"data\":{\"x\":100,\"y\":100,\"ms\":200}}'`\n- `1gameplay step out/demo.1gamerecord --event '{\"type\":\"swipe\",\"sceneStableUid\":\"<sceneStableUid>\",\"data\":{\"from\":{\"x\":144,\"y\":220},\"to\":{\"x\":144,\"y\":170},\"ms\":300}}'`\n- `1gameplay step out/demo.1gamerecord --event '{\"type\":\"keypress\",\"sceneStableUid\":\"<sceneStableUid>\",\"data\":{\"code\":\"ArrowLeft\",\"ms\":180}}'`\n- `1gameplay step out/demo.1gamerecord --ms 16 --event '{\"type\":\"pointer.down\",\"sceneStableUid\":\"<sceneStableUid>\",\"data\":{\"id\":1,\"x\":100,\"y\":100}}'`\n- `1gameplay step out/demo.1gamerecord --ms 16 --event '{\"type\":\"pointer.move\",\"sceneStableUid\":\"<sceneStableUid>\",\"data\":{\"id\":1,\"x\":116,\"y\":100}}'`\n- `1gameplay step out/demo.1gamerecord --ms 16 --event '{\"type\":\"pointer.up\",\"sceneStableUid\":\"<sceneStableUid>\",\"data\":{\"id\":1,\"x\":116,\"y\":100}}'`\n- `1gameplay step out/demo.1gamerecord --ms 16 --event-file ./events.json`\n- `1gameplay step out/demo.1gamerecord --ms 16 --from-frame 240`\n- `1gameplay step out/demo.1gamerecord --ms 16 --repeat 60 --perf summary`\n- `1gameplay step out/demo.1gamerecord --ms 16 --repeat 10 --perf frames`\n- `1gameplay step out/demo.1gamerecord --dry-run --ms 16 --repeat 2`\n\n关键参数：\n\n- `--dry-run`：可选，写入 `<archive>.swp`（不存在则从主档复制创建）；有 `.swp` 时无旗标写主档会失败（见上文「`--dry-run` / `.swp`」）\n- `--ms`：每步毫秒数，需 `>= 0`（可选，默认 `100`）；注入 `click`/`swipe`/`keypress` 动作宏时该参数不生效（见下文）。**`--until` 模式必须显式传入且 `> 0`**\n- `--repeat`：开环步进次数，默认 `1`；**不能与 `--until` 同时使用**\n- `--until`：谓词停机（`store:state:<dotted-path>=<scalar>` 或完整 `hit:point=` / `hit:sceneStableUid=:uid=`）。每空 tick 后求值，真则停。`--until-not` 取反。与 `--repeat` 互斥。\n- `--until-ms`：until 空 tick 的仿真时间上限（累计 `--ms`，不含动作宏微帧）。until 模式必填且 `> 0`。hit until 需要 `--surface display`。\n- `--click`：`x,y` 点击动作宏糖（`data.ms` 默认 200；不能与 `--event` / `--event-file` 同时出现）。负坐标用 `--click -10,20` 或 `--click=-10,20`。\n- `--scene-stable-uid`：只给**省略了** `sceneStableUid` 的注入事件填 uid（须为当前帧真实 scene uid）；已写在 JSON 上的 uid 不改写；未省略时不校验该旗标。\n- `--event`：单个事件 JSON 字符串\n- `--event-file`：事件文件路径（单个对象或数组）\n- 省略 `sceneStableUid` 时（`--click` 与 `--event` 都适用）仅当当前帧恰好一个 scene 才填充。多 scene 必须显式 uid 或 `--scene-stable-uid`。stdout `meta.invokeSummary.eventSceneStableUids` / `defaultSceneStableUid` 带回实际 stamp。\n- 事件类型支持 runtime 事件 `touch|hover|keyboard|wheel|visibleChange`；另支持瞬时宏事件 `keydown|keyup|pointer.down|pointer.move|pointer.up`（CLI 会按统一 InputSnapshot 差分展开；键盘与触摸均支持跨 `step` / `from-frame` 恢复），以及跨多帧的动作宏 `click|swipe|keypress`（见下文）\n- `--from-frame`：从指定帧裁剪后续再继续执行（只删当前分支独占的后缀；其它 ref 占用该后缀则失败）\n- `--branch`：在该 `record_branches` ref 上 **append**（不 fork；缺省 `activeBranchId` 或 `main`）。checkout 写入与 truncate/append 同一事务。`--until` 已满足或谓词即刻失败且 **没有** `--from-frame` 时不落盘、活动指针不变；`--from-frame` 纯截断（until 已满足、0 新帧）会翻指针；until 超时但已产出新帧时仍 commit（含 checkout）再报 `STEP_UNTIL_NOT_MET`。\n  一帧都没提交、`--branch` 又指向别的 ref 时该请求无处兑现：报 `CLI_BAD_ARGS`（`details.param: \"branch\"`）而不是静默按活动 ref 收工——先 `branch checkout`，或加 `--from-frame` 让这次 step 真的写盘。\n\nstdout 回执：`meta.statePointer` 与 `meta.checkout` 同时给出两套坐标——`checkout.activeBranchId` 是**实际写入**的 ref，`checkout.activeFrameId` 是 playhead，`checkout.statePointer`（`lastSeq` / 同值别名 `lastFrameId` / `frameCount` / `lastTickedTimeMs`）始终描述该 ref 的 HEAD。append 一定把 playhead 钉回 HEAD（两者同值），中段 playhead 被拉走时 stderr 另有一条 `[1gameplay]` 提示。`branch create` / `branch checkout` 的 `result.checkout` 是同一组字段。\n\n#### 动作宏 `click` / `swipe` / `keypress`（跨多帧）\n\n`click`、`swipe`、`keypress` 描述的是一个**完整的多帧动作**：`data.ms` 是这个动作从开始到结束经过的真实引擎时间，CLI 会自动拆成多帧分别注入并各自 tick，而不是把按下/抬起压缩进同一帧。单次 `step` 调用里，`click`/`swipe`/`keypress` 不能与其它事件混用（会拆分成多帧、与该次调用里的其它事件产生歧义），也不受该次调用的 `--ms`/`--repeat`（`--repeat` 仍生效，含义是\"重复整个动作 N 次\"，但 `--ms` 被动作自身的 `data.ms` 取代）：\n\n- `click`：`data = { x, y, ms?=16, pressMs?=ms/2, id?, time?=0, domClientX?, domClientY? }`。展开为 2 帧：第一帧注入按下并 tick `pressMs`；第二帧注入抬起并 tick `ms - pressMs`（两帧 tick 之和精确等于 `ms`）。\n- `swipe`：`data = { from:{x,y}, to:{x,y}, ms?=300, frames?, id?, time?=0 }`。展开为 `frames` 帧（默认按 `ms/16` 估算并夹在 `[3, 60]` 之间，可用 `frames` 覆盖，允许范围 `[2, 60]`）：第一帧 `pointer.down@from`，中间帧按位置线性插值 `pointer.move`，最后一帧 `pointer.up@to`，每帧 `deltaMs = ms/frames`（余数计入最后一帧）。**注意**：`frames=2`（无中间 `pointer.move`）不会触发引擎的 `hasGestureMoved`/`DragStart` 判定，只有位置直接跳变，一般不建议使用。\n- `keypress`：`data = { code, key?, shift?, meta?, alt?, ctrl?, ms?=16, pressMs?=ms/2, time?=0 }`。展开为 2 帧，与 `click` 结构完全对称：第一帧注入 `keydown` 并 tick `pressMs`；第二帧注入 `keyup` 并 tick `ms - pressMs`（两帧 tick 之和精确等于 `ms`）。按住期间（两帧之间）`InputSnapshot.keyboard` 中该 `code` 保持存在，可跨真实引擎帧被 `useFrame` 等逻辑观察到。\n\n示例：\n\n```bash\n# 点击（单 scene 可省略 uid；--click 默认按住 200ms）\n1gameplay step out/demo.1gamerecord --click 180,320\n1gameplay step out/demo.1gamerecord --event '{\"type\":\"click\",\"data\":{\"x\":180,\"y\":320,\"ms\":200}}'\n\n# 滑动（300ms 内从 (144,220) 滑到 (144,170)，默认约按 60fps 拆成多帧）\n1gameplay step out/demo.1gamerecord --event '{\"type\":\"swipe\",\"sceneStableUid\":\"<sceneStableUid>\",\"data\":{\"from\":{\"x\":144,\"y\":220},\"to\":{\"x\":144,\"y\":170},\"ms\":300}}'\n\n# 按键（等价于按住 ArrowLeft 180ms 后松开，产生 2 帧）\n1gameplay step out/demo.1gamerecord --event '{\"type\":\"keypress\",\"sceneStableUid\":\"<sceneStableUid>\",\"data\":{\"code\":\"ArrowLeft\",\"ms\":180}}'\n```\n\n低层 `pointer.down`/`pointer.move`/`pointer.up`/`touch`/`keydown`/`keyup` 宏仍然保留，供需要精细控制（自定义 `domClientX/Y`、多指、跨命令分帧按住/移动/释放）的场景使用；`click`/`swipe`/`keypress` 只是构建在其上的高层封装。`frame batch` 不支持 `click`/`swipe`/`keypress`（会返回 `INPUT_ACTION_MACRO_UNSUPPORTED`），请改用底层宏。试跑不写主档请用 `step --dry-run`。\n\n- `--capture-console`：采集 Worker 内 `console` 到 SQLite `runtime_logs`（`off|error|warn|info|log|debug|all`，**默认 `warn`**）。采集为旁路元数据，**不影响回放状态**；原 `console` 仍会照常输出到进程 stderr。\n- `--console-max-per-step`：每步最多保留的日志条数（默认 `50`），超出部分丢弃并计入 `invokeSummary.consoleDroppedByLimit`。\n- `--console-max-bytes`：单条 `message` JSON 序列化后的最大字节数（默认 `4096`），超出截断并标记 `truncated`。\n- `--perf`：Host Lab 性能**采集**（`off|summary|frames|trace`，**默认 `off`**）。日常解读用 `obs report --profile`（只读，不采样）。`summary` 写入 stdout `meta.perf.summary` 并落一行 `1gameplay.perf.summary/1`（挂该次 lastSeq）；`frames`/`trace` 写逐帧 `1gameplay.perf.frame/1`，**不写** summary 行。旧 `--with-metrics` 已移除。含 `meta.captureSession` 的真机档禁止再 `--perf`（硬拒发生在 `.swp` 之前；无源码请 `obs report --profile device.budget`）。\n- `--perf-max-frames`：截断 stdout `meta.perf.frames` 条数（`>= 0`；不影响已写入 `runtime_perf` 的行）。\n- `--surface`：Host Lab 面（`record|display`，**默认 `record`**）。`record` 关 publish；`display` 开 publish。`--flush` 把 `flushFrame` 等待记入 `host.flushWaitMs`（**不是**浏览器 paint）。`invokeSummary.surface` 回显 `record`|`display`。\n- `--check-render`：比较本次 step **活着的** FrameStore 与同 store 快照强制 remount 后的投影（DSL 属性全量；未知键 fail-closed；跳过 kernel / scheduler / internal，例如 `transform`、资源 resolved key）。用来抓 `const fill = props.bg` / For 里 `const w = 46 * p.scale` 这类「活树陈旧、冷启动截图却正常」的绑定。`--click`、`click`/`pointer.*`/`keypress`/`keydown`/`keyup` 事件的 step **默认**跑同一检查（纯 `--ms`/`--repeat` 空 tick 不会，以免每步 remount）。关闭自动：环境变量 `ONEGAME_CHECK_RENDER=0`（或 `false` / `off`）。显式 `--check-render` 仍可对纯 tick 自测。`mismatch` 抛 `CHECK_RENDER_MISMATCH`（退出码 **7**，`ok: false`）；已步进的帧会提交，并钉最多 10 条 `authorId=1game-check-render` 的 `frame_comments`，档案旁写入 `.check-render/live-<frameId>.json`（能截则再写 PNG）。remount 臂使用 `ONEGAME_LAYOUT_FULL=1`。含 `meta.captureSession` 的真机档：**显式**此旗硬拒；自动路径跳过，不要用实验室 match 否掉用户画面。`frame query` / `screenshot` / `paint` / `--at` 不接受 `--check-render` / `--forceRebuild`。\n\n`pointer.*` 跨命令恢复的 stableUid 契约：\n\n- 跨包冻结语义与 strict 默认行为以 `../../docs/stable-uid-identity-contract.md` 为准。\n\n- 构建期为每个 DSL 节点注入内部 `__sid`，运行时派生全局唯一的 `stableUid`（路径拼接）。\n- 一致性边界：`stableUid` 仅保证同一构建产物在多次运行中的节点一致；跨构建或跨源码改动后不保证保持同一 stableUid。\n- 输入快照中持久化 `targetStableUid` / `downStableUid`，跨 `step` 或 `--from-frame` 时用于回查节点。\n- 不支持跨源码位点（如 `Show` 主分支与 `fallback`）视为同一实体；scene vnode replacement 切换分支后，`onClick` / `onDrag*` 语义不再保证连续。\n- 生成期冲突（生成重复 stableUid）属于硬错误：运行时直接抛 `E_STABLE_UID_COLLISION`（dev/prod 一致）。\n- 消费期 duplicate 去重策略默认值：非 `production` 为 `strict`，`production` 为 `first-wins`，可通过 `ONEGAME_DUPLICATE_STABLE_UID_STRATEGY` 覆盖（非法值回退默认）。\n- `ONEGAME_STEP_STORE_DUMP_FULL=1`：`step` 每帧强制全量 `debug.dumpStore`（关闭 dumpRange watermark；用于排障 / A/B）。\n- `debug.dumpStore`（RPC v9 硬切）：返回值必须含 `meta`（`mode`/`fromIndex`/`length`/`pruneEpoch`）；`includeCurrentState` 默认 `false`（`frame query --select store:state` 会显式传 `true`）。无 `meta` 的旧 Worker 不再被接受。\n\n成功输出：stdout 为 JSON envelope，`schema` 为 `1gameplay.step`，`ok: true`。`meta.statePointer` 含与 `manifest.runtime` 对齐的 `lastSeq`、同值别名 `lastFrameId`、`frameCount`、`lastTickedTimeMs`（便于后续 `frame query --at`、`frames list` 无需猜 `--at`）。`lastSeq` / `lastFrameId` 是**活动分支 HEAD 的 `frames.frame_id`**，不是路径深度 `frames.ordinal`，也**不必**等于途中 playhead `record_meta.activeFrameId`。磁盘 `record_meta.statePointer` 仍只有 `lastSeq` 三字段。`branch create` 之后兄弟分支会共享 ordinal，只有 frame_id 能唯一定位一帧。`meta.invokeSummary` 含本次实际生效的 `msEffective`、`repeatEffective`（until 模式为 `0`）、`until`（开环为 `null`；until 成功含 `met`/`ticks`/`simMs`/`lastValue`）、是否 `--from-frame` 截断、注入的 `--event` / `--event-file` 数量、`clickInjected`、`eventSceneStableUids`、`defaultSceneStableUid`，以及 `captureConsole`、`consoleCaptured`、`consoleDroppedByLimit`、`surface`。启用 `--perf` 时额外含 `meta.perf`（`summary` 恒有，含 phases/counters/host/derived；`frames`/`trace` 另附 `frames` 数组）。\n\nHost 解读：`hostOverheadMs = frameWallMs − workerTotalMs`（冻结）。`storeDumpMs` 高而 `workerTotalMs` 极低时，墙钟主导是 **journal/host**，不是仿真。\n\n失败：`step` 使用与 `frame` 一致的 `1gameplay.error` 信封，并默认写入 stdout。退出码：`2` 参数（含 `STEP_UNTIL_PATH_MISSING` / `STEP_UNTIL_PATH_INVALID` / `CAPTURE_SESSION_HOST_LAB_REFUSED` / `CHECKOUT_BROKEN`）；`3` 缺失路径等；`4` 记录/bundle 不兼容；`5` 回放运行时错误；`6` `STEP_UNTIL_NOT_MET`（仿真预算用尽，谓词仍假；已步进的帧会提交）；`7` `CHECK_RENDER_MISMATCH`（活树与同 store 强制 remount 投影不一致；帧已提交，并钉 `authorId=1game-check-render` 评论）。\n\n`step` 的参数名有白名单：拼错的旗标（`--repeeat`）报 `CLI_BAD_ARGS` 而不是当成没传后照样追加一帧，`details.kind` 为 `unknown_flag`；`--dry-run` / `--until-not` / `--flush` 只接受布尔字面量，`details.kind` 为 `bad_flag_value`。\n\n`CHECKOUT_BROKEN` 说的是归档自己的 `record_meta` checkout 指不到任何 ref（`details.kind`：`active_branch_missing` / `active_branch_unparseable` / `active_branch_dangling`），不是引擎故障：先 `branch list` 看 `result.checkout.reasons`，再 `branch repair-checkout`。\n\n### 2b) 只读性能报告：`obs report`\n\n用途：按剖面读取 Worker / 真机 Main rAF / paint-lab 三只时钟桶。不采样。信封 `1gameplay.obs.report/1` 只出现在 stdout / `--out`。\n\n```bash\n1gameplay obs report userplay.1gamerecord --profile device.budget --at spike\n1gameplay obs report out/lab.1gamerecord --profile lab.worker\n1gameplay obs report out/lab.1gamerecord --profile lab.paint --at last\n```\n\n- Agent 必须显式 `--profile`（`lab.worker|lab.display|lab.paint|device.budget`）。CLI 默认：有 `captureSession` → `device.budget`，否则 `lab.worker`。\n- `device.budget` 需要真机信封；无信封实验室档用 `lab.worker`（须已有 `1gameplay.perf.*` 行）。\n- 有信封时 stdout `meta.captureSession` 与 `frame query` 同键（`1game.capture.session/1`）；Main rAF 读 `buckets.main`。缺档是 `NOT_FOUND`，不要当成 `CAPTURE_SESSION_REQUIRED`。\n- 不要跨桶比较毫秒。可见超预算 `rafSpikes` 须与 Worker seq / 点击互证。\n\n### 3) 添加帧评论：`comments add`\n\n用途：向已有 runtime 帧附加一条 `frame_comments` 记录（与 `schemaVersion` 仍为 `3` 的归档兼容）。\n\n示例：\n\n- `1gameplay comments add out/demo.1gamerecord --at last --body \"checkpoint ok\"`（省略 `--author-id` → `authorId: null`）\n- `1gameplay comments add out/demo.1gamerecord --at 12 --body \"review\" --author-id ai`\n\n关键参数：\n\n- `--at`：`last` 或具体 `frames.frame_id`（与 `frames list` 的 `seq` 列相同，**不是**播放器 `currentSeq`）\n- `--body`：评论正文（必填）\n- `--author-id` / `--anchor-json` / `--comment-id`：可选。Agent 钉锚点请传 `--author-id ai`；回放页人手新建/改过的评论为 `user`\n\n成功输出：stdout 为 JSON envelope，`schema` 为 `1gameplay.comment.v1`，`result.comment` 为写入后的记录。\n\n### 4) 列出帧：`frames list`\n\n用途：以 JSON envelope 列出帧摘要。\n\n示例：\n\n- `1gameplay frames list out/demo.1gamerecord`\n- `1gameplay frames list out/demo.1gamerecord --from 100 --to 160`\n\n参数约束：\n\n- `--from` / `--to` 必须是 `>= 0` 的整数，且 `from <= to`\n\n成功输出：stdout 为 JSON envelope，`schema` 为 `1gameplay.frames.list.v1`。`result.columns` 固定为 `seq|deltaMs|tickedTimeMs|events|storeCursor`，`result.rows` 为范围内帧摘要数组。`seq` 列是活动路径上的 `frames.frame_id`，不是播放器路径 ordinal（`currentSeq`）。每行另有同值 `frameId` 别名（`columns` 不增加第 6 列）。\n\n帧坐标对照：\n\n| 表面                                                                                                                       | 坐标                                 |\n| -------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ |\n| CLI `--at` / `--from-seq` / `--from-frame` / `frames list` 的 `seq` / `resolvedSeq` / `lastSeq` / `listFrameComments` 区间 | `frames.frame_id`                    |\n| CLI stdout 别名 `resolvedFrameId` / `lastFrameId` / `frames list` 行内 `frameId` / `resolvedRange.fromFrameId`             | 与上一行同值                         |\n| 播放器 `currentSeq` / `startSeq` / `seekRuntimeSeq` / RPC `replay.comment.listBySeqRange` 入参                             | 当前路径 ordinal                     |\n| 播放器 `currentFrameId` / `startFrameId` / `seekFrameId`                                                                   | `frames.frame_id`（回填 CLI 用这些） |\n\n### 5) 帧调试：`frame query | diff | batch`\n\n用途：以稳定 JSON envelope 查询/对比/批处理；无隐式 fallback（缺失 event、缺失 store、缺失 scene 均报错）。\n\n成功 `1gameplay.frame` 的 `result` 除 `select` 外，还包含 **`commentsBySeq`**：以帧 `seq` 字符串为键、该帧关联的 `frame_comments` 行数组（`query` 为单键；`diff` 为 `--from` 与 `--to` 两端；`batch` 每条成功任务的 `result` 各自携带，避免任务间混淆）。\n\n`--select` DSL（可重复）：\n\n- 所有 `sceneStableUid` 入参都必须传 render 输出里的 `scenes[].stableUid`（或 `sceneStableUids[]`）；**不再**接受 scene `name` 的隐式匹配。\n- 只要本次 `frame query` 的 `--select` 触发了 worker 回放（例如 `render`、`store:frame`/`store:state`、`hit:*`），响应的 `meta.sceneStableUids` 就会自动带出当前所有 scene 的 `stableUid`，省去单独再查一次 `render`。仅用 `runtime`/`events`/`store:dump` 等无需回放的 lite 路径查询时不会附带（避免为此多启动一次 worker）。\n- `runtime`：该 seq 的 runtime 行\n- `events`：该 seq 的事件列表\n- `logs`：该 seq 的 `runtime_logs` 旁路行\n- `perf`：该 seq 的 `runtime_perf` 旁路行（需先前 `step --perf frames|trace` 写入）\n- `store:dump`：从记录文件的 store 表读行（不回放 worker）\n- `store:frame` / `store:state`：store-only 架构约定下同样从 journal 纯计算得出（不回放 worker）；仅当同一次查询还选择了 `render`/`hit`/`hitNode` 时才会随之启动 worker\n- `render`：全量 render 摘要（`--payload full` 时返回完整对象）\n- `render:sceneStableUid=<sceneStableUid>`：仅该 scene；scene 不存在则失败（`sceneStableUid` 为 CLI 字段名兼容保留，值语义为 scene stableUid）\n- `hit:point=<x>,<y>[:sceneStableUid=<sceneStableUid>][:mode=clickable|any][:pick=top|all]`：坐标命中测试。省略 `sceneStableUid` 时当前帧必须恰好一个 scene。返回 `{ stableUid, stableChain, sceneStableUid }`（未命中时 `stableUid: null`）\n- `hit:sceneStableUid=<sceneStableUid>:uid=<stableUid>[:shape=polygon|aabb][:space=scene|local][:include=...]`：节点区域/可点击性快照；`uid=*` 表示 scene 下首个非 scene 节点。`stableUid` 片段格式为纯 `sid`（静态唯一位点）或 `sid@k_<encodeURIComponent(String(key))>`（列表 key）；列表必须提供稳定 key。旧 `node=` 不再支持。\n\n示例：\n\n- `1gameplay frame query out/demo.1gamerecord --at last --select runtime --select store:dump`\n- `1gameplay frame query out/demo.1gamerecord --at 1 --select perf`\n- `1gameplay frame query out/demo.1gamerecord --at last --select 'hit:point=20,20:sceneStableUid=<sceneStableUid>'`\n- `1gameplay frame query out/demo.1gamerecord --at last --select 'hit:sceneStableUid=<sceneStableUid>:uid=*:shape=aabb:include=meta,path,aabb'`\n- `1gameplay frame diff out/demo.1gamerecord --from 0 --to last --select store:dump`\n- 试跑不改主档：`1gameplay step out/demo.1gamerecord --dry-run --ms 16`，再 `frame query out/demo.1gamerecord --dry-run --at last --select store:state`\n- `1gameplay frame batch out/demo.1gamerecord --plan-file ./plan.json`\n\n计划文件：`schema` 必须为 `1gameplay.frame.plan`，`tasks[]` 含 `taskId`、`type`（`query` | `diff`）及对应字段。\n\nframe 子命令退出码：`0` 成功；`2` 参数/越界 seq/`CHECKOUT_BROKEN`；`3` 对象不存在；`4` 归档/bundle 兼容性；`5` 回放运行时错误。\n\n### 6) 帧截图：`frame screenshot`\n\n用途：在 Node 主线程用 `@napi-rs/canvas` 回放指定帧并写出 PNG/JPEG。**不依赖 Chromium / Playwright**。\n\n示例：\n\n- `1gameplay frame screenshot out/demo.1gamerecord --at 0 --out out/frame0.png`\n- `1gameplay frame screenshot out/demo.1gamerecord --at last --out out/last.jpg --format jpeg`\n- `1gameplay frame screenshot out/demo.1gamerecord --at last --out out/scene.png --scene-stable-uid <sceneStableUid>`\n\n关键参数：\n\n- `--at`：`last` 或具体 `seq`（必填）\n- `--out`：输出图片路径（必填；扩展名可暗示格式）\n- `--scene-stable-uid`：可选，仅截取该 scene\n- `--width` / `--height` / `--dpr`：视口与设备像素比（默认 `800`×`600`，`dpr=1`）\n- `--format`：`png` | `jpeg`（默认由 `--out` 扩展名推断，否则 `png`）\n- `--quality`：JPEG 质量 `1–100`（默认 `90`；PNG 忽略）\n\n成功输出：stdout 为 JSON envelope，`schema` 为 `1gameplay.screenshot.v1`，含 `resolvedSeq`、`image.{format,width,height,dpr,bytes}`、`stats`（可选 `resourceWaitTimedOut`）。\n\n### 6b) 绘制快照：`frame paint`\n\n用途：同一 display 宿主（Node `@napi-rs/canvas`）对指定 seq 做一次 Canvas 绘制采集。stdout JSON（`1gameplay.paint.snapshot/1`），**不写 PNG**。量 scene / `byType` / 截断 `topNodes`，**不是** Host Lab `step --perf`，也不是浏览器 FPS。\n\n示例：\n\n- `1gameplay frame paint out/demo.1gamerecord --at last`\n- `1gameplay frame paint out/demo.1gamerecord --at last --top 0`\n- `1gameplay frame paint out/demo.1gamerecord --at last --scene-stable-uid <sceneStableUid>`\n\n关键参数：`--at` 必填；禁止 `--out`；`--top` 默认 `5`（`0–20`，`0` 省略 `topNodes`）；视口默认与 screenshot 相同（`800`×`600`，`dpr=1`）。\n\n成功信封含 `backend: \"napi-canvas\"`、`notFps: true`、`scenes[]`（overlay scene 的 `name` 以 `overlay:` 开头）、`topNodes`、`stats.paintMs`（各 scene 强制 `getRenderedFrame` 之和，不含 `compositeMs` / PNG encode）。`stats.forcedRedraw` 只表示 scene canvas 被强制重绘，**不会**打掉 `render.drawCache`；cache 子树计在 `nodesCacheElided`，不要当成 `nodesCulled`。`stats.compositeMs` 是 harvest 之后把已画好的 scene 帧 `drawImage` 到主画布，不是第二次 `engine.doRender`。不要和 `meta.perf` / `captureSession.main.raf*` 对比。禁止 `--out` / `--select` / `--format` / `--quality` / `--payload`。极简场景 `selfMs` 可能为 0。\n\n默认中文字体：依赖 `@fontpkg/source-han-sans-hw-sc`（思源黑体 HW SC Regular + Bold），在 Node 主线程与 Worker 启动时注册；场景未配置 `textMeasureFontFamily` 时主线程默认使用 `Source Han Sans HW SC`。\n\n已知差异（相对浏览器回放）：\n\n- 像素与浏览器 Canvas 不完全一致（字体、抗锯齿、合成路径不同）\n- 远程 URL 图片在无头 Node 路径下不会绘制\n- 依赖 GPU/WebGL 上下文的滤镜在 headless 主线程会被跳过/降级（无头路径是 Canvas 2D / `@napi-rs/canvas`，不是仓内实验 WebGL 后端）\n\n### 7) 删除帧：`frames delete`\n\n用途：在原 `.1gamerecord` 上删除**活动分支路径**的独占后缀。不能挖中间段，也不能 `--compact` 重排 `frame_id`。需要保留原文件时请先复制或使用 `record extract` 生成新文件。其它分支占用这段后缀时会失败。\n\n示例：\n\n- `1gameplay frames delete out/demo.1gamerecord --last 3`\n- `1gameplay frames delete out/demo.1gamerecord --after 12`\n- `1gameplay frames delete out/demo.1gamerecord --after last`\n\n关键参数（`--after` 与 `--last` 二选一）：\n\n- `--after <frame_id|last>`：保留到该帧（含），删除其后活动路径上的独占后缀。`last` 是活动分支 HEAD\n- `--last <n>`：删除路径尾部 `n` 帧（`n >= 1`），至少保留分支根\n- `--dry-run`：可选，改写 `<archive>.swp`（须已由 `step --dry-run` 创建）；有 `.swp` 时无旗标写主档会失败\n\n成功输出：stdout JSON，包含 `keptThroughFrameId`、`deletedFrameIds`、`deletedCount`、`runtimeFrameCount`、`eventCount`；使用 `--last` 时额外含 `last`，使用 `--after` 时额外含 `after`；`--dry-run` 时额外含 `dryRun` / `effectivePath`。\n\n### 8) 抽取帧区间：`record extract`\n\n用途：从已有 `.1gamerecord` 中抽取连续 runtime 帧区间，写成新的独立 `.1gamerecord` 文件；输入文件不会被覆盖。若 `--out` 指向已有文件，会按当前写入策略覆盖该目标文件。\n\n示例：\n\n- `1gameplay record extract out/demo.1gamerecord --out out/clip.1gamerecord --from-seq 100 --to-seq 160`\n- `1gameplay record extract out/demo.1gamerecord --out out/clip.1gamerecord --from-seq 100 --to-seq 160 --merge-diff`\n- `1gameplay record extract out/demo.1gamerecord --out out/clip.1gamerecord --from-seq 100 --to-seq 160 --merge-diff 3`\n- `1gameplay record extract out/demo.1gamerecord --out out/clip.1gamerecord --from-seq 100 --to-seq 160 --branch-meta`\n- `1gameplay record extract out/demo.1gamerecord --out out/clip.1gamerecord --from-ms 1000 --to-ms 2600`\n\n关键参数：\n\n- `--out`：新 `.1gamerecord` 输出路径，不能与输入路径相同；目标文件已存在时会被覆盖\n- `--from-seq` / `--to-seq`：按 `frames.frame_id` 抽取闭区间，与 `frame query --at`、`frames list` 的 `seq` 列同坐标，也接受 `last`；只在**活动分支路径**上解析，兄弟分支的 frame_id 会报错（先 `branch checkout`）\n- `--from-ms` / `--to-ms`：按 `tickedTimeMs` 解析到不超过该时间的 runtime 帧（at-or-before）后抽取闭区间；早于首帧时会解析到首帧\n- `--merge-diff [n]`：可选，合并未被硬锚定的连续 store diff，并删除因此失去 store 终点的 runtime 帧（这些时刻不可再 seek）。默认 `n=2`（相邻 2 条可合并 diff → 1 条）；可传 `n>=2`。某一连续可合并段长度不足 `n` 时不合并该段尾巴，继续向后扫描。硬锚点：`full`、窗口首/末 runtime 的 `storeCursor`、带评论帧的 `storeCursor`\n- `--branch-meta`：可选，在输出档案写入 provenance：输入文件字节 SHA-256 与起点帧在**源档案**里的 `frame_id`；默认不继承输入档案的分支元数据\n\n与 `frames delete` 的区别：`frames delete` 会就地修改输入档案；`record extract` 会写出一个新的独立档案，并保留输入档案不变。\n\n抽取结果是一条线性链（帧重编号为 `0..n-1`），源档案的分支 ref 一个都留不下：活动分支被重写成 `main`，其余 ref 在 `result.droppedBranchIds` 里列出。\n\n成功输出：stdout JSON envelope，`schema` 为 `1gameplay.record.extract.v1`，`request` 含解析后的 `fromSeq`/`toSeq`（frame_id）与同值别名 `fromFrameId`/`toFrameId`，以及 `fromOrdinal`/`toOrdinal`（路径深度，线性档案上与前者相等）、`mergeDiff`、`mergeDiffCount`、`branchMeta`；`result` 含 `frameCount`、`commentCount`、`droppedBranchIds`、store / runtime 行数变化（`--merge-diff` 时 `frameCount` 可能小于抽取窗口）；传入 `--branch-meta` 时还包含 `originRecordSha` 与 `branchedFromSeq`（同值别名 `branchedFromFrameId`）。\n\n### 9) 导出回放页：`bundle-player-html`\n\n用途：默认在 `--out` 位置生成**单文件** `replay.html`（内联**薄 ESM** `player.bundle.js`，并对 `.1gamerecord` 先 gzip 再 base64 写入 `recordBase64`，同时带 `recordEncoding: \"gzip\"`，不写 sidecar 文件）。单文件下引擎解析由 `ONEGAME_ENGINE_CDN_BASE` 切换（与 `1game build --target single-file` 同规则）：**已设** → HTML import map 指向 CDN `runtime-main.mjs`；**未设** → 内嵌本地 `dist/engine/runtime-main.mjs`，经典 boot 生成 `blob:` 再写 import map。若传 `--multi-file`，则在 `--out` 所在目录生成 **`replay.html`**、**`player.bundle.js`**、**`engine/runtime-main.mjs`** 以及 **`.1gamerecord` 的副本**（多文件模式不做外层 gzip，可离线静态托管）。\n\nsql.js WASM 地址在导出时写入 `gr-config.wasm`：\n\n```text\n{ONEGAME_ENGINE_CDN_BASE|https://cdn.jsdelivr.net/npm}/sql.js@{installedVersion}/dist/sql-wasm.wasm\n```\n\n复用 `ONEGAME_ENGINE_CDN_BASE`（未设则 **sql.js 仍默许 jsDelivr**，与引擎 `getEngineCdnBase()===null` 语义分离）；版本对齐导出进程安装的 `sql.js`。单文件导出时**原样内联**已发布的薄 ESM 壳，不改写壳字节、不跑 esbuild。引擎 local `./engine/` / CDN / inline-blob 规则见 `docs/engine-cdn-resolution.md`。\n\n导出页会在 `gr-config` 里默认写入两个可替换模板值：\n\n- `shareButtonText: \"__1GR_SHARE_BUTTON_TEXT__\"`（分享按钮文案）\n- `shareActionMessage: \"__1GR_SHARE_ACTION_MESSAGE__\"`（iframe 分享消息类型）\n\n你可在产出的 `replay.html` 上替换这两个固定字符串来自定义。若 `shareActionMessage` 有值且页面被 iframe 加载，评论区「分享」（须有评论）或 userplay 暂停后更多菜单的采集分享（须已游玩）会向父窗口发送 `postMessage({ type, fileBuffer, commentsJson, filename, kind })`，`kind` 为 `comments` 或 `capture`；否则走默认下载。采集分享不要求评论。\n\n示例：\n\n- `1gameplay bundle-player-html out/demo.1gamerecord --out out/replay.html`（未设 CDN → inline-blob）\n- `ONEGAME_ENGINE_CDN_BASE=https://cdn.jsdelivr.net/npm 1gameplay bundle-player-html out/demo.1gamerecord --out out/replay.html`\n- `1gameplay bundle-player-html out/demo.1gamerecord --out out/replay.html --multi-file`\n\n打开 `replay.html?mode=autoplay` 进页自动播放（可暂停）；`?mode=userplay` 打开玩家游戏采集面板（空回放时只留不可关闭的进入游戏浮层，隐藏进度条）；`?userplay=0` 隐藏「进入玩家游戏模式」菜单（忽略 `mode=userplay`）。\n\n关键参数：\n\n- `--title`：可选，浏览器页标题\n- `--single-html`：可选，显式指定单文件模式（默认即单文件；CDN 或 inline-blob）\n- `--multi-file`：可选，离线多文件模式（replay.html + player.bundle.js + engine/runtime-main.mjs + 归档副本）\n- `--dry-run`：可选，从已有 `<archive>.swp` 读归档导出（不改主档）\n- `--shell`：已移除。传任意值（含 `play-only` / `full`）会失败；自动播用 `replay.html?mode=autoplay`\n\n构建前提：需先在仓库根构建播放器壳包：`pnpm --filter @1game/1gamerecord-player-html build`（否则 CLI 会报缺少 `player.html` / `player.bundle.js`；`--multi-file` 与 inline-blob 另需 `engine/runtime-main.mjs`）。\n\n## 输出与错误约定\n\n- 所有命令默认输出 JSON（成功为对应 schema，失败为 `1gameplay.error`），并统一写入 **stdout**。\n- `frame query|diff|batch`：成功与失败均向 stdout 输出 JSON（`1gameplay.frame` / `1gameplay.error`），退出码见上文。\n- `frame screenshot`：成功 `1gameplay.screenshot.v1`；`frame paint`：成功 `1gameplay.paint.snapshot/1`。失败均为 `1gameplay.error`。\n- `frames list`：成功 schema 为 `1gameplay.frames.list.v1`。\n\n## 常见问题\n\n### 1) 报错：`bundle-player-html 需要 --out <replay.html>`\n\n请补齐 `--out` 参数。\n\n### 2) 报错：`engineVersion 不兼容`\n\n这表示归档 `engineVersion` 与当前 CLI / 回放壳绑定的 `@1game/engine-bundle` 不一致（或缺版本 / `0.0.0`）。对齐同批 CLI 与 engine-bundle 后删除旧档，再 `1gameplay create`。`1gameplay step` 不会改写档内版本。\n\n### 3) 报错：`--ms 必须是 >= 0 的数字` 或 `--repeat 必须是 >= 1 的整数`\n\n请检查 `step` 参数取值。`--until` 必须搭配 `--until-ms` 与显式 `--ms`，且不能同时传 `--repeat`。\n\n### 3b) 报错：`STEP_UNTIL_NOT_MET`\n\n谓词在 `--until-ms` 内仍为假。查 `details.lastValue` / `frame query --select store:state`；加大 `--until-ms` 或修正 path。这不是 worker 超时（那是退出码 5）。\n\n### 4) 报错：`better-sqlite3.node is missing` / `Cannot find module 'better-sqlite3'`\n\n`1gameplay` 在 Node 环境下会使用 `better-sqlite3` 读写 `.1gamerecord`。如果你的 pnpm 环境启用了构建脚本限制（例如忽略未授权构建），可能导致 `better-sqlite3` 未完成原生构建，从而在运行时抛出该错误。\n\n可选修复方式：\n\n1. 一次性审批当前项目的构建脚本（推荐）：\n\n   - `pnpm approve-builds`\n\n2. 在项目 `package.json` 中显式允许构建 `better-sqlite3`（适合团队统一配置）：\n\n   - 在根 `package.json` 增加：\n\n```json\n{\n  \"pnpm\": {\n    \"onlyBuiltDependencies\": [\"better-sqlite3\"]\n  }\n}\n```\n\n完成后重新安装依赖：\n\n- `pnpm install`\n","readmeFilename":""}