From 6d7c688fe319432957e766a2c87a98997018b23d Mon Sep 17 00:00:00 2001 From: kdletters Date: Mon, 25 May 2026 20:14:40 +0800 Subject: [PATCH] chore(dev): enable password registration in local dev --- .hermes/shared-memory/development-workflow.md | 2 ++ ...发运维】本地开发验证与生产运维-2026-05-15.md | 2 ++ scripts/dev.mjs | 30 ++++++++++++------- scripts/dev.test.ts | 16 ++++++++++ 4 files changed, 40 insertions(+), 10 deletions(-) diff --git a/.hermes/shared-memory/development-workflow.md b/.hermes/shared-memory/development-workflow.md index bb3daa40..bd6d441b 100644 --- a/.hermes/shared-memory/development-workflow.md +++ b/.hermes/shared-memory/development-workflow.md @@ -93,6 +93,8 @@ npm run dev:admin-web `npm run dev:api-server` 会保留终端实时输出,并把同一份输出持久化到 `logs/api-server/api-server-.log`。完整联调入口 `npm run dev` 启动的 Rust `api-server` 使用同一套日志规则。如需改写路径,可设置 `GENARRATIVE_API_SERVER_LOG_FILE`;如只改目录,可设置 `GENARRATIVE_API_SERVER_LOG_DIR`。 +开发态 `npm run dev` / `npm run dev:api-server` 默认打开 `GENARRATIVE_DEV_PASSWORD_ENTRY_AUTO_REGISTER_ENABLED=true`,密码入口可以直接注册未知手机号账号;生产默认仍关闭该开关。 + 查看本地 Rust/SpacetimeDB 日志: ```bash diff --git a/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md b/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md index 3d3d3173..403c2ba3 100644 --- a/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md +++ b/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md @@ -45,6 +45,8 @@ npm run dev:api-server 后端日志默认写入 `logs/api-server/`。后端 API smoke 使用 `npm run dev:api-server` 并检查 `/healthz`;不要使用旧 `api-server:maincloud` 或任何 `GENARRATIVE_SPACETIME_MAINCLOUD_*` 口径。 +开发态 `npm run dev` 与 `npm run dev:api-server` 会默认注入 `GENARRATIVE_DEV_PASSWORD_ENTRY_AUTO_REGISTER_ENABLED=true`,因此密码登录在本地开发环境可直接注册未知手机号账号;生产环境仍按 `api-server` 配置默认关闭该开关。 + 如果本地 `GET /api/creation-entry/config` 返回 `No such procedure`,或 `api-server` 日志出现 `no such table: puzzle_gallery_card_view` / `no such table: wooden_fish_gallery_card_view` 这类公开 view 缺失,通常是 `.env.local` 指向的 SpacetimeDB 库还没有发布当前 `spacetime-module`,或当前 CLI 身份无权发布该库。debug 构建的 `api-server` 会临时使用后端默认入口配置兜底,避免创作作品架整块消失;正式修复仍应切换到拥有目标库权限的 SpacetimeDB 身份后重新运行 `npm run dev` 完成发布,或用 gitignored 的 `spacetime.local.json` 指向可发布的本地库。 本地排查 schema 漂移时,先用当前 dev server 显式查询目标库,例如: diff --git a/scripts/dev.mjs b/scripts/dev.mjs index 0e2762b6..13cbb831 100644 --- a/scripts/dev.mjs +++ b/scripts/dev.mjs @@ -958,16 +958,11 @@ class DevRunner { async startApiServer(service) { await this.ensureApiServerSpacetimeToken(); - const mergedEnv = { - ...this.baseEnv, - GENARRATIVE_API_HOST: this.options.apiHost, - GENARRATIVE_API_PORT: String(this.options.apiPort), - GENARRATIVE_API_LOG: this.options.apiLog, - GENARRATIVE_SPACETIME_SERVER_URL: this.state.spacetimeServer, - GENARRATIVE_SPACETIME_DATABASE: this.options.database, - GENARRATIVE_SPACETIME_TOKEN: - this.baseEnv.GENARRATIVE_SPACETIME_TOKEN || '', - }; + const mergedEnv = buildApiServerProcessEnv({ + baseEnv: this.baseEnv, + options: this.options, + state: this.state, + }); const logFile = resolveApiServerLogFile(repoRoot, mergedEnv); ensureParentDir(logFile); @@ -1717,10 +1712,25 @@ function isSpacetimePublishPermissionError(error) { ); } +function buildApiServerProcessEnv({baseEnv, options, state}) { + return { + ...baseEnv, + // 本地 dev 允许密码入口直接创建账号,生产默认仍由 api-server 配置保持关闭。 + GENARRATIVE_DEV_PASSWORD_ENTRY_AUTO_REGISTER_ENABLED: 'true', + GENARRATIVE_API_HOST: options.apiHost, + GENARRATIVE_API_PORT: String(options.apiPort), + GENARRATIVE_API_LOG: options.apiLog, + GENARRATIVE_SPACETIME_SERVER_URL: state.spacetimeServer, + GENARRATIVE_SPACETIME_DATABASE: options.database, + GENARRATIVE_SPACETIME_TOKEN: baseEnv.GENARRATIVE_SPACETIME_TOKEN || '', + }; +} + export { DevRunner, assertReusableSpacetimeProcessVersionMatchesWorkspace, assertSpacetimeToolVersionMatchesWorkspace, + buildApiServerProcessEnv, buildSpacetimePublishArgs, createDevServerSpawnOptions, createWatchConfigs, diff --git a/scripts/dev.test.ts b/scripts/dev.test.ts index 851e9c07..341cde80 100644 --- a/scripts/dev.test.ts +++ b/scripts/dev.test.ts @@ -8,6 +8,7 @@ import { DevRunner, assertReusableSpacetimeProcessVersionMatchesWorkspace, assertSpacetimeToolVersionMatchesWorkspace, + buildApiServerProcessEnv, buildSpacetimePublishArgs, createDevServerSpawnOptions, createWatchConfigs, @@ -89,6 +90,21 @@ describe('dev scheduler argument routing', () => { }); }); +describe('dev scheduler api-server env', () => { + test('dev 脚本默认打开密码入口自动注册', () => { + const {options} = parseArgs(['api-server', '--api-port', '9091'], {}); + const env = buildApiServerProcessEnv({ + baseEnv: {}, + options, + state: {spacetimeServer: 'http://127.0.0.1:3199'}, + }); + + expect(env.GENARRATIVE_DEV_PASSWORD_ENTRY_AUTO_REGISTER_ENABLED).toBe('true'); + expect(env.GENARRATIVE_API_PORT).toBe('9091'); + expect(env.GENARRATIVE_SPACETIME_SERVER_URL).toBe('http://127.0.0.1:3199'); + }); +}); + describe('dev scheduler spacetime reuse guard', () => { test('记录 URL 可 ping 但没有 spacetime.pid 时不复用宿主', async () => { const tempDir = mkdtempSync(join(tmpdir(), 'genarrative-spacetime-reuse-'));