{"_id":"@alexleekt/pi-shared","_rev":"4-fdd41ffde0c8b74fcd566371af5189ab","name":"@alexleekt/pi-shared","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"@alexleekt/pi-shared","version":"0.1.0","author":{"name":"Alex Lee","email":"657215+alexleekt@users.noreply.github.com"},"license":"MIT","_id":"@alexleekt/pi-shared@0.1.0","maintainers":[{"name":"alexleekt","email":"stratrix@gmail.com"}],"homepage":"https://github.com/alexleekt/pi-extensions/tree/main/packages/pi-shared#readme","bugs":{"url":"https://github.com/alexleekt/pi-extensions/issues"},"dist":{"shasum":"648a61efd20464035ee52608eff33434df31daf5","tarball":"https://registry.npmjs.org/@alexleekt/pi-shared/-/pi-shared-0.1.0.tgz","fileCount":3,"integrity":"sha512-y+4hjnhpWXmG0yg0rE0srGQ6jB4uJuG4OS4ssTeGTi7uOlloocDqqZPIN0l/PafYq/KXOR8vpyIYeNeNg9o+cw==","signatures":[{"sig":"MEUCIQDD3u9I9ME1uqxFIzH83rxoHzGmPrh3/YZj2GGuskiMUQIgTZrkf3cWMgsmk2bRKs86o/iBt/eDcqPkottYX2uQQYs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4265},"type":"module","engines":{"node":">=18.0.0"},"exports":{"./types":"./types/pi.d.ts","./session":"./session.ts"},"gitHead":"f3aba9dd1d17790aab4c3578e3262fa3fed5dc64","scripts":{"typecheck":"tsc --noEmit"},"_npmUser":{"name":"alexleekt","email":"stratrix@gmail.com"},"repository":{"url":"git+https://github.com/alexleekt/pi-extensions.git","type":"git"},"_npmVersion":"11.13.0","description":"Shared types and utilities for Pi extensions","directories":{},"_nodeVersion":"25.9.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-shared_0.1.0_1778968404755_0.5466687255988711","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@alexleekt/pi-shared","version":"0.1.1","author":{"name":"Alex Lee","email":"657215+alexleekt@users.noreply.github.com"},"license":"MIT","_id":"@alexleekt/pi-shared@0.1.1","maintainers":[{"name":"alexleekt","email":"stratrix@gmail.com"}],"homepage":"https://github.com/alexleekt/pi-extensions/tree/main/packages/pi-shared#readme","bugs":{"url":"https://github.com/alexleekt/pi-extensions/issues"},"dist":{"shasum":"6f170f369a519e0324396df041d21f1ae0964bcc","tarball":"https://registry.npmjs.org/@alexleekt/pi-shared/-/pi-shared-0.1.1.tgz","fileCount":3,"integrity":"sha512-ISp48hEE87ELufaaOwxDFZ0sfDWIbQF14f/fBk3NJN6LomCNbpFoMHqQnt4Gacu7zF26rRfonUewz7iucTwVQw==","signatures":[{"sig":"MEQCIESZ1cMQjD8lk5TTW/3aPIUDM406j1UMQmxiIraG1SOCAiA6Mm39602D73Gu97suyGXpc1YKGuEuXOL6eM2TOS5/YQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@alexleekt%2fpi-shared@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4265},"type":"module","engines":{"node":">=18.0.0"},"exports":{"./types":"./types/pi.d.ts","./session":"./session.ts"},"gitHead":"0b02854437a976823609db625bc49402bd16339c","scripts":{"typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e4ba5180-af10-42bc-8542-87d1e83b9269"}},"repository":{"url":"git+https://github.com/alexleekt/pi-extensions.git","type":"git"},"_npmVersion":"11.12.1","description":"Shared types and utilities for Pi extensions","directories":{},"_nodeVersion":"24.15.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-shared_0.1.1_1778969597475_0.590171206190198","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@alexleekt/pi-shared","version":"0.1.2","keywords":["pi-package","pi-extension","shared","utilities","types"],"author":{"name":"Alex Lee","email":"657215+alexleekt@users.noreply.github.com"},"license":"MIT","_id":"@alexleekt/pi-shared@0.1.2","maintainers":[{"name":"alexleekt","email":"stratrix@gmail.com"}],"homepage":"https://github.com/alexleekt/pi-extensions/tree/main/packages/pi-shared#readme","bugs":{"url":"https://github.com/alexleekt/pi-extensions/issues"},"pi":{"skills":["skills/prompt-eval"]},"dist":{"shasum":"26f5b49b63e7c27058e53506adb4d536548a4404","tarball":"https://registry.npmjs.org/@alexleekt/pi-shared/-/pi-shared-0.1.2.tgz","fileCount":5,"integrity":"sha512-jYsgTQLQgQFx88/TRbZRiR96adJCyjOy/VWHiwwSc/6Pg1/2oxG+3dtvKeqV7Dy95LJg83z9IhUoy32PfM3t2Q==","signatures":[{"sig":"MEUCIGnXOePHRjG9vpzPprWn6gWDl4muFgTFAw7cHhEqsxsOAiEAzSuPBTznx6vBG4dW+mcmRiMuJlV2EK+M/nm5i+FtfSE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@alexleekt%2fpi-shared@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":30429},"type":"module","engines":{"node":">=18.0.0"},"exports":{"./types":"./types/pi.ts","./session":"./session.ts","./prompt-eval":"./prompt-eval.ts"},"gitHead":"40d30cf07a7f691c6e1bf94e61c6c47d678edd1a","scripts":{"typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e4ba5180-af10-42bc-8542-87d1e83b9269"}},"repository":{"url":"git+https://github.com/alexleekt/pi-extensions.git","type":"git"},"_npmVersion":"11.12.1","description":"Shared types and utilities for Pi extensions","directories":{},"_nodeVersion":"24.15.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-shared_0.1.2_1779342122883_0.760463510706503","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@alexleekt/pi-shared","version":"0.1.3","description":"The glue that holds the monorepo together. Shared types and utilities for Pi extensions.","type":"module","license":"MIT","keywords":["pi-package","pi-extension","pi","shared","utilities","types"],"author":{"name":"Alex Lee","email":"657215+alexleekt@users.noreply.github.com"},"repository":{"type":"git","url":"git+https://github.com/alexleekt/pi-extensions.git"},"homepage":"https://github.com/alexleekt/pi-extensions/tree/main/packages/pi-shared#readme","bugs":{"url":"https://github.com/alexleekt/pi-extensions/issues"},"publishConfig":{"access":"public"},"exports":{"./session":"./session.ts","./types":"./types/pi.ts","./prompt-eval":"./prompt-eval.ts"},"pi":{"skills":["skills/prompt-eval"]},"scripts":{"typecheck":"tsc --noEmit"},"peerDependencies":{"@earendil-works/pi-coding-agent":"*"},"engines":{"node":">=18.0.0"},"gitHead":"31d2e634af12a9494dcca66aebfde68803dd74ca","_id":"@alexleekt/pi-shared@0.1.3","_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-CblazKegsuHbBBpN+0NcxMe6ydAZCUFG1AR0hu8PHBnc6PHDOKQ0789cTbSQcjKRHHy2HHCCluY+fY/S8xQbiw==","shasum":"c60b85c3bf5e8496aa1f396f52513f86f0cdc8de","tarball":"https://registry.npmjs.org/@alexleekt/pi-shared/-/pi-shared-0.1.3.tgz","fileCount":6,"unpackedSize":33333,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@alexleekt%2fpi-shared@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCods/ycKPZDq5u/BXfrPee3KZYM1fDHHfu+PF5TXqS2gIgJb5Zer7C5xLx8mCFcKxfq6dlpzOTzlq32Jg4Pzc5Kgw="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e4ba5180-af10-42bc-8542-87d1e83b9269"}},"directories":{},"maintainers":[{"name":"alexleekt","email":"stratrix@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-shared_0.1.3_1779859109727_0.979131801266391"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-16T21:53:24.665Z","modified":"2026-05-27T05:18:30.156Z","0.1.0":"2026-05-16T21:53:24.880Z","0.1.1":"2026-05-16T22:13:17.622Z","0.1.2":"2026-05-21T05:42:03.093Z","0.1.3":"2026-05-27T05:18:29.867Z"},"bugs":{"url":"https://github.com/alexleekt/pi-extensions/issues"},"author":{"name":"Alex Lee","email":"657215+alexleekt@users.noreply.github.com"},"license":"MIT","homepage":"https://github.com/alexleekt/pi-extensions/tree/main/packages/pi-shared#readme","keywords":["pi-package","pi-extension","pi","shared","utilities","types"],"repository":{"type":"git","url":"git+https://github.com/alexleekt/pi-extensions.git"},"description":"The glue that holds the monorepo together. Shared types and utilities for Pi extensions.","maintainers":[{"name":"alexleekt","email":"stratrix@gmail.com"}],"readme":"# @alexleekt/pi-shared\n\n[![npm](https://img.shields.io/npm/v/@alexleekt/pi-shared)](https://www.npmjs.com/package/@alexleekt/pi-shared)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n\n> The glue that holds the monorepo together.\n\nShared types and utilities for Pi extensions in this monorepo.\n\n## Exports\n\n| Path | Description |\n|------|-------------|\n| `@alexleekt/pi-shared/session` | `manageSessionSubscription()` — per-session subscription lifecycle helper |\n| `@alexleekt/pi-shared/types` | Shared Pi extension type definitions |\n| `@alexleekt/pi-shared/prompt-eval` | Generalized prompt evaluation framework |\n\n## `@alexleekt/pi-shared/prompt-eval`\n\nA reusable framework for evaluating LLM prompts against test cases. Extracted from `pi-heading`'s duplicated `prompt-eval-*.ts` scripts.\n\n### Core types\n\n```typescript\nexport interface EvalSuite<T extends TestCase = TestCase> {\n  name: string;\n  testCases: T[];\n  promptBuilder: (testCase: T) => PromptMessage;   // { system, user, maxTokens }\n  extractMode: \"json\" | \"raw\";\n  scorers: Scorer<T>[];\n  modelConfig?: ModelConfig;\n}\n\nexport type Scorer<T extends TestCase = TestCase> = (params: {\n  text: string;      // extracted result\n  raw: string;       // raw LLM output\n  testCase: T;\n}) => ScoreResult;\n```\n\n### Key functions\n\n| Function | Purpose |\n|----------|---------|\n| `runSuite(suite, model)` | Evaluate all test cases, score outputs, print progress |\n| `generateReport(results, suite, model)` | Build markdown report string |\n| `callLLM(system, user, model, config?)` | Call local proxy with retry |\n| `extractResult(raw)` | Parse `{\"result\": \"...\"}` or fall back to raw |\n| `optimizeSuite(factory, promptPath, config)` | Iterative prompt optimization loop |\n\n### Built-in scorers\n\n```typescript\nscorers.wordCount(max)\nscorers.withinLimit(max)\nscorers.noMetaCommentary()\nscorers.noQuotes()\nscorers.noMarkdown()\nscorers.validJson()\nscorers.presentContinuous()\nscorers.pastTense()\nscorers.noTrailingPeriod()\nscorers.concise(threshold)\nscorers.alignsWithExpected(field, threshold)\nscorers.echoesGoal(goalField, threshold)\nscorers.specificConcrete()\nscorers.noVagueFiller()\n```\n\n### Iterative optimization\n\n```typescript\nimport { optimizeSuite } from \"@alexleekt/pi-shared/prompt-eval\";\n\nconst result = await optimizeSuite(\n  (promptText) => mySuiteFactory(promptText),   // factory builds EvalSuite from prompt text\n  \"/path/to/prompt.md\",                         // file to mutate in-place\n  {\n    desirableOutcome: \"Concise past-tense summaries under 12 words, no meta-commentary\",\n    targetPassRate: 85,\n    maxIterations: 5,\n    evalModel: \"firepass\",\n    criticModel: \"firepass\",\n  }\n);\n```\n\nThe optimization loop:\n1. Load prompt from file\n2. Run suite → check pass rate\n3. If below target, collect top N failing cases\n4. Call critic LLM with failures + desirable outcome description\n5. Write revised prompt back to file\n6. Repeat until target met or max iterations\n\n## License\n\nMIT\n","readmeFilename":"README.md"}