pi-skillful 0.3.3 → 0.3.5
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 +12 -0
- package/README.md +1 -1
- package/package.json +1 -1
- package/src/extensions/session-skill-toggles.ts +25 -3
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,18 @@ This project follows the spirit of [Keep a Changelog](https://keepachangelog.com
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.3.5] - 2026-05-12
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- Fixed preserving session skill toggle state across `/new` after Pi reloads extension instances.
|
|
14
|
+
|
|
15
|
+
## [0.3.4] - 2026-05-12
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
|
|
19
|
+
- Preserve session skill toggle state across `/new` within the same Pi process.
|
|
20
|
+
|
|
9
21
|
## [0.3.3] - 2026-05-12
|
|
10
22
|
|
|
11
23
|
### Fixed
|
package/README.md
CHANGED
|
@@ -88,7 +88,7 @@ Configured slots appear on the prompt editor's top border as `N skill-name`. Lon
|
|
|
88
88
|
|
|
89
89
|
`toggleModifier` defaults to `"alt"`. Supported values are `"alt"`, `"ctrl"`, `"ctrl+shift"`, `"alt+shift"`, `"ctrl+alt"`, and `"ctrl+alt+shift"`. Change it if your terminal reserves `alt+number` shortcuts.
|
|
90
90
|
|
|
91
|
-
On
|
|
91
|
+
On app startup, non-hidden skills are active and hidden skills are inactive. Within a running Pi process, `/new` preserves the current toggle state for the new session. Resuming, forking, cloning, reloading, or restarting Pi resets toggle state from settings. Inline `/skill:name` invocation remains explicit and works even when that skill is inactive.
|
|
92
92
|
|
|
93
93
|
## Installation
|
|
94
94
|
|
package/package.json
CHANGED
|
@@ -14,6 +14,7 @@ import { replaceSkillsSection } from "../skill-prompt.js";
|
|
|
14
14
|
import { listLoadedSkills } from "../skills.js";
|
|
15
15
|
|
|
16
16
|
const WIDGET_KEY = "pi-skillful-session-toggles";
|
|
17
|
+
const STORE_KEY = Symbol.for("pi-skillful.sessionSkillTogglesStore");
|
|
17
18
|
const BORDER_PREFIX = "─── ";
|
|
18
19
|
const BORDER_SUFFIX = " ";
|
|
19
20
|
const BORDER_PREFIX_WIDTH = visibleWidth(BORDER_PREFIX);
|
|
@@ -38,6 +39,14 @@ interface SessionToggleState {
|
|
|
38
39
|
theme: Theme | undefined;
|
|
39
40
|
}
|
|
40
41
|
|
|
42
|
+
interface SessionToggleStore {
|
|
43
|
+
preservedNewSessionActiveBySkill: { cwd: string; activeBySkill: Map<string, boolean> } | undefined;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const store = (((globalThis as Record<PropertyKey, unknown>)[STORE_KEY] as SessionToggleStore | undefined) ??= {
|
|
47
|
+
preservedNewSessionActiveBySkill: undefined,
|
|
48
|
+
}) as SessionToggleStore;
|
|
49
|
+
|
|
41
50
|
let state: SessionToggleState = createEmptyState();
|
|
42
51
|
|
|
43
52
|
export default function sessionSkillToggles(pi: ExtensionAPI) {
|
|
@@ -53,7 +62,7 @@ export default function sessionSkillToggles(pi: ExtensionAPI) {
|
|
|
53
62
|
}
|
|
54
63
|
}
|
|
55
64
|
|
|
56
|
-
pi.on("session_start", async (
|
|
65
|
+
pi.on("session_start", async (event, ctx) => {
|
|
57
66
|
const settings = await readEffectiveSkillfulSettings(ctx.cwd);
|
|
58
67
|
const loadedSkillNames = new Set(listLoadedSkills(pi.getCommands()).map((s) => s.name));
|
|
59
68
|
const slots = SKILL_TOGGLE_SLOTS.flatMap((slot): ToggleSlotState[] => {
|
|
@@ -62,12 +71,23 @@ export default function sessionSkillToggles(pi: ExtensionAPI) {
|
|
|
62
71
|
return [{ slot, skillName }];
|
|
63
72
|
});
|
|
64
73
|
|
|
74
|
+
const preservedActiveBySkill =
|
|
75
|
+
event.reason === "new" && store.preservedNewSessionActiveBySkill?.cwd === ctx.cwd
|
|
76
|
+
? store.preservedNewSessionActiveBySkill.activeBySkill
|
|
77
|
+
: undefined;
|
|
78
|
+
store.preservedNewSessionActiveBySkill = undefined;
|
|
79
|
+
|
|
65
80
|
state = {
|
|
66
81
|
cwd: ctx.cwd,
|
|
67
82
|
modifier: settings.toggleModifier,
|
|
68
83
|
hiddenSkills: settings.hiddenSkillSet,
|
|
69
84
|
slots,
|
|
70
|
-
activeBySkill: new Map(
|
|
85
|
+
activeBySkill: new Map(
|
|
86
|
+
slots.map(({ skillName }) => [
|
|
87
|
+
skillName,
|
|
88
|
+
preservedActiveBySkill?.get(skillName) ?? !settings.hiddenSkillSet.has(skillName),
|
|
89
|
+
]),
|
|
90
|
+
),
|
|
71
91
|
installedEditor: false,
|
|
72
92
|
installedWidget: false,
|
|
73
93
|
previousEditorFactory: undefined,
|
|
@@ -92,9 +112,11 @@ export default function sessionSkillToggles(pi: ExtensionAPI) {
|
|
|
92
112
|
return { systemPrompt };
|
|
93
113
|
});
|
|
94
114
|
|
|
95
|
-
pi.on("session_shutdown", (
|
|
115
|
+
pi.on("session_shutdown", (event, ctx) => {
|
|
96
116
|
if (state.installedEditor) ctx.ui.setEditorComponent(state.previousEditorFactory);
|
|
97
117
|
if (state.installedWidget) ctx.ui.setWidget(WIDGET_KEY, undefined);
|
|
118
|
+
store.preservedNewSessionActiveBySkill =
|
|
119
|
+
event.reason === "new" ? { cwd: state.cwd, activeBySkill: new Map(state.activeBySkill) } : undefined;
|
|
98
120
|
state = createEmptyState();
|
|
99
121
|
});
|
|
100
122
|
}
|