Split Soldoros doll into standalone mod package#8
Conversation
There was a problem hiding this comment.
Pull request overview
Introduces a workspace-based PVF mod pipeline system and splits the Soldoros doll APC preparation into its own standalone mod package, updating the registry/pipelines, CLI, docs, and tests to support sequential multi-mod execution with optional prerequisite behavior.
Changes:
- Add new shared runtime/pipeline helper package
@pvf/pvf-mod(session, pipeline runner, manifest writing, common EQU/.lst/path helpers). - Add new CLI app
pvf-mod-clito list/build/apply named or ad-hoc mod pipelines. - Refactor existing mods into workspace packages (including new
soldoros_dollprerequisite mod) and update registry/pipelines/docs/tests accordingly.
Reviewed changes
Copilot reviewed 40 out of 43 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| tsconfig.json | Adds project refs for new workspaces and starts including mods/*.ts. |
| README.md | Documents the new mod pipeline/CLI workflow and built-in pipelines/mods. |
| pnpm-lock.yaml | Locks workspace links for new packages/apps/mods. |
| packages/pvf-mod/tsconfig.json | Typecheck config for the new shared @pvf/pvf-mod package. |
| packages/pvf-mod/src/runtime.ts | Implements PvfModSession, sequential mod execution, and overlay directory export. |
| packages/pvf-mod/src/pipeline.ts | Implements registry/pipeline execution, changed-path tracking, and manifest helpers. |
| packages/pvf-mod/src/path.ts | Adds path traversal protection helpers for outputs. |
| packages/pvf-mod/src/listed-path.ts | Adds .lst loading/updating helpers for id->path registries. |
| packages/pvf-mod/src/index.ts | Exports the shared mod/pipeline/runtime utilities. |
| packages/pvf-mod/src/index.test.ts | Tests sequential overlay visibility, PVF writing, and path traversal protection. |
| packages/pvf-mod/src/equ.ts | Adds common EQU AST helpers (sections/statements/replace helpers). |
| packages/pvf-mod/package.json | Declares the new workspace package entrypoints and scripts. |
| package.json | Adds workspace dependency on @pvf/pvf-mod (root). |
| mods/soldoros_doll/tsconfig.json | Typecheck config for the new Soldoros prerequisite mod package. |
| mods/soldoros_doll/src/index.ts | Implements Soldoros doll APC creation/repair + aicharacter.lst registration. |
| mods/soldoros_doll/src/index.test.ts | Tests Soldoros mod behavior via the pipeline (build/apply). |
| mods/soldoros_doll/package.json | Declares the new Soldoros mod workspace package. |
| mods/registry.ts | Adds a central registry for built-in mod definitions. |
| mods/pipelines.ts | Adds named pipelines (including default demo) and default pipeline id. |
| mods/example_wild_strawberry_hp_up/tsconfig.json | Typecheck config for the example strawberry mod package. |
| mods/example_wild_strawberry_hp_up/src/index.ts | Implements the strawberry HP recovery patch as a registered mod. |
| mods/example_wild_strawberry_hp_up/src/index.test.ts | Tests strawberry mod via pipeline build/apply. |
| mods/example_wild_strawberry_hp_up/package.json | Declares the example strawberry mod workspace package. |
| mods/2_3_choro_partset_skill_up/src/types.ts | Extracts summary/types for the Choro generator mod. |
| mods/2_3_choro_partset_skill_up/src/transform.ts | Extracts transform helpers; adds optional summon explain logic. |
| mods/2_3_choro_partset_skill_up/src/mod.ts | Refactors core mod logic to run in a PvfModSession, optionally consuming doll APC. |
| mods/2_3_choro_partset_skill_up/src/index.ts | Converts Choro generator into a PvfRegisteredMod export. |
| mods/2_3_choro_partset_skill_up/src/index.test.ts | Updates tests to use pipeline runner; adds tests for missing/overlaid prerequisite handling. |
| mods/2_3_choro_partset_skill_up/src/data.ts | Refactors data loading helpers to use PvfModSession and shared helpers. |
| mods/2_3_choro_partset_skill_up/src/constants.ts | Centralizes Choro mod constants (paths/ids/text). |
| mods/2_3_choro_partset_skill_up/src/cli.ts | Removes the old per-mod CLI entrypoint. |
| mods/2_3_choro_partset_skill_up/package.json | Updates dependencies to use @pvf/pvf-mod runtime/pipeline system. |
| docs/mod-pipeline-architecture.md | Adds maintainer-focused architecture/guardrails doc for the pipeline system. |
| apps/pvf-mod-cli/tsconfig.json | Typecheck config for the new pipeline CLI app. |
| apps/pvf-mod-cli/src/index.ts | Implements commander-based list/build/apply pipeline CLI + safe default outputs. |
| apps/pvf-mod-cli/src/index.test.ts | Tests CLI list/build behavior and default output path safety. |
| apps/pvf-mod-cli/src/cli.ts | Adds a small executable wrapper for runCli. |
| apps/pvf-mod-cli/package.json | Declares CLI app scripts and dependencies. |
| apps/pvf-explorer/src/pvf.ts | Switches explorer imports to workspace @pvf/pvf-core instead of relative source imports. |
| apps/pvf-explorer/src/fixture-store.ts | Updates TextProfile import to come from @pvf/pvf-core. |
| apps/pvf-explorer/package.json | Adds missing dependency on @pvf/pvf-core. |
| AGENTS.md | Adds repository “agent notes” pointing to pipeline docs and guardrails. |
| .gitignore | Ignores out/ directory produced by the new pipeline outputs. |
Files not reviewed (1)
- pnpm-lock.yaml: Language not supported
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| async readRenderedFile( | ||
| path: string, | ||
| textProfile: TextProfile = this.textProfile, | ||
| ): Promise<string> { | ||
| const normalizedPath = normalizeArchivePath(path); | ||
| const overlay = this.#overlays.get(normalizedPath); | ||
|
|
||
| if (overlay) { | ||
| if (overlay.delete) { | ||
| throw new Error(`Cannot read deleted overlay file ${normalizedPath}.`); | ||
| } | ||
|
|
||
| if (typeof overlay.content !== "string") { | ||
| throw new Error(`Overlay ${normalizedPath} is binary and cannot be rendered as text.`); | ||
| } | ||
|
|
||
| return overlay.content; | ||
| } |
There was a problem hiding this comment.
PvfModSession.readRenderedFile ignores the requested textProfile when the file comes from an overlay, returning the overlay string even if the caller asks for the other profile. This makes behavior inconsistent with PvfArchive.readRenderedFile and can silently return content in the wrong profile. Either enforce textProfile === this.textProfile for overlays (throw if different), or store/render overlays per profile so the parameter is honored.
602bf7f to
e14bb81
Compare
Summary
Testing