Просмотр исходного кода

feat(core): state-manager 新建书籍时创建 outline/ 和 roles/ 目录

ensureControlDocumentsAt 在现有 story/ + runtime/ 之外,同时创建
story/outline/、story/roles/主要角色/、story/roles/次要角色/ 三个 Phase 5
目录。这样 initBook 完成后磁盘就有完整的 Phase 5 目录结构,
架构师产出的 outline/*.md 和 roles/**/*.md 有落脚处。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
fanghanjun 6 месяцев назад
Родитель
Сommit
9bbb362e32

+ 13 - 0
packages/core/src/__tests__/state-manager.test.ts

@@ -771,6 +771,19 @@ describe("StateManager", () => {
       expect(runtimeStat.isDirectory()).toBe(true);
     });
 
+    it("creates Phase 5 outline/ and roles/ directories", async () => {
+      await manager.ensureControlDocuments("phase5-book");
+
+      const storyDir = join(manager.bookDir("phase5-book"), "story");
+      const outlineStat = await stat(join(storyDir, "outline"));
+      const rolesMajorStat = await stat(join(storyDir, "roles", "主要角色"));
+      const rolesMinorStat = await stat(join(storyDir, "roles", "次要角色"));
+
+      expect(outlineStat.isDirectory()).toBe(true);
+      expect(rolesMajorStat.isDirectory()).toBe(true);
+      expect(rolesMinorStat.isDirectory()).toBe(true);
+    });
+
     it("bootstraps and returns safe defaults for legacy books", async () => {
       const storyDir = join(manager.bookDir("legacy-book"), "story");
       await mkdir(storyDir, { recursive: true });

+ 6 - 0
packages/core/src/state/manager.ts

@@ -34,9 +34,15 @@ export class StateManager {
   ): Promise<void> {
     const storyDir = join(bookDir, "story");
     const runtimeDir = join(storyDir, "runtime");
+    const outlineDir = join(storyDir, "outline");
+    const rolesMajorDir = join(storyDir, "roles", "主要角色");
+    const rolesMinorDir = join(storyDir, "roles", "次要角色");
 
     await mkdir(storyDir, { recursive: true });
     await mkdir(runtimeDir, { recursive: true });
+    await mkdir(outlineDir, { recursive: true });
+    await mkdir(rolesMajorDir, { recursive: true });
+    await mkdir(rolesMinorDir, { recursive: true });
 
     await this.writeIfMissing(
       join(storyDir, "author_intent.md"),