@nklisch/pi-enhanced 0.1.6 → 0.1.8
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 +13 -0
- package/node_modules/@nklisch/pi-clearance/native/clearance-core.win32-arm64-msvc.node +0 -0
- package/node_modules/@nklisch/pi-clearance/native/clearance-core.win32-x64-msvc.node +0 -0
- package/node_modules/@nklisch/pi-clearance/package.json +1 -1
- package/node_modules/@nklisch/pi-clearance/src/index.ts +3 -0
- package/node_modules/@nklisch/pi-clearance/src/runtime/config-commands/packs.ts +2 -0
- package/node_modules/@nklisch/pi-clearance/src/runtime/config-commands/scope.ts +2 -0
- package/node_modules/@nklisch/pi-clearance/src/runtime/config-commands/settings/dispatcher.ts +7 -0
- package/node_modules/@nklisch/pi-clearance/src/runtime/config-commands/types.ts +19 -0
- package/node_modules/@nklisch/pi-clearance/src/runtime/proposal-tools/apply-engine.ts +10 -0
- package/node_modules/@nklisch/pi-clearance/src/runtime/ratchet-tools/types.ts +6 -1
- package/node_modules/@nklisch/pi-model-modes/README.md +18 -4
- package/node_modules/@nklisch/pi-model-modes/package.json +1 -1
- package/node_modules/@nklisch/pi-model-modes/presets.json +7 -0
- package/node_modules/@nklisch/pi-model-modes/prompts/base/straight.md +9 -0
- package/node_modules/@nklisch/pi-model-modes/prompts/base.json +6 -1
- package/node_modules/@nklisch/pi-model-modes/prompts/styles/straight.md +9 -0
- package/node_modules/@nklisch/pi-model-modes/src/autocomplete.ts +24 -6
- package/node_modules/@nklisch/pi-model-modes/src/commands.ts +3 -0
- package/node_modules/@nklisch/pi-model-modes/src/footer.ts +3 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v0.1.8
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- Rebundle `@nklisch/pi-model-modes` v0.3.3 with the new independent `straight` behavioral base/preset and `straight` writing style.
|
|
8
|
+
|
|
9
|
+
## v0.1.7
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
- Rebundle `@nklisch/pi-clearance` v0.2.3 so confirmed mode and settings changes update the active-session footer immediately instead of waiting for another tool call or restart.
|
|
14
|
+
- Rebundle `@nklisch/pi-model-modes` v0.3.2 so global mode persistence is visible in autocomplete and the bare `/mode` panel.
|
|
15
|
+
|
|
3
16
|
## v0.1.6
|
|
4
17
|
|
|
5
18
|
### Changed
|
|
Binary file
|
|
Binary file
|
|
@@ -131,6 +131,7 @@ const piAutoApprove: ExtensionFactory = (pi: ExtensionAPI) => {
|
|
|
131
131
|
recentDecisionSource,
|
|
132
132
|
analyzerRegistry,
|
|
133
133
|
toolMetadata: () => toolMetadata(pi),
|
|
134
|
+
refreshOperatorStatus: (ctx, policy) => operatorStatus.refresh(ctx, policy),
|
|
134
135
|
});
|
|
135
136
|
registerProposalTools(
|
|
136
137
|
pi,
|
|
@@ -138,6 +139,7 @@ const piAutoApprove: ExtensionFactory = (pi: ExtensionAPI) => {
|
|
|
138
139
|
policyResolver,
|
|
139
140
|
packageRegistration: packageRegistration.snapshot,
|
|
140
141
|
audit,
|
|
142
|
+
refreshOperatorStatus: (ctx, policy) => operatorStatus.refresh(ctx, policy),
|
|
141
143
|
},
|
|
142
144
|
proposalBatchCache,
|
|
143
145
|
);
|
|
@@ -147,6 +149,7 @@ const piAutoApprove: ExtensionFactory = (pi: ExtensionAPI) => {
|
|
|
147
149
|
policyResolver,
|
|
148
150
|
packageRegistration: packageRegistration.snapshot,
|
|
149
151
|
audit,
|
|
152
|
+
refreshOperatorStatus: (ctx, policy) => operatorStatus.refresh(ctx, policy),
|
|
150
153
|
},
|
|
151
154
|
proposalBatchCache,
|
|
152
155
|
);
|
|
@@ -42,6 +42,7 @@ import {
|
|
|
42
42
|
completion,
|
|
43
43
|
filterCompletions,
|
|
44
44
|
resolvePolicyReport,
|
|
45
|
+
refreshOperatorStatus,
|
|
45
46
|
stableUnique,
|
|
46
47
|
usageReport,
|
|
47
48
|
} from "./types.ts";
|
|
@@ -319,6 +320,7 @@ export async function handlePackMutationCommand(input: {
|
|
|
319
320
|
}
|
|
320
321
|
|
|
321
322
|
const refreshed = await resolvePolicyReport(ctx, deps);
|
|
323
|
+
if (refreshed.ok) refreshOperatorStatus(ctx, deps, refreshed.policy);
|
|
322
324
|
const effectivePack = refreshed.ok
|
|
323
325
|
? getAutoReviewerPack(refreshed.policy, packId)?.pack
|
|
324
326
|
: undefined;
|
|
@@ -31,6 +31,7 @@ import {
|
|
|
31
31
|
completion,
|
|
32
32
|
filterCompletions,
|
|
33
33
|
resolvePolicyReport,
|
|
34
|
+
refreshOperatorStatus,
|
|
34
35
|
stableUnique,
|
|
35
36
|
usageReport,
|
|
36
37
|
} from "./types.ts";
|
|
@@ -212,6 +213,7 @@ export async function handleScopeCommand(
|
|
|
212
213
|
}
|
|
213
214
|
|
|
214
215
|
const refreshed = await resolvePolicyReport(ctx, deps);
|
|
216
|
+
if (refreshed.ok) refreshOperatorStatus(ctx, deps, refreshed.policy);
|
|
215
217
|
const status = refreshed.ok
|
|
216
218
|
? scopeStatusFromConfig(refreshed.policy.config)
|
|
217
219
|
: undefined;
|
package/node_modules/@nklisch/pi-clearance/src/runtime/config-commands/settings/dispatcher.ts
CHANGED
|
@@ -37,6 +37,7 @@ import {
|
|
|
37
37
|
type AutoReviewerCommandDependencies,
|
|
38
38
|
type CommandReport,
|
|
39
39
|
resolvePolicyReport,
|
|
40
|
+
refreshOperatorStatus,
|
|
40
41
|
stableUnique,
|
|
41
42
|
} from "../types.ts";
|
|
42
43
|
import {
|
|
@@ -219,6 +220,12 @@ export async function dispatchSettingsAction(
|
|
|
219
220
|
}
|
|
220
221
|
|
|
221
222
|
const refreshed = await resolvePolicyReport(ctx, deps);
|
|
223
|
+
if (refreshed.ok) {
|
|
224
|
+
// Config writes and policy-cache invalidation are complete at this point;
|
|
225
|
+
// publish the same resolved policy immediately instead of waiting for the
|
|
226
|
+
// next tool call or session restart to refresh the footer projection.
|
|
227
|
+
refreshOperatorStatus(ctx, deps, refreshed.policy);
|
|
228
|
+
}
|
|
222
229
|
const warnings = stableUnique([
|
|
223
230
|
...planned.plan.warnings.map((warning) => warning.message),
|
|
224
231
|
...apply.warnings,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type {
|
|
2
2
|
ExtensionAPI,
|
|
3
3
|
ExtensionCommandContext,
|
|
4
|
+
ExtensionContext,
|
|
4
5
|
} from "@earendil-works/pi-coding-agent";
|
|
5
6
|
|
|
6
7
|
import type { AuditLogger } from "../../audit/logger.ts";
|
|
@@ -33,6 +34,11 @@ export interface AutoReviewerCommandDependencies {
|
|
|
33
34
|
readonly recentDecisionSource: RecentDecisionSource;
|
|
34
35
|
/** Structural analyzer used only to summarize the recent command for the agent. */
|
|
35
36
|
readonly analyzerRegistry: ToolAnalyzerRegistry;
|
|
37
|
+
/** Refresh the active-session footer after a confirmed config write resolves. */
|
|
38
|
+
readonly refreshOperatorStatus?: (
|
|
39
|
+
ctx: ExtensionContext,
|
|
40
|
+
policy: ResolvedPolicy,
|
|
41
|
+
) => void;
|
|
36
42
|
}
|
|
37
43
|
|
|
38
44
|
export interface CommandReport<TDetails = unknown> {
|
|
@@ -78,6 +84,19 @@ export const USAGE_MARKDOWN = [
|
|
|
78
84
|
"Reviewer prompt posture and model pinning are available as confirm-backed settings selectors; context mode, token budget, escalation, and other advanced fields are edited in user-owned global config.",
|
|
79
85
|
].join("\n");
|
|
80
86
|
|
|
87
|
+
export function refreshOperatorStatus(
|
|
88
|
+
ctx: ExtensionContext,
|
|
89
|
+
deps: Pick<AutoReviewerCommandDependencies, "refreshOperatorStatus">,
|
|
90
|
+
policy: ResolvedPolicy,
|
|
91
|
+
): void {
|
|
92
|
+
try {
|
|
93
|
+
deps.refreshOperatorStatus?.(ctx, policy);
|
|
94
|
+
} catch {
|
|
95
|
+
// Footer visibility is advisory and must never turn an applied config write
|
|
96
|
+
// into a reported failure or trigger rollback after durable validation.
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
81
100
|
export async function resolvePolicyForCommand(
|
|
82
101
|
ctx: ExtensionCommandContext,
|
|
83
102
|
deps: Pick<AutoReviewerCommandDependencies, "policyResolver">,
|
|
@@ -31,6 +31,7 @@ import {
|
|
|
31
31
|
type RatchetProposalWritePlanResult,
|
|
32
32
|
} from "../../replay/proposal-write-plan.ts";
|
|
33
33
|
import { checkAgainstFloor } from "../../replay/proposals.ts";
|
|
34
|
+
import { refreshOperatorStatus } from "../config-commands/types.ts";
|
|
34
35
|
import {
|
|
35
36
|
composeConfigCommandPostWritePolicy,
|
|
36
37
|
createExtensionContextConfigCommandWriterDependencies,
|
|
@@ -558,6 +559,15 @@ export async function applyAcceptedWritableProposal(input: {
|
|
|
558
559
|
? {}
|
|
559
560
|
: { transactionReplay: replayRecorder.result }),
|
|
560
561
|
});
|
|
562
|
+
if (apply.status === "applied" && apply.changed === true) {
|
|
563
|
+
try {
|
|
564
|
+
const refreshed = await resolveRatchetPolicy(input.ctx, input.deps);
|
|
565
|
+
refreshOperatorStatus(input.ctx, input.deps, refreshed);
|
|
566
|
+
} catch {
|
|
567
|
+
// The durable writer and post-write validation have already settled.
|
|
568
|
+
// Footer refresh remains advisory and cannot change the apply result.
|
|
569
|
+
}
|
|
570
|
+
}
|
|
561
571
|
return {
|
|
562
572
|
apply: applyWithPostWriteReplay(apply, postWriteReplay),
|
|
563
573
|
postWriteReplay,
|
|
@@ -2,12 +2,17 @@ import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
|
2
2
|
|
|
3
3
|
import type { AuditLogger } from "../../audit/logger.ts";
|
|
4
4
|
import type { PackageRegistrationSnapshot } from "../../packs/package-registration.ts";
|
|
5
|
-
import type { PolicyResolver } from "../policy-cache.ts";
|
|
5
|
+
import type { PolicyResolver, ResolvedPolicy } from "../policy-cache.ts";
|
|
6
6
|
|
|
7
7
|
export interface RatchetToolDependencies {
|
|
8
8
|
readonly policyResolver: PolicyResolver;
|
|
9
9
|
readonly packageRegistration: () => PackageRegistrationSnapshot;
|
|
10
10
|
readonly audit: AuditLogger;
|
|
11
|
+
/** Refresh the active-session footer after an approved proposal writes config. */
|
|
12
|
+
readonly refreshOperatorStatus?: (
|
|
13
|
+
ctx: ExtensionContext,
|
|
14
|
+
policy: ResolvedPolicy,
|
|
15
|
+
) => void;
|
|
11
16
|
}
|
|
12
17
|
|
|
13
18
|
export interface RatchetToolContext {
|
|
@@ -107,6 +107,11 @@ The command surface mirrors that merge model:
|
|
|
107
107
|
/mode default off --global # clear global default
|
|
108
108
|
```
|
|
109
109
|
|
|
110
|
+
Autocomplete surfaces `--global` as the first choice after `/mode default ` and
|
|
111
|
+
continues with preset completion after `/mode default --global `. The bare `/mode`
|
|
112
|
+
panel also prints both durable forms so persistence is discoverable without reading
|
|
113
|
+
documentation.
|
|
114
|
+
|
|
110
115
|
Writes preserve sibling keys such as `cycleKeybinding`, format JSON with two-space
|
|
111
116
|
indentation, and refuse to overwrite malformed/non-object JSON files. An invalid
|
|
112
117
|
`defaultMode` (unknown preset / missing fragment) warns and is skipped during
|
|
@@ -115,8 +120,9 @@ session start; command-time writes validate before touching disk.
|
|
|
115
120
|
### Writing styles
|
|
116
121
|
|
|
117
122
|
An optional writing style controls conversational communication independently
|
|
118
|
-
of the active mode. Bundled styles are `clear`, `compact`, `explanatory`,
|
|
119
|
-
`expressive`.
|
|
123
|
+
of the active mode. Bundled styles are `clear`, `compact`, `explanatory`,
|
|
124
|
+
`expressive`, and `straight`. `straight` leads with direct technical judgment,
|
|
125
|
+
removes sugarcoating and false balance, and keeps explanations self-contained.
|
|
120
126
|
|
|
121
127
|
| Command | Effect |
|
|
122
128
|
|---|---|
|
|
@@ -138,8 +144,13 @@ For example:
|
|
|
138
144
|
/style none # temporarily mask either default
|
|
139
145
|
/style off # reveal the configured default
|
|
140
146
|
/style default off # clear project default; reveal global
|
|
147
|
+
/mode straight # direct premise-checking behavior
|
|
148
|
+
/style straight # direct, self-contained prose
|
|
141
149
|
```
|
|
142
150
|
|
|
151
|
+
The `straight` mode and style are independent. Use either one alone, or select
|
|
152
|
+
both when you want the behavioral base and the writing posture together.
|
|
153
|
+
|
|
143
154
|
The same durable selection can be edited directly in config:
|
|
144
155
|
|
|
145
156
|
```json
|
|
@@ -177,7 +188,7 @@ take effect immediately.
|
|
|
177
188
|
**Base** voice (default `pi` = no overlay, identity only):
|
|
178
189
|
|
|
179
190
|
- `pi` — no voice overlay
|
|
180
|
-
- `chill`, `flow`, `pi-direct` — overlay voices (`prompts/base/*.md`)
|
|
191
|
+
- `chill`, `flow`, `pi-direct`, `straight` — overlay voices (`prompts/base/*.md`)
|
|
181
192
|
|
|
182
193
|
**Agency** — `autonomous` · `collaborative` · `surgical` · `partner`
|
|
183
194
|
|
|
@@ -206,13 +217,16 @@ take effect immediately.
|
|
|
206
217
|
| `flow` | flow | autonomous | architect | adjacent | flow |
|
|
207
218
|
| `tinker` | flow | autonomous | pragmatic | unrestricted | flow, playful |
|
|
208
219
|
| `spark` | chill | autonomous | architect | unrestricted | muse, playful |
|
|
220
|
+
| `straight` | straight | autonomous | pragmatic | adjacent | — |
|
|
209
221
|
| `none` | — | — | — | — | virtual no-mode override |
|
|
210
222
|
|
|
211
223
|
Preset definitions live in [`presets.json`](presets.json), except `none`, which
|
|
212
224
|
is virtual and injects no mode fragments. The fragment text lives in
|
|
213
225
|
[`prompts/`](prompts) (`base/`, `axis/{agency,quality,scope}/`, `modifiers/`).
|
|
214
226
|
Fragment files are cached by mtime, so editing one takes effect on the next turn
|
|
215
|
-
— no `/reload` needed.
|
|
227
|
+
— no `/reload` needed. The `straight` base was adapted from the intent of
|
|
228
|
+
`claude-code-modes`: correctness over agreement, explicit premise checking, and
|
|
229
|
+
direct criticism of the work without turning abrasiveness into a persona.
|
|
216
230
|
|
|
217
231
|
## How it works
|
|
218
232
|
|
|
@@ -76,6 +76,13 @@
|
|
|
76
76
|
"scope": "adjacent",
|
|
77
77
|
"modifiers": ["flow"]
|
|
78
78
|
},
|
|
79
|
+
"straight": {
|
|
80
|
+
"base": "straight",
|
|
81
|
+
"agency": "autonomous",
|
|
82
|
+
"quality": "pragmatic",
|
|
83
|
+
"scope": "adjacent",
|
|
84
|
+
"modifiers": []
|
|
85
|
+
},
|
|
79
86
|
"tinker": {
|
|
80
87
|
"base": "flow",
|
|
81
88
|
"agency": "autonomous",
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Straight base
|
|
2
|
+
|
|
3
|
+
Optimize for the correct result, not agreement with the user's premise.
|
|
4
|
+
|
|
5
|
+
Check requests against the available evidence and the actual system. If a premise is wrong, say so and correct it. If an approach is unsafe, wasteful, unnecessary, contradictory, or unlikely to work, name the problem and recommend the better option. Do not invent work or present weak alternatives as equally sound.
|
|
6
|
+
|
|
7
|
+
Do not manufacture disagreement. Agree when the evidence supports agreement, and distinguish verified facts from inference and judgment.
|
|
8
|
+
|
|
9
|
+
Be direct about the work without being hostile to the person. Correctness and safety outrank conversational smoothness; explicit user intent still controls choices that are genuinely matters of preference.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Straight
|
|
2
|
+
|
|
3
|
+
Write in plain, self-contained technical English.
|
|
4
|
+
|
|
5
|
+
Lead with the answer or judgment, then give the useful reason. Use literal and specific language. Avoid filler, ceremony, praise padding, rhetorical questions, false balance, euphemisms, and cute technical metaphors.
|
|
6
|
+
|
|
7
|
+
Do not sugarcoat technical conclusions. Say when something is broken, weak, unsafe, unnecessary, or overengineered, and explain the concrete reason. Criticize the idea, decision, or implementation—not the person. Do not manufacture disagreement merely to sound independent.
|
|
8
|
+
|
|
9
|
+
Separate verified facts from inference and opinion. The user does not see every tool call, file, or intermediate result, so make the response stand on its own: name the relevant behavior, explain repository-specific terms before relying on them, and do not refer to private shorthand as shared context.
|
|
@@ -25,11 +25,14 @@ export const MODE_DEFAULT_GLOBAL_FLAG = "--global";
|
|
|
25
25
|
const OFF_DESCRIPTION = "clear override — fall back to default";
|
|
26
26
|
const NONE_DESCRIPTION = "explicit no-mode override — wins over default";
|
|
27
27
|
const DEFAULT_DESCRIPTION = "manage the durable default — writes pi-model-modes.json";
|
|
28
|
-
const GLOBAL_FLAG_DESCRIPTION = "
|
|
28
|
+
const GLOBAL_FLAG_DESCRIPTION = "persist globally in ~/.pi/agent (instead of this project)";
|
|
29
29
|
|
|
30
30
|
const MODE_ARG_TRIGGER = /^\/mode[ \t]+([^\s]*)$/;
|
|
31
31
|
/** Stage 2: `<action>` token after `/mode default ` (no further tokens). */
|
|
32
32
|
const MODE_DEFAULT_ACTION_TRIGGER = /^\/mode[ \t]+default[ \t]+([^\s]*)$/;
|
|
33
|
+
/** Stage 2b: action after the discoverable leading `--global` form. */
|
|
34
|
+
const MODE_DEFAULT_GLOBAL_ACTION_TRIGGER =
|
|
35
|
+
/^\/mode[ \t]+default[ \t]+--global[ \t]+([^\s]*)$/;
|
|
33
36
|
/** Stage 3: a leading-dash token after `/mode default <action> `. */
|
|
34
37
|
const MODE_DEFAULT_FLAG_TRIGGER = /^\/mode[ \t]+default[ \t]+[^\s]+[ \t]+(--?[^\s]*)$/;
|
|
35
38
|
|
|
@@ -69,7 +72,7 @@ export function buildModeTopLevelItems(
|
|
|
69
72
|
];
|
|
70
73
|
}
|
|
71
74
|
|
|
72
|
-
/** PURE: build the single-item `--global` suggestion list
|
|
75
|
+
/** PURE: build the single-item `--global` suggestion list. */
|
|
73
76
|
export function buildDefaultGlobalFlagItems(): AutocompleteItem[] {
|
|
74
77
|
return [
|
|
75
78
|
{
|
|
@@ -93,8 +96,9 @@ export function filterModeArgItems(
|
|
|
93
96
|
* should delegate. Three-stage dispatch for the `/mode default` subcommand:
|
|
94
97
|
*
|
|
95
98
|
* - Stage 3: `/mode default <action> <--flag>` → `[--global]`
|
|
96
|
-
* - Stage
|
|
97
|
-
*
|
|
99
|
+
* - Stage 2b: `/mode default --global <action>` → presets + `off`
|
|
100
|
+
* - Stage 2: `/mode default <action>` → `--global` + presets + `off` (NO
|
|
101
|
+
* `default` — `default default` is meaningless)
|
|
98
102
|
* - Stage 1: `/mode <partial>` → presets + `off` + `default` (top level)
|
|
99
103
|
*
|
|
100
104
|
* The three triggers are structurally mutually exclusive (trailing-space gates
|
|
@@ -115,12 +119,26 @@ export function getModeArgSuggestions(
|
|
|
115
119
|
};
|
|
116
120
|
}
|
|
117
121
|
|
|
118
|
-
// Stage
|
|
122
|
+
// Stage 2b: action after the leading, discoverable global flag form.
|
|
123
|
+
const globalActionToken = beforeCursor.match(
|
|
124
|
+
MODE_DEFAULT_GLOBAL_ACTION_TRIGGER,
|
|
125
|
+
)?.[1];
|
|
126
|
+
if (globalActionToken !== undefined) {
|
|
127
|
+
return {
|
|
128
|
+
prefix: globalActionToken,
|
|
129
|
+
items: filterModeArgItems(buildModeArgItems(registry), globalActionToken),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Stage 2: action or global scope after `/mode default `.
|
|
119
134
|
const actionToken = beforeCursor.match(MODE_DEFAULT_ACTION_TRIGGER)?.[1];
|
|
120
135
|
if (actionToken !== undefined) {
|
|
121
136
|
return {
|
|
122
137
|
prefix: actionToken,
|
|
123
|
-
items: filterModeArgItems(
|
|
138
|
+
items: filterModeArgItems(
|
|
139
|
+
[...buildDefaultGlobalFlagItems(), ...buildModeArgItems(registry)],
|
|
140
|
+
actionToken,
|
|
141
|
+
),
|
|
124
142
|
};
|
|
125
143
|
}
|
|
126
144
|
|
|
@@ -241,6 +241,9 @@ export function formatModeListing(
|
|
|
241
241
|
` ${summary}`,
|
|
242
242
|
"Available presets:",
|
|
243
243
|
presetList,
|
|
244
|
+
"Durable defaults:",
|
|
245
|
+
" /mode default <preset> — persist for this project",
|
|
246
|
+
" /mode default --global <preset> — persist globally",
|
|
244
247
|
].join("\n");
|
|
245
248
|
}
|
|
246
249
|
|
|
@@ -20,8 +20,8 @@ export const MODE_FOOTER_KEY = "pi-model-modes";
|
|
|
20
20
|
* Leading marker glyph per base voice. Echoes pi-catppuccin-tui's ◆ vocabulary
|
|
21
21
|
* so the mode footer reads as part of the same family as the model/git/context
|
|
22
22
|
* line rather than a foreign symbol. Glyph choice tracks voice *character*:
|
|
23
|
-
* solid for
|
|
24
|
-
*
|
|
23
|
+
* solid for direct voices (`pi`, `pi-direct`, and `straight`), outline for
|
|
24
|
+
* `chill`'s softer voice, and hex for `flow`'s distinct character.
|
|
25
25
|
*
|
|
26
26
|
* The raw glyphs stay plain Unicode for stable tests and fallback renderers;
|
|
27
27
|
* the pi seam applies theme-aware color so Catppuccin footers inherit the
|
|
@@ -30,6 +30,7 @@ export const MODE_FOOTER_KEY = "pi-model-modes";
|
|
|
30
30
|
const BASE_VOICE_GLYPHS: Readonly<Record<string, string>> = {
|
|
31
31
|
pi: "◆",
|
|
32
32
|
"pi-direct": "◆",
|
|
33
|
+
straight: "◆",
|
|
33
34
|
chill: "◇",
|
|
34
35
|
flow: "⬡",
|
|
35
36
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nklisch/pi-enhanced",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.8",
|
|
4
4
|
"description": "Pi, enhanced — one install for nklisch's full harness: policy-gated command review, plugin marketplace, subagents, background tasks, research tools, search, model modes, and a curated UX set.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "nklisch"
|