{"_id":"@dutifuldev/pi-factory","_rev":"3-0127028459534c093caf9126ccd5a186","name":"@dutifuldev/pi-factory","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@dutifuldev/pi-factory","version":"0.1.0","license":"MIT","_id":"@dutifuldev/pi-factory@0.1.0","maintainers":[{"name":"osolmaz","email":"onur@solmaz.io"}],"homepage":"https://github.com/dutifuldev/pi-factory#readme","bugs":{"url":"https://github.com/dutifuldev/pi-factory/issues"},"bin":{"pi-factory":"dist/src/cli/main.js"},"dist":{"shasum":"890b58c447650b1fe9c3932fc47f23a507af78d8","tarball":"https://registry.npmjs.org/@dutifuldev/pi-factory/-/pi-factory-0.1.0.tgz","fileCount":29,"integrity":"sha512-RzUiuE3Q5E+TlPAMBPiXwe+TvTu3AEnMAoj99emEmgHzWs976QYTqbU3EQ70vE6V+SgT1xAM7WUlpkDGQPmrNA==","signatures":[{"sig":"MEYCIQCkk0bNZFQKXzOMq7ikBJelGHwr9vl7pxaViaSnoYaUJwIhAM94G8lmn0jaAC2hUlEumg78mZWCAIkH7fRPgThP9A+w","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":73610},"type":"module","types":"dist/src/index.d.ts","exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"}},"gitHead":"5304dff946eaf1e212e6a4a60503c3e802698322","scripts":{"dry":"slophammer-ts dry .","lint":"eslint .","test":"vitest run","build":"tsc -p tsconfig.json","check":"npm run format && npm run lint && npm run typecheck && npm test && npm run coverage && npm run build && npm run dry && npm run boundaries && npm run slophammer","format":"prettier --check .","mutate":"stryker run","prepare":"npm run build","coverage":"vitest run --coverage","typecheck":"tsc --noEmit","boundaries":"slophammer-ts boundaries .","slophammer":"slophammer-ts check ."},"_npmUser":{"name":"osolmaz","email":"onur@solmaz.io"},"repository":{"url":"git+https://github.com/dutifuldev/pi-factory.git","type":"git"},"_npmVersion":"11.16.0","description":"Declarative Pi application bundle launcher.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"smol-toml":"^1.4.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0","vitest":"^3.0.0","prettier":"^3.0.0","@eslint/js":"^9.0.0","typescript":"^5.0.0","@types/node":"^22.0.0","slophammer-ts":"0.4.0","typescript-eslint":"^8.0.0","@vitest/coverage-v8":"^3.0.0","@stryker-mutator/core":"^9.6.1","@stryker-mutator/vitest-runner":"^9.6.1","@stryker-mutator/typescript-checker":"^9.6.1"},"_npmOperationalInternal":{"tmp":"tmp/pi-factory_0.1.0_1782302523264_0.8765770288026846","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.1.1":{"name":"@dutifuldev/pi-factory","version":"0.1.1","license":"MIT","_id":"@dutifuldev/pi-factory@0.1.1","maintainers":[{"name":"osolmaz","email":"onur@solmaz.io"}],"homepage":"https://github.com/dutifuldev/pi-factory#readme","bugs":{"url":"https://github.com/dutifuldev/pi-factory/issues"},"bin":{"pi-factory":"dist/src/cli/main.js"},"dist":{"shasum":"58c4a2cb1bd9445b3a66df062360f990e9db2063","tarball":"https://registry.npmjs.org/@dutifuldev/pi-factory/-/pi-factory-0.1.1.tgz","fileCount":29,"integrity":"sha512-VbwozCQPef3x54gOfk5YvL/jb82vqSrJjanb8wiKSp65xei8nnHK965hUAg8UZShpUU0Q8jK5KUvGot+qt63AQ==","signatures":[{"sig":"MEQCIAdxj5BO0LTZQxUCFRk9VqCBswsDOMTnAVjtlCDvdRFoAiB9/oSA6bHhAUURzyh2GCpCUlZfqqyf1RY6W8YM+jkdow==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dutifuldev%2fpi-factory@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":73689},"type":"module","types":"dist/src/index.d.ts","exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"}},"gitHead":"d2e839a64435e833f1b85b30ee5bc8597ae2d49b","scripts":{"dry":"slophammer-ts dry .","lint":"eslint .","test":"vitest run","build":"tsc -p tsconfig.json","check":"npm run format && npm run lint && npm run typecheck && npm test && npm run coverage && npm run build && npm run dry && npm run boundaries && npm run slophammer","format":"prettier --check .","mutate":"stryker run","prepare":"npm run build","coverage":"vitest run --coverage","typecheck":"tsc --noEmit","boundaries":"slophammer-ts boundaries .","slophammer":"slophammer-ts check ."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:186fc370-d9d5-4b5e-8219-62f3cb8d3cdd"}},"repository":{"url":"git+https://github.com/dutifuldev/pi-factory.git","type":"git"},"_npmVersion":"11.16.0","description":"Declarative Pi application bundle launcher.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"smol-toml":"^1.4.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0","vitest":"^3.0.0","prettier":"^3.0.0","@eslint/js":"^9.0.0","typescript":"^5.0.0","@types/node":"^22.0.0","slophammer-ts":"0.4.0","typescript-eslint":"^8.0.0","@vitest/coverage-v8":"^3.0.0","@stryker-mutator/core":"^9.6.1","@stryker-mutator/vitest-runner":"^9.6.1","@stryker-mutator/typescript-checker":"^9.6.1"},"_npmOperationalInternal":{"tmp":"tmp/pi-factory_0.1.1_1782310998690_0.6333159535509971","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."}},"time":{"created":"2026-06-24T12:02:03.066Z","modified":"2026-07-26T15:04:18.639Z","0.1.0":"2026-06-24T12:02:03.447Z","0.1.1":"2026-06-24T14:23:18.830Z"},"bugs":{"url":"https://github.com/dutifuldev/pi-factory/issues"},"license":"MIT","homepage":"https://github.com/dutifuldev/pi-factory#readme","repository":{"url":"git+https://github.com/dutifuldev/pi-factory.git","type":"git"},"description":"Declarative Pi application bundle launcher.","maintainers":[{"name":"osolmaz","email":"onur@solmaz.io"}],"readme":"# pi-factory\n\nPi Factory lets you develop and deploy isolated bundles of\n[Pi](https://pi.dev) for specific purposes.\n\nUse it when you want a named standalone Pi app with its own model/provider\nconfig, prompts, extensions, state directory, and session directory, while still\nusing Pi's normal CLI, TUI, model picker, slash commands, and extension SDK.\n\nPi Factory does not replace Pi and does not manage local model servers by\ndefault. App projects such as `localpi` decide how models are discovered or\nstarted; Pi Factory resolves the app bundle and launches Pi with the right\nconfig.\n\n## Install\n\nFrom npm:\n\n```bash\nnpm install -g @dutifuldev/pi-factory\n```\n\nDuring development:\n\n```bash\nnpm install\nnpm run build\nnode dist/src/cli/main.js --help\n```\n\n## Create an App Bundle\n\n```bash\npi-factory init my-app\n```\n\nThat creates:\n\n```text\nmy-app/\n  pi-factory.toml\n  prompts/system.md\n  extensions/\n```\n\nMinimal `pi-factory.toml`:\n\n```toml\nid = \"my-app\"\nname = \"My App\"\nversion = \"0.1.0\"\nschema_version = 1\nstate_dir = \"~/.local/state/my-app\"\npi_command = \"npx -y @earendil-works/pi-coding-agent@latest\"\nthinking = \"medium\"\ntools = [\"read\", \"bash\"]\nsystem_prompt = \"prompts/system.md\"\n\n[provider]\nid = \"local-openai\"\nbase_url = \"http://127.0.0.1:1234/v1\"\napi = \"openai-completions\"\n\n[model]\nid = \"auto\"\ncontext_window = 32768\nmax_tokens = 8192\nreasoning = false\n```\n\nAdd Pi extensions with normal Pi extension files:\n\n```toml\n[[extensions]]\npath = \"extensions/demo.ts\"\nappend_system_prompt = \"prompts/demo.md\"\n```\n\nPaths are relative to the app bundle root unless absolute.\n\n## Run\n\nInspect the resolved launch without starting Pi:\n\n```bash\npi-factory plan --app-dir ./my-app\n```\n\nValidate a bundle:\n\n```bash\npi-factory validate ./my-app\n```\n\nLaunch Pi through the app bundle:\n\n```bash\npi-factory run --app-dir ./my-app\n```\n\nThe launch writes Pi-compatible runtime config under the app state directory,\nthen starts the configured Pi command with environment variables such as\n`PI_CODING_AGENT_DIR` and `PI_CODING_AGENT_SESSION_DIR`.\n\n## Link and Install Apps\n\nFor local app bundles:\n\n```bash\npi-factory link /path/to/my-app\npi-factory run my-app\n```\n\nFor GitHub-hosted bundles:\n\n```bash\npi-factory install owner/repo[/subdir...] --ref main --yes\npi-factory run my-app\n```\n\nThere is no central registry. The app name comes from the installed bundle's\nmanifest `id`.\n\n## Commands\n\n```text\npi-factory init <app-id> [dir]\npi-factory validate <app-id|app-dir|app-file>\npi-factory plan <app-id>|--app-dir <dir>|--app-file <file>\npi-factory run <app-id>|--app-dir <dir>|--app-file <file>\npi-factory inspect <app-id>|--app-dir <dir>|--app-file <file>\npi-factory link <app-dir>\npi-factory install <owner>/<repo>[/subdir...] [--ref REF] [--yes]\npi-factory uninstall <app-id>\npi-factory list\n```\n\n## JavaScript API\n\n```ts\nimport {\n  createPiLaunchPlan,\n  loadPiApp,\n  manifestToDefinition,\n  runPiApp,\n  writePiRuntimeConfig\n} from \"pi-factory\";\n```\n\nUse the API when another launcher wants Pi Factory's app resolution and config\ngeneration but owns its own model discovery or local runtime setup.\n\n## More\n\n- [Specification](docs/spec.md)\n- [Manifest reference](docs/manifest-v1.md)\n\n## License\n\n[MIT](LICENSE)\n","readmeFilename":"README.md"}