7.2 KiB
7.2 KiB
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:
7680bfb0cf - Owner: codex
- Status: Done
Scope
- Implement
PI-105 — Files, changes, skills, and command Host APIfrom the【架构】opencode2piSpec/ticket graph on cumulative PI-090 baseline7680bfb0cf206142a164b740d56f8be5ea59362a. - Add a Main-owned vendor-neutral Project File Service for active-project status, find, bounded content and bounded text search.
- Add typed
/api/codingroutes 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 andConversationChangeTrackerinstances 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/codingroute/type/test surface contains no todo, share, revert/unrevert, checkpoint or file-rollback shape. Existing/api/opencodecode 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
- Define the smallest vendor-neutral file/change/skill/command contracts and lock the supported file UX and path boundaries with focused tests.
- Implement the Main-owned Project File Service and the PI-105 leaf routes,
including the minimal planner-approved
GET /api/coding/conversations/:id/changesroute. - Wire one shared product-services composition into
HostApiContext, route registration and Electron Main without taking PI-100 route ownership. - Add focused service/route/facade/dispatcher/Electron seam coverage for path rejection, redaction, bounds, tracker identity and managed catalog rules.
- 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
CodingProjectFileServicewith 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
CodingProductHostcomposition and wired Electron Main to one shared attachment store,PiProductTools, and its singleConversationChangeTracker. 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_commandsresult 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.
- Architecture review reproduced two reachable parity gaps in the first
implementation commit. The follow-up recognizes porcelain-v2 unmerged
records as
conflictedin both file status and target-run changes, and maps length-changing Unicode case-fold indices back to the original line before returning search submatches. Both failures now have real regression tests.
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 / 12 tests after review fixes.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 after review fixes, 207 files / 2239 passed / 2 skipped. The first pre-review run had one Windows temporary-fileEPERMand one async AI-hardware loading timeout; both passed when isolated and complete-suite reruns 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.- Planner incremental acceptance review through
81c3c5b— PASS; Standards 0 findings, Spec 0 findings. The review confirmed porcelain-v2 conflict projection, original-coordinate Unicode matching, contextual Greek case folding, shared composition, the temporary active-project adapter and the PI-100 live-get_commandsseam. - 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_commandsprojection intocreateCodingProductHost.listPiCommandswhen it composes the productionCodingConversationRuntime. 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.