pi-skill-shiori 0.6.17 → 0.6.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,19 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## [0.6.19] - 2026-11-07
6
+
7
+ ### Changed
8
+
9
+ - Pin the Pi SDK development and smoke-test dependencies to 1.5.0 and align the direct TypeBox dependency with the SDK's 1.3.27 pin.
10
+ - Add an actual Pi SDK host integration test that calls the TypeBox-backed `shiori_recommend` and `shiori_load_skill` tools through Pi with valid and missing arguments.
11
+
12
+ ## [0.6.18] - 2026-11-02
13
+
14
+ ### Changed
15
+
16
+ - Share one UTF-8 skill-body loader between recommendation and explicit skill loading.
17
+
5
18
  ## [0.6.17] - 2026-10-24
6
19
 
7
20
  ### Changed
package/README.md CHANGED
@@ -19,7 +19,7 @@ For maintenance priorities and the phased plan, see [`ROADMAP.md`](ROADMAP.md).
19
19
 
20
20
  Pi Skill Shiori is a [Pi](https://pi.dev/) package for vaults or projects with many Agent Skills where the default catalog becomes noisy and expensive. It hides the normal skill catalog when safe, recommends triggerable skills with compact summaries, and loads full `SKILL.md` bodies on demand.
21
21
 
22
- `0.6.17` is the current working release. Prompt-boundary suppression is intentionally conservative: if Shiori cannot safely recognize a catalog boundary, it leaves the prompt untouched and warns instead of deleting too much.
22
+ `0.6.19` is the current working release. Prompt-boundary suppression is intentionally conservative: if Shiori cannot safely recognize a catalog boundary, it leaves the prompt untouched and warns instead of deleting too much.
23
23
 
24
24
  ## Features
25
25
 
@@ -38,7 +38,7 @@ Pi Skill Shiori is a [Pi](https://pi.dev/) package for vaults or projects with m
38
38
  ### Global install from npm
39
39
 
40
40
  ```bash
41
- pi install npm:pi-skill-shiori@0.6.17
41
+ pi install npm:pi-skill-shiori@0.6.19
42
42
  ```
43
43
 
44
44
  Without a version pin:
@@ -50,7 +50,7 @@ pi install npm:pi-skill-shiori
50
50
  ### Project-local install from npm
51
51
 
52
52
  ```bash
53
- pi install -l npm:pi-skill-shiori@0.6.17
53
+ pi install -l npm:pi-skill-shiori@0.6.19
54
54
  ```
55
55
 
56
56
  Without a version pin:
@@ -62,7 +62,7 @@ pi install -l npm:pi-skill-shiori
62
62
  ### Install from GitHub
63
63
 
64
64
  ```bash
65
- pi install git:github.com/eiei114/pi-skill-shiori@v0.6.17
65
+ pi install git:github.com/eiei114/pi-skill-shiori@v0.6.19
66
66
  pi install -l git:github.com/eiei114/pi-skill-shiori
67
67
  ```
68
68
 
@@ -2,10 +2,10 @@
2
2
  "schema_version": 1,
3
3
  "verification_contract": "pi-sdk-behavior-v2",
4
4
  "sdk_versions": {
5
- "@earendil-works/pi-agent-core": "1.2.0",
6
- "@earendil-works/pi-ai": "1.2.0",
7
- "@earendil-works/pi-coding-agent": "1.2.0",
8
- "@earendil-works/pi-tui": "1.2.0"
5
+ "@earendil-works/pi-agent-core": "1.5.0",
6
+ "@earendil-works/pi-ai": "1.5.0",
7
+ "@earendil-works/pi-coding-agent": "1.5.0",
8
+ "@earendil-works/pi-tui": "1.5.0"
9
9
  },
10
10
  "platform": "win32",
11
11
  "model_inference": "none; actual Pi host executes local Shiori slash commands in RPC mode",
@@ -18,7 +18,7 @@
18
18
  "command": "npm run smoke:pi (actual locally pinned Pi RPC host and Shiori extension)",
19
19
  "exit_code": 0,
20
20
  "passed": true,
21
- "evidence": "[extension_load] Pi SDK 1.2.0\n[first process stdout]\n{\"id\":\"load-commands\",\"type\":\"response\",\"command\":\"get_commands\",\"success\":true,\"data\":{\"commands\":[{\"name\":\"shiori:doctor\",\"description\":\"Show Pi Skill Shiori configuration and inventory status\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:reload\",\"description\":\"Rebuild Pi Skill Shiori inventory and optional Pi runtime resources\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:recommend\",\"description\":\"Recommend Agent Skills for a natural-language task and queue it for the agent\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:stats\",\"description\":\"Show Pi Skill Shiori operational counters and recommendation feedback\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:bootstrap\",\"description\":\"Generate a review policy draft from discovered skill descriptions\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}}]}}\n\n[first process stderr]\n",
21
+ "evidence": "[extension_load] Pi SDK 1.5.0\n[first process stdout]\n{\"id\":\"load-commands\",\"type\":\"response\",\"command\":\"get_commands\",\"success\":true,\"data\":{\"commands\":[{\"name\":\"shiori:doctor\",\"description\":\"Show Pi Skill Shiori configuration and inventory status\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:reload\",\"description\":\"Rebuild Pi Skill Shiori inventory and optional Pi runtime resources\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:recommend\",\"description\":\"Recommend Agent Skills for a natural-language task and queue it for the agent\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:stats\",\"description\":\"Show Pi Skill Shiori operational counters and recommendation feedback\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:bootstrap\",\"description\":\"Generate a review policy draft from discovered skill descriptions\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}}]}}\n\n[first process stderr]\n",
22
22
  "assertions": [
23
23
  {
24
24
  "id": "extension_registered",
@@ -33,7 +33,7 @@
33
33
  "command": "npm run smoke:pi (actual locally pinned Pi RPC host and Shiori extension)",
34
34
  "exit_code": 0,
35
35
  "passed": true,
36
- "evidence": "[happy_path] Pi SDK 1.2.0\n[first process stdout]\n{\"id\":\"happy-commands\",\"type\":\"response\",\"command\":\"get_commands\",\"success\":true,\"data\":{\"commands\":[{\"name\":\"shiori:doctor\",\"description\":\"Show Pi Skill Shiori configuration and inventory status\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:reload\",\"description\":\"Rebuild Pi Skill Shiori inventory and optional Pi runtime resources\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:recommend\",\"description\":\"Recommend Agent Skills for a natural-language task and queue it for the agent\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:stats\",\"description\":\"Show Pi Skill Shiori operational counters and recommendation feedback\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:bootstrap\",\"description\":\"Generate a review policy draft from discovered skill descriptions\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}}]}}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"input\",\"title\":\"What do you want help with?\",\"placeholder\":\"Describe your task in natural language…\"}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"select\",\"title\":\"How should Shiori use these recommendations?\",\"options\":[\"Pre-load matches and queue task for agent\",\"Review recommendations only\",\"Cancel\"]}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"notify\",\"message\":\"Matched 1 skill(s): smoke-skill [trigger]\",\"notifyType\":\"info\"}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"select\",\"title\":\"Follow up on a recommendation:\",\"options\":[\"smoke-skill [trigger]\",\"Done\"]}\n{\"id\":\"happy-prompt\",\"type\":\"response\",\"command\":\"prompt\",\"success\":true,\"data\":{\"disposition\":\"handled\"}}\n\n[first process stderr]\n",
36
+ "evidence": "[happy_path] Pi SDK 1.5.0\n[first process stdout]\n{\"id\":\"happy-commands\",\"type\":\"response\",\"command\":\"get_commands\",\"success\":true,\"data\":{\"commands\":[{\"name\":\"shiori:doctor\",\"description\":\"Show Pi Skill Shiori configuration and inventory status\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:reload\",\"description\":\"Rebuild Pi Skill Shiori inventory and optional Pi runtime resources\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:recommend\",\"description\":\"Recommend Agent Skills for a natural-language task and queue it for the agent\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:stats\",\"description\":\"Show Pi Skill Shiori operational counters and recommendation feedback\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:bootstrap\",\"description\":\"Generate a review policy draft from discovered skill descriptions\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}}]}}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"input\",\"title\":\"What do you want help with?\",\"placeholder\":\"Describe your task in natural language…\"}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"select\",\"title\":\"How should Shiori use these recommendations?\",\"options\":[\"Pre-load matches and queue task for agent\",\"Review recommendations only\",\"Cancel\"]}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"notify\",\"message\":\"Matched 1 skill(s): smoke-skill [trigger]\",\"notifyType\":\"info\"}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"select\",\"title\":\"Follow up on a recommendation:\",\"options\":[\"smoke-skill [trigger]\",\"Done\"]}\n{\"id\":\"happy-prompt\",\"type\":\"response\",\"command\":\"prompt\",\"success\":true,\"data\":{\"disposition\":\"handled\"}}\n\n[first process stderr]\n",
37
37
  "assertions": [
38
38
  {
39
39
  "id": "feature_response",
@@ -48,7 +48,7 @@
48
48
  "command": "npm run smoke:pi (actual locally pinned Pi RPC host and Shiori extension)",
49
49
  "exit_code": 0,
50
50
  "passed": true,
51
- "evidence": "[error_path] Pi SDK 1.2.0\n[first process stdout]\n{\"id\":\"error-commands\",\"type\":\"response\",\"command\":\"get_commands\",\"success\":true,\"data\":{\"commands\":[{\"name\":\"shiori:doctor\",\"description\":\"Show Pi Skill Shiori configuration and inventory status\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:reload\",\"description\":\"Rebuild Pi Skill Shiori inventory and optional Pi runtime resources\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:recommend\",\"description\":\"Recommend Agent Skills for a natural-language task and queue it for the agent\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:stats\",\"description\":\"Show Pi Skill Shiori operational counters and recommendation feedback\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:bootstrap\",\"description\":\"Generate a review policy draft from discovered skill descriptions\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}}]}}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"input\",\"title\":\"What do you want help with?\",\"placeholder\":\"Describe your task in natural language…\"}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"notify\",\"message\":\"Recommendation cancelled.\",\"notifyType\":\"info\"}\n{\"id\":\"error-prompt\",\"type\":\"response\",\"command\":\"prompt\",\"success\":true,\"data\":{\"disposition\":\"handled\"}}\n\n[first process stderr]\n",
51
+ "evidence": "[error_path] Pi SDK 1.5.0\n[first process stdout]\n{\"id\":\"error-commands\",\"type\":\"response\",\"command\":\"get_commands\",\"success\":true,\"data\":{\"commands\":[{\"name\":\"shiori:doctor\",\"description\":\"Show Pi Skill Shiori configuration and inventory status\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:reload\",\"description\":\"Rebuild Pi Skill Shiori inventory and optional Pi runtime resources\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:recommend\",\"description\":\"Recommend Agent Skills for a natural-language task and queue it for the agent\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:stats\",\"description\":\"Show Pi Skill Shiori operational counters and recommendation feedback\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:bootstrap\",\"description\":\"Generate a review policy draft from discovered skill descriptions\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}}]}}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"input\",\"title\":\"What do you want help with?\",\"placeholder\":\"Describe your task in natural language…\"}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"notify\",\"message\":\"Recommendation cancelled.\",\"notifyType\":\"info\"}\n{\"id\":\"error-prompt\",\"type\":\"response\",\"command\":\"prompt\",\"success\":true,\"data\":{\"disposition\":\"handled\"}}\n\n[first process stderr]\n",
52
52
  "assertions": [
53
53
  {
54
54
  "id": "handled_error",
@@ -63,7 +63,7 @@
63
63
  "command": "npm run smoke:pi (actual locally pinned Pi RPC host and Shiori extension)",
64
64
  "exit_code": 0,
65
65
  "passed": true,
66
- "evidence": "[reload sequence]\nfirst process:\n reload-stats-before: success=true disposition=handled\n reload-inventory: success=true disposition=handled\n reload-stats-after: success=true disposition=handled\n reload-recommend: success=true disposition=handled\n firstExitCode=0\nsecond process:\n reload-recommend: success=true disposition=handled\n secondExitCode=0\n[reload_cleanup] Pi SDK 1.2.0\n[first process stdout]\n{\"id\":\"reload-first-commands\",\"type\":\"response\",\"command\":\"get_commands\",\"success\":true,\"data\":{\"commands\":[{\"name\":\"shiori:doctor\",\"description\":\"Show Pi Skill Shiori configuration and inventory status\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:reload\",\"description\":\"Rebuild Pi Skill Shiori inventory and optional Pi runtime resources\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:recommend\",\"description\":\"Recommend Agent Skills for a natural-language task and queue it for the agent\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:stats\",\"description\":\"Show Pi Skill Shiori operational counters and recommendation feedback\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:bootstrap\",\"description\":\"Generate a review policy draft from discovered skill descriptions\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}}]}}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"notify\",\"message\":\"Recommendation feedback (session-local, no prompts stored)\\noffers: 0 | candidate slots: 0 | loaded: 0\\nabandoned: 0 | zero-candidate queries: 0 | follow-through: n/a\\nTiming (session-local) | inventory refresh: count=1 last=<DURATION> total=<DURATION> max=<DURATION> | retrieval: count=0 last=<DURATION> total=<DURATION> max=<DURATION>\\n\\n{\\n \\\"inventoryCount\\\": 1,\\n \\\"duplicateCount\\\": 0,\\n \\\"candidateHitCount\\\": 0,\\n \\\"zeroCandidateCount\\\": 0,\\n \\\"loadedSkillCount\\\": 0,\\n \\\"explicitInvocationCount\\\": 0,\\n \\\"retrievalBackend\\\": \\\"sqlite-fts\\\",\\n \\\"suppressionStatus\\\": \\\"disabled\\\",\\n \\\"inventoryRefreshCount\\\": 1,\\n \\\"inventoryAutoRefreshCount\\\": 0,\\n \\\"timing\\\": {\\n \\\"inventoryRefresh\\\": {\\n \\\"lastMs\\\": \"<DURATION>\",\\n \\\"totalMs\\\": \"<DURATION>\",\\n \\\"maxMs\\\": \"<DURATION>\",\\n \\\"count\\\": 1\\n },\\n \\\"retrieval\\\": {\\n \\\"lastMs\\\": \"<DURATION>\",\\n \\\"totalMs\\\": \"<DURATION>\",\\n \\\"maxMs\\\": \"<DURATION>\",\\n \\\"count\\\": 0\\n }\\n },\\n \\\"lastReloadAt\\\": \\\"<TIMESTAMP>\\\",\\n \\\"recommendationFeedback\\\": {\\n \\\"totalOffers\\\": 0,\\n \\\"totalCandidateSlots\\\": 0,\\n \\\"totalLoaded\\\": 0,\\n \\\"totalAbandoned\\\": 0,\\n \\\"zeroCandidateQueries\\\": 0,\\n \\\"followThroughRate\\\": null,\\n \\\"bySource\\\": {\\n \\\"auto-inject\\\": {\\n \\\"offers\\\": 0,\\n \\\"candidateSlots\\\": 0,\\n \\\"loaded\\\": 0,\\n \\\"zeroHits\\\": 0\\n },\\n \\\"command\\\": {\\n \\\"offers\\\": 0,\\n \\\"candidateSlots\\\": 0,\\n \\\"loaded\\\": 0,\\n \\\"zeroHits\\\": 0\\n },\\n \\\"tool\\\": {\\n \n…[elided 3910 characters]…\n,\"command\":\"prompt\",\"success\":true,\"data\":{\"disposition\":\"handled\"}}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"input\",\"title\":\"What do you want help with?\",\"placeholder\":\"Describe your task in natural language…\"}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"select\",\"title\":\"How should Shiori use these recommendations?\",\"options\":[\"Pre-load matches and queue task for agent\",\"Review recommendations only\",\"Cancel\"]}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"notify\",\"message\":\"Matched 1 skill(s): smoke-skill [trigger]\",\"notifyType\":\"info\"}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"select\",\"title\":\"Follow up on a recommendation:\",\"options\":[\"smoke-skill [trigger]\",\"Done\"]}\n{\"id\":\"reload-recommend\",\"type\":\"response\",\"command\":\"prompt\",\"success\":true,\"data\":{\"disposition\":\"handled\"}}\n\n[first process stderr]\n\n[second process stdout]\n{\"id\":\"reload-second-commands\",\"type\":\"response\",\"command\":\"get_commands\",\"success\":true,\"data\":{\"commands\":[{\"name\":\"shiori:doctor\",\"description\":\"Show Pi Skill Shiori configuration and inventory status\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:reload\",\"description\":\"Rebuild Pi Skill Shiori inventory and optional Pi runtime resources\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:recommend\",\"description\":\"Recommend Agent Skills for a natural-language task and queue it for the agent\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:stats\",\"description\":\"Show Pi Skill Shiori operational counters and recommendation feedback\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:bootstrap\",\"description\":\"Generate a review policy draft from discovered skill descriptions\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}}]}}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"input\",\"title\":\"What do you want help with?\",\"placeholder\":\"Describe your task in natural language…\"}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"select\",\"title\":\"How should Shiori use these recommendations?\",\"options\":[\"Pre-load matches and queue task for agent\",\"Review recommendations only\",\"Cancel\"]}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"notify\",\"message\":\"Matched 1 skill(s): smoke-skill [trigger]\",\"notifyType\":\"info\"}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"select\",\"title\":\"Follow up on a recommendation:\",\"options\":[\"smoke-skill [trigger]\",\"Done\"]}\n{\"id\":\"reload-recommend\",\"type\":\"response\",\"command\":\"prompt\",\"success\":true,\"data\":{\"disposition\":\"handled\"}}\n\n[second process stderr]\n",
66
+ "evidence": "[reload sequence]\nfirst process:\n reload-stats-before: success=true disposition=handled\n reload-inventory: success=true disposition=handled\n reload-stats-after: success=true disposition=handled\n reload-recommend: success=true disposition=handled\n firstExitCode=0\nsecond process:\n reload-recommend: success=true disposition=handled\n secondExitCode=0\n[reload_cleanup] Pi SDK 1.5.0\n[first process stdout]\n{\"id\":\"reload-first-commands\",\"type\":\"response\",\"command\":\"get_commands\",\"success\":true,\"data\":{\"commands\":[{\"name\":\"shiori:doctor\",\"description\":\"Show Pi Skill Shiori configuration and inventory status\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:reload\",\"description\":\"Rebuild Pi Skill Shiori inventory and optional Pi runtime resources\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:recommend\",\"description\":\"Recommend Agent Skills for a natural-language task and queue it for the agent\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:stats\",\"description\":\"Show Pi Skill Shiori operational counters and recommendation feedback\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:bootstrap\",\"description\":\"Generate a review policy draft from discovered skill descriptions\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}}]}}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"notify\",\"message\":\"Recommendation feedback (session-local, no prompts stored)\\noffers: 0 | candidate slots: 0 | loaded: 0\\nabandoned: 0 | zero-candidate queries: 0 | follow-through: n/a\\nTiming (session-local) | inventory refresh: count=1 last=<DURATION> total=<DURATION> max=<DURATION> | retrieval: count=0 last=<DURATION> total=<DURATION> max=<DURATION>\\n\\n{\\n \\\"inventoryCount\\\": 1,\\n \\\"duplicateCount\\\": 0,\\n \\\"candidateHitCount\\\": 0,\\n \\\"zeroCandidateCount\\\": 0,\\n \\\"loadedSkillCount\\\": 0,\\n \\\"explicitInvocationCount\\\": 0,\\n \\\"retrievalBackend\\\": \\\"sqlite-fts\\\",\\n \\\"suppressionStatus\\\": \\\"disabled\\\",\\n \\\"inventoryRefreshCount\\\": 1,\\n \\\"inventoryAutoRefreshCount\\\": 0,\\n \\\"timing\\\": {\\n \\\"inventoryRefresh\\\": {\\n \\\"lastMs\\\": \"<DURATION>\",\\n \\\"totalMs\\\": \"<DURATION>\",\\n \\\"maxMs\\\": \"<DURATION>\",\\n \\\"count\\\": 1\\n },\\n \\\"retrieval\\\": {\\n \\\"lastMs\\\": \"<DURATION>\",\\n \\\"totalMs\\\": \"<DURATION>\",\\n \\\"maxMs\\\": \"<DURATION>\",\\n \\\"count\\\": 0\\n }\\n },\\n \\\"lastReloadAt\\\": \\\"<TIMESTAMP>\\\",\\n \\\"recommendationFeedback\\\": {\\n \\\"totalOffers\\\": 0,\\n \\\"totalCandidateSlots\\\": 0,\\n \\\"totalLoaded\\\": 0,\\n \\\"totalAbandoned\\\": 0,\\n \\\"zeroCandidateQueries\\\": 0,\\n \\\"followThroughRate\\\": null,\\n \\\"bySource\\\": {\\n \\\"auto-inject\\\": {\\n \\\"offers\\\": 0,\\n \\\"candidateSlots\\\": 0,\\n \\\"loaded\\\": 0,\\n \\\"zeroHits\\\": 0\\n },\\n \\\"command\\\": {\\n \\\"offers\\\": 0,\\n \\\"candidateSlots\\\": 0,\\n \\\"loaded\\\": 0,\\n \\\"zeroHits\\\": 0\\n },\\n \\\"tool\\\": {\\n \n…[elided 3910 characters]…\n,\"command\":\"prompt\",\"success\":true,\"data\":{\"disposition\":\"handled\"}}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"input\",\"title\":\"What do you want help with?\",\"placeholder\":\"Describe your task in natural language…\"}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"select\",\"title\":\"How should Shiori use these recommendations?\",\"options\":[\"Pre-load matches and queue task for agent\",\"Review recommendations only\",\"Cancel\"]}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"notify\",\"message\":\"Matched 1 skill(s): smoke-skill [trigger]\",\"notifyType\":\"info\"}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"select\",\"title\":\"Follow up on a recommendation:\",\"options\":[\"smoke-skill [trigger]\",\"Done\"]}\n{\"id\":\"reload-recommend\",\"type\":\"response\",\"command\":\"prompt\",\"success\":true,\"data\":{\"disposition\":\"handled\"}}\n\n[first process stderr]\n\n[second process stdout]\n{\"id\":\"reload-second-commands\",\"type\":\"response\",\"command\":\"get_commands\",\"success\":true,\"data\":{\"commands\":[{\"name\":\"shiori:doctor\",\"description\":\"Show Pi Skill Shiori configuration and inventory status\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:reload\",\"description\":\"Rebuild Pi Skill Shiori inventory and optional Pi runtime resources\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:recommend\",\"description\":\"Recommend Agent Skills for a natural-language task and queue it for the agent\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:stats\",\"description\":\"Show Pi Skill Shiori operational counters and recommendation feedback\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}},{\"name\":\"shiori:bootstrap\",\"description\":\"Generate a review policy draft from discovered skill descriptions\",\"source\":\"extension\",\"sourceInfo\":{\"path\":\"<REPOSITORY>\\\\src\\\\index.ts\",\"source\":\"cli\",\"scope\":\"temporary\",\"origin\":\"top-level\"}}]}}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"input\",\"title\":\"What do you want help with?\",\"placeholder\":\"Describe your task in natural language…\"}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"select\",\"title\":\"How should Shiori use these recommendations?\",\"options\":[\"Pre-load matches and queue task for agent\",\"Review recommendations only\",\"Cancel\"]}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"notify\",\"message\":\"Matched 1 skill(s): smoke-skill [trigger]\",\"notifyType\":\"info\"}\n{\"type\":\"extension_ui_request\",\"id\":\"<RPC_ID>\",\"method\":\"select\",\"title\":\"Follow up on a recommendation:\",\"options\":[\"smoke-skill [trigger]\",\"Done\"]}\n{\"id\":\"reload-recommend\",\"type\":\"response\",\"command\":\"prompt\",\"success\":true,\"data\":{\"disposition\":\"handled\"}}\n\n[second process stderr]\n",
67
67
  "assertions": [
68
68
  {
69
69
  "id": "inventory_reload",
@@ -96,12 +96,12 @@
96
96
  "command": "npm run smoke:pi (native host shell launches the locally pinned Pi CLI)",
97
97
  "exit_code": 0,
98
98
  "passed": true,
99
- "evidence": "1.2.0\n",
99
+ "evidence": "1.5.0\n",
100
100
  "assertions": [
101
101
  {
102
102
  "id": "native_shell_boundary",
103
103
  "expected": "The native host shell launches the locally pinned Pi CLI and returns exactly its SDK version.",
104
- "observed": "{\"exit_code\":0,\"output\":\"1.2.0\",\"expectedVersion\":\"1.2.0\"}",
104
+ "observed": "{\"exit_code\":0,\"output\":\"1.5.0\",\"expectedVersion\":\"1.5.0\"}",
105
105
  "passed": true
106
106
  }
107
107
  ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-skill-shiori",
3
- "version": "0.6.17",
3
+ "version": "0.6.19",
4
4
  "description": "Pi extension that reduces Agent Skill catalog tokens with policy-based skill retrieval and on-demand skill loading.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -56,13 +56,13 @@
56
56
  "typebox": "*"
57
57
  },
58
58
  "devDependencies": {
59
- "@earendil-works/pi-agent-core": "1.2.0",
60
- "@earendil-works/pi-ai": "1.2.0",
61
- "@earendil-works/pi-coding-agent": "1.2.0",
62
- "@earendil-works/pi-tui": "1.2.0",
59
+ "@earendil-works/pi-agent-core": "1.5.0",
60
+ "@earendil-works/pi-ai": "1.5.0",
61
+ "@earendil-works/pi-coding-agent": "1.5.0",
62
+ "@earendil-works/pi-tui": "1.5.0",
63
63
  "@types/node": "^26.0.0",
64
64
  "tsx": "^4.22.4",
65
- "typebox": "latest",
65
+ "typebox": "1.3.27",
66
66
  "typescript": "^7.0.2"
67
67
  }
68
68
  }
package/src/index.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
2
  import { Text } from "@earendil-works/pi-tui";
3
3
  import { Type } from "typebox";
4
- import { readFile, writeFile } from "node:fs/promises";
4
+ import { writeFile } from "node:fs/promises";
5
5
  import { evaluateAlwaysVisible, formatAlwaysVisibleDiagnostics } from "./always-visible.js";
6
6
  import { findDuplicates, formatInventoryRoots, isAutoRefreshEnabled, isInventoryStale, refreshSkillInventory } from "./inventory.js";
7
7
  import type { SkillIndex } from "./indexer.js";
8
- import { loadRecommendedSkills } from "./load-skills.js";
8
+ import { loadRecommendedSkills, loadSkillContent } from "./load-skills.js";
9
9
  import { formatPlanningKickoffMessage, isPlanningIntent } from "./planning-kickoff.js";
10
10
  import { createStats, formatTimingSummary, measureTiming } from "./metrics.js";
11
11
  import { createRecommendationFeedback } from "./recommendation-feedback.js";
@@ -237,7 +237,7 @@ export default function piSkillShiori(pi: ExtensionAPI) {
237
237
  const current = await ensureIndex(ctx.cwd);
238
238
  const record = findSkill(params.skill, current.skills);
239
239
  if (!record) throw new Error(`Skill not found: ${params.skill}`);
240
- const content = await readFile(record.path, "utf8");
240
+ const content = await loadSkillContent(record.path);
241
241
  stats.loadedSkillCount += 1;
242
242
  recommendationFeedback.recordSkillLoaded(record.name);
243
243
  const details: ShioriLoadDetails = {
@@ -6,10 +6,14 @@ export interface LoadedSkill {
6
6
  content: string;
7
7
  }
8
8
 
9
+ export function loadSkillContent(path: string): Promise<string> {
10
+ return readFile(path, "utf8");
11
+ }
12
+
9
13
  export async function loadRecommendedSkills(candidates: SkillCandidate[]): Promise<LoadedSkill[]> {
10
14
  const loaded: LoadedSkill[] = [];
11
15
  for (const candidate of candidates) {
12
- const content = await readFile(candidate.skill.path, "utf8");
16
+ const content = await loadSkillContent(candidate.skill.path);
13
17
  loaded.push({ candidate, content });
14
18
  }
15
19
  return loaded;