From 439cd89c278b3483f20071bc5124ed7cdcb9ace2 Mon Sep 17 00:00:00 2001 From: pi Date: Sat, 11 Apr 2026 02:09:46 +0100 Subject: [PATCH] chore: polish pi-question package manifest and README for packaging/tests --- README.md | 10 +++++++--- package-manifest.test.mjs | 35 +++++++++++++++++++++++++++++++++++ package.json | 5 +++++ 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e15a4c4..0b8ef48 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,20 @@ # pi-question -`pi-question` is a Pi extension package that provides a multi-question interactive choice flow with built-in support for a final free-text “Something else…” answer. +`pi-question` is a Pi extension package that provides a multi-question interactive choice flow with a built-in final free-text "Something else..." answer. ## Install -Use it as a local package root today: +Local path: ```bash pi install /absolute/path/to/question ``` -After this folder is moved into its own repository, the same package can be installed from git. +Git: + +```bash +pi install https://gitea.rwiesner.com/pi/pi-question +``` ## Resources diff --git a/package-manifest.test.mjs b/package-manifest.test.mjs index 4fd0c3c..562aea4 100644 --- a/package-manifest.test.mjs +++ b/package-manifest.test.mjs @@ -1,17 +1,38 @@ import test from "node:test"; import assert from "node:assert/strict"; +import { execFileSync } from "node:child_process"; import { existsSync, readFileSync } from "node:fs"; import { dirname, resolve } from "node:path"; import { fileURLToPath } from "node:url"; const packageRoot = dirname(fileURLToPath(import.meta.url)); const pkg = JSON.parse(readFileSync(resolve(packageRoot, "package.json"), "utf8")); +const readme = readFileSync(resolve(packageRoot, "README.md"), "utf8"); + +function getPackedPaths() { + const output = execFileSync("npm", ["pack", "--dry-run", "--json"], { + cwd: packageRoot, + encoding: "utf8", + stdio: ["ignore", "pipe", "pipe"], + timeout: 30_000, + }); + const [packResult] = JSON.parse(output); + return packResult.files.map((file) => file.path); +} test("package.json exposes pi-question as a standalone pi package", () => { assert.equal(pkg.name, "pi-question"); assert.equal(pkg.type, "module"); + assert.equal( + pkg.description, + 'Pi extension package that provides a multi-question interactive choice flow with a built-in final free-text "Something else..." answer.', + ); assert.ok(Array.isArray(pkg.keywords)); assert.ok(pkg.keywords.includes("pi-package")); + assert.deepEqual(pkg.repository, { + type: "git", + url: "https://gitea.rwiesner.com/pi/pi-question", + }); assert.deepEqual(pkg.pi, { extensions: ["./index.ts"], }); @@ -26,3 +47,17 @@ test("package.json exposes pi-question as a standalone pi package", () => { assert.ok(existsSync(resolve(packageRoot, "index.ts"))); assert.ok(existsSync(resolve(packageRoot, "question-core.mjs"))); }); + +test("README documents local and git installation", () => { + assert.match(readme, /pi install \/absolute\/path\/to\/question/); + assert.match(readme, /pi install https:\/\/gitea\.rwiesner\.com\/pi\/pi-question/); +}); + +test("npm pack includes runtime package assets", () => { + const packedPaths = getPackedPaths(); + + assert.ok(packedPaths.includes("README.md")); + assert.ok(packedPaths.includes("package.json")); + assert.ok(packedPaths.includes("index.ts")); + assert.ok(packedPaths.includes("question-core.mjs")); +}); diff --git a/package.json b/package.json index 3acb583..c1a419b 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,13 @@ { "name": "pi-question", "version": "0.1.0", + "description": "Pi extension package that provides a multi-question interactive choice flow with a built-in final free-text \"Something else...\" answer.", "type": "module", "keywords": ["pi-package"], + "repository": { + "type": "git", + "url": "https://gitea.rwiesner.com/pi/pi-question" + }, "scripts": { "test": "tsx --test *.test.mjs" },