feat(coding): add PI-105 product file host API
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
# Task: Implement PI-105 Pi Host API cutover
|
||||
|
||||
## Identity
|
||||
|
||||
- Task ID: 20260823-pi-host-cutover-c4e8a1d7
|
||||
- Mode: Feature
|
||||
- Branch: codex/20260823-pi-host-cutover-c4e8a1d7-pi-host-cutover
|
||||
- Worktree: D:\Datas\OthersProjects\makelore-pi-host-cutover-c4e8a1d7
|
||||
- Base commit: 7680bfb0cf206142a164b740d56f8be5ea59362a
|
||||
- Owner: codex
|
||||
- Status: In Progress
|
||||
|
||||
## Scope
|
||||
|
||||
- Implement `PI-105 — Files, changes, skills, and command Host API` from the
|
||||
`【架构】opencode2pi` Spec/ticket graph on cumulative PI-090 baseline
|
||||
`7680bfb0cf206142a164b740d56f8be5ea59362a`.
|
||||
- Add a Main-owned vendor-neutral Project File Service for active-project
|
||||
status, find, bounded content and bounded text search.
|
||||
- Add typed `/api/coding` routes for files, search, Conversation changes,
|
||||
managed Skills and the Conversation command catalog, plus the Renderer
|
||||
facade contract half owned by this ticket.
|
||||
- Compose those routes with the same production `PiProductTools`, attachment
|
||||
store and `ConversationChangeTracker` instances used by the Pi extension.
|
||||
|
||||
## Intent And Constraints
|
||||
|
||||
- All file inputs are active-project-relative. Reject absolute, traversal and
|
||||
project-external paths; never project the absolute project root or expose an
|
||||
arbitrary filesystem proxy.
|
||||
- Preserve the currently supported file/status/find/content/search UX while
|
||||
bounding file sizes, result counts and search output. Do not depend on the
|
||||
OpenCode runtime or its wire DTOs.
|
||||
- Conversation changes come only from the shared PI-090 tracker and are
|
||||
associated with the requested Conversation/run. Do not query Pi session
|
||||
diff, parse message text, or create a second tracker/state source.
|
||||
- Skills come only from packaged managed resources and the target Agent's
|
||||
explicit selection. Commands merge Makelore, valid Pi and selected-Skill
|
||||
entries with stable DTOs and Makelore-first deduplication.
|
||||
- The new `/api/coding` route/type/test surface contains no todo, share,
|
||||
revert/unrevert, checkpoint or file-rollback shape. Existing
|
||||
`/api/opencode` code remains untouched for PI-140 removal.
|
||||
- Exclude PI-100 project/Agent/Conversation CRUD, prompt, SSE, interactions and
|
||||
runtime diagnostics; exclude PI-110/120/130 Renderer state/UI work.
|
||||
- Do not invent an attachment read endpoint: neither PI-105 nor the normative
|
||||
route table assigns its transport.
|
||||
- Real external Provider verification remains **Explicitly Waived / Accepted
|
||||
Risk** with `realTurnVerified=false`; macOS x64/arm64 remains deferred to
|
||||
mandatory PI-150. Neither is a Pass.
|
||||
- Do not create subagents. Keep all writes in this isolated worktree and leave
|
||||
canonical project memory to a later integration task.
|
||||
|
||||
## Plan
|
||||
|
||||
1. Define the smallest vendor-neutral file/change/skill/command contracts and
|
||||
lock the supported file UX and path boundaries with focused tests.
|
||||
2. Implement the Main-owned Project File Service and the PI-105 leaf routes,
|
||||
including the minimal planner-approved
|
||||
`GET /api/coding/conversations/:id/changes` route.
|
||||
3. Wire one shared product-services composition into `HostApiContext`, route
|
||||
registration and Electron Main without taking PI-100 route ownership.
|
||||
4. Add focused service/route/facade/dispatcher/Electron seam coverage for path
|
||||
rejection, redaction, bounds, tracker identity and managed catalog rules.
|
||||
5. Run focused tests, typecheck, lint, full unit, Vite build, Windows Electron
|
||||
verification and project-document gates; commit and request planner review.
|
||||
|
||||
## Outcome
|
||||
|
||||
- Added shared vendor-neutral file/change/Skill/command DTOs and a typed
|
||||
Renderer facade for the seven PI-105 endpoints.
|
||||
- Added a Main-owned `CodingProjectFileService` with Git-aware discovery,
|
||||
bounded non-Git fallback, bounded UTF-8 previews/search, binary rejection,
|
||||
ignore-directory handling, and lexical/realpath containment.
|
||||
- Added the five normative file/search/Skill routes plus Conversation command
|
||||
and planner-approved changes routes. Known input errors are typed and
|
||||
unknown filesystem/service failures are redacted.
|
||||
- Added `CodingProductHost` composition and wired Electron Main to one shared
|
||||
attachment store, `PiProductTools`, and its single
|
||||
`ConversationChangeTracker`. The current active-project catalog is injected
|
||||
as a temporary project-selection adapter until PI-100 replaces composition;
|
||||
no OpenCode runtime call or fallback is used by the new service.
|
||||
- Product command projection is Makelore-first, accepts only safe Pi metadata,
|
||||
includes only selected managed Skills, and strips raw Pi/source/provider
|
||||
fields. The host has a `get_commands` result injection seam for PI-100's
|
||||
runtime composition.
|
||||
- Added focused unit and Windows Electron coverage for Git/non-Git files,
|
||||
Unicode truncation, path rejection/redaction, shared tracker identity,
|
||||
catalog filtering, seven route DTOs, Renderer encoding, and Main dispatcher.
|
||||
|
||||
## Verification
|
||||
|
||||
- `corepack pnpm exec vitest run tests/unit/coding-project-files.test.ts tests/unit/coding-product-services.test.ts tests/unit/coding-files-routes.test.ts tests/unit/coding-product-tools-facade.test.ts` — Pass, 4 files / 10 tests.
|
||||
- `corepack pnpm exec vitest run --config vitest.electron.config.ts tests/electron-runtime/coding-files-host.test.ts` — Pass, 1 file / 1 test (focused seam).
|
||||
- `corepack pnpm run typecheck` — Pass.
|
||||
- `corepack pnpm run lint:check` — Pass with 6 pre-existing warnings and no errors.
|
||||
- `corepack pnpm run build:vite` — Pass; existing dynamic-import/chunk-size warnings remain.
|
||||
- `corepack pnpm test` — Pass on clean rerun, 207 files / 2237 passed / 2 skipped. The first run had one Windows temporary-file `EPERM` and one async AI-hardware loading timeout; both passed when isolated and the complete suite then passed.
|
||||
- `corepack pnpm run test:electron:windows` — Pass, 3 files / 7 tests. A direct Vitest invocation was intentionally discarded because it bypassed the repository's local-Electron wrapper.
|
||||
- Real Provider verification — **Explicitly Waived / Accepted Risk**;
|
||||
`realTurnVerified=false`, not Pass.
|
||||
- macOS x64/arm64 — deferred to mandatory PI-150, not Pass.
|
||||
|
||||
## Follow-ups
|
||||
|
||||
- PI-100 must pass the target Conversation worker's read-only Pi
|
||||
`get_commands` projection into `createCodingProductHost.listPiCommands` when
|
||||
it composes the production `CodingConversationRuntime`. Until that runtime
|
||||
exists in Main, the route deterministically returns Makelore plus selected
|
||||
managed-Skill commands.
|
||||
- PI-100 should replace the injected current active-project catalog adapter
|
||||
with its vendor-neutral project service without changing the PI-105 host
|
||||
contract or creating another product-tools/change-tracker instance.
|
||||
|
||||
## Promotion Candidates
|
||||
|
||||
- None recorded.
|
||||
Reference in New Issue
Block a user