fix(pi): bundle AI backbone into generated/ for published package

@plannotator/ai is a private workspace package unavailable on npm.
Pi's dynamic import silently failed, so AI features never loaded for
published package users. Now copies all AI files into generated/ai/
at build time, same pattern as the shared utils.

For provenance purposes, this commit was AI assisted.
This commit is contained in:
Michael Ramos
2026-03-25 00:22:33 -07:00
parent f2a05ece4f
commit 1175ef65c1
4 changed files with 25 additions and 9 deletions
+9 -1
View File
@@ -38,11 +38,19 @@ jobs:
- name: Generate Pi extension shared copies
run: |
cd apps/pi-extension
mkdir -p generated
mkdir -p generated generated/ai/providers
for f in feedback-templates review-core storage draft project pr-provider pr-github pr-gitlab checklist integrations-common repo reference-common favicon resolve-file; do
src="../../packages/shared/$f.ts"
printf '// @generated — DO NOT EDIT. Source: packages/shared/%s.ts\n' "$f" | cat - "$src" > "generated/$f.ts"
done
for f in index types provider session-manager endpoints context base-session; do
src="../../packages/ai/$f.ts"
printf '// @generated — DO NOT EDIT. Source: packages/ai/%s.ts\n' "$f" | cat - "$src" > "generated/ai/$f.ts"
done
for f in claude-agent-sdk codex-sdk opencode-sdk pi-sdk pi-sdk-node pi-events; do
src="../../packages/ai/providers/$f.ts"
printf '// @generated — DO NOT EDIT. Source: packages/ai/providers/%s.ts\n' "$f" | cat - "$src" > "generated/ai/providers/$f.ts"
done
- name: Type check
run: bun run typecheck
+9 -1
View File
@@ -25,11 +25,19 @@ jobs:
- name: Generate Pi extension shared copies
run: |
cd apps/pi-extension
mkdir -p generated
mkdir -p generated generated/ai/providers
for f in feedback-templates review-core storage draft project pr-provider pr-github pr-gitlab checklist integrations-common repo reference-common favicon resolve-file; do
src="../../packages/shared/$f.ts"
printf '// @generated — DO NOT EDIT. Source: packages/shared/%s.ts\n' "$f" | cat - "$src" > "generated/$f.ts"
done
for f in index types provider session-manager endpoints context base-session; do
src="../../packages/ai/$f.ts"
printf '// @generated — DO NOT EDIT. Source: packages/ai/%s.ts\n' "$f" | cat - "$src" > "generated/ai/$f.ts"
done
for f in claude-agent-sdk codex-sdk opencode-sdk pi-sdk pi-sdk-node pi-events; do
src="../../packages/ai/providers/$f.ts"
printf '// @generated — DO NOT EDIT. Source: packages/ai/providers/%s.ts\n' "$f" | cat - "$src" > "generated/ai/providers/$f.ts"
done
- name: Type check
run: bun run typecheck
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@plannotator/pi-extension",
"version": "0.15.0",
"version": "0.15.1",
"type": "module",
"description": "Plannotator extension for Pi coding agent - interactive plan review with visual annotation",
"author": "backnotprop",
@@ -28,7 +28,7 @@
"review-editor.html"
],
"scripts": {
"build": "cp ../hook/dist/index.html plannotator.html && cp ../hook/dist/review.html review-editor.html && mkdir -p generated && for f in feedback-templates review-core storage draft project pr-provider pr-github pr-gitlab checklist integrations-common repo reference-common favicon resolve-file; do src=\"../../packages/shared/$f.ts\"; printf '// @generated — DO NOT EDIT. Source: packages/shared/%s.ts\\n' \"$f\" | cat - \"$src\" > \"generated/$f.ts\"; done",
"build": "cp ../hook/dist/index.html plannotator.html && cp ../hook/dist/review.html review-editor.html && mkdir -p generated && for f in feedback-templates review-core storage draft project pr-provider pr-github pr-gitlab checklist integrations-common repo reference-common favicon resolve-file; do src=\"../../packages/shared/$f.ts\"; printf '// @generated — DO NOT EDIT. Source: packages/shared/%s.ts\\n' \"$f\" | cat - \"$src\" > \"generated/$f.ts\"; done && mkdir -p generated/ai/providers && for f in index types provider session-manager endpoints context base-session; do src=\"../../packages/ai/$f.ts\"; printf '// @generated — DO NOT EDIT. Source: packages/ai/%s.ts\\n' \"$f\" | cat - \"$src\" > \"generated/ai/$f.ts\"; done && for f in claude-agent-sdk codex-sdk opencode-sdk pi-sdk pi-sdk-node pi-events; do src=\"../../packages/ai/providers/$f.ts\"; printf '// @generated — DO NOT EDIT. Source: packages/ai/providers/%s.ts\\n' \"$f\" | cat - \"$src\" > \"generated/ai/providers/$f.ts\"; done",
"prepublishOnly": "cd ../.. && bun run build:pi"
},
"peerDependencies": {
+5 -5
View File
@@ -156,7 +156,7 @@ export async function startReviewServer(options: {
let aiSessionManager: { disposeAll: () => void } | null = null;
let aiRegistry: { disposeAll: () => void } | null = null;
try {
const ai = await import("@plannotator/ai");
const ai = await import("../generated/ai/index.js");
const registry = new ai.ProviderRegistry();
const sessionManager = new ai.SessionManager();
@@ -177,7 +177,7 @@ export async function startReviewServer(options: {
// Claude Agent SDK
try {
// @ts-ignore — dynamic import; Bun-only types resolved at runtime
await import("@plannotator/ai/providers/claude-agent-sdk");
await import("../generated/ai/providers/claude-agent-sdk.js");
const claudePath = whichCmd("claude");
const provider = await ai.createProvider({
type: "claude-agent-sdk",
@@ -192,7 +192,7 @@ export async function startReviewServer(options: {
// Codex SDK
try {
// @ts-ignore — dynamic import; Bun-only types resolved at runtime
await import("@plannotator/ai/providers/codex-sdk");
await import("../generated/ai/providers/codex-sdk.js");
await import("@openai/codex-sdk");
const codexPath = whichCmd("codex");
const provider = await ai.createProvider({
@@ -207,7 +207,7 @@ export async function startReviewServer(options: {
// Pi SDK (Node.js variant)
try {
await import("@plannotator/ai/providers/pi-sdk-node");
await import("../generated/ai/providers/pi-sdk-node.js");
const piPath = whichCmd("pi");
if (piPath) {
const provider = await ai.createProvider({
@@ -229,7 +229,7 @@ export async function startReviewServer(options: {
// OpenCode SDK
try {
// @ts-ignore — dynamic import; Bun-only types resolved at runtime
await import("@plannotator/ai/providers/opencode-sdk");
await import("../generated/ai/providers/opencode-sdk.js");
const opencodePath = whichCmd("opencode");
if (opencodePath) {
const provider = await ai.createProvider({