@selesai/code 0.10.1 → 0.11.0

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.
Files changed (128) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/config.d.ts +5 -3
  3. package/dist/config.js +6 -4
  4. package/dist/core/skills.d.ts +2 -0
  5. package/dist/core/skills.js +1 -0
  6. package/dist/defaults/settings.json +0 -3
  7. package/dist/extensions/auto-session-name.test.ts +157 -0
  8. package/dist/extensions/auto-session-name.ts +96 -0
  9. package/dist/extensions/cost-reconcile.test.ts +76 -0
  10. package/dist/extensions/cost-reconcile.ts +278 -0
  11. package/dist/extensions/enable-readonly-tools.test.ts +11 -0
  12. package/dist/extensions/enable-readonly-tools.ts +7 -3
  13. package/dist/extensions/package.json +3 -0
  14. package/dist/extensions/pi-tool-display/CHANGELOG.md +329 -0
  15. package/dist/extensions/pi-tool-display/LICENSE +21 -0
  16. package/dist/extensions/pi-tool-display/README.md +417 -0
  17. package/dist/extensions/pi-tool-display/config/config.example.json +40 -0
  18. package/dist/extensions/pi-tool-display/index.ts +3 -0
  19. package/dist/extensions/pi-tool-display/package-lock.json +2555 -0
  20. package/dist/extensions/pi-tool-display/package.json +86 -0
  21. package/dist/extensions/pi-tool-display/src/agent-dir.ts +35 -0
  22. package/dist/extensions/pi-tool-display/src/ansi-utils.ts +116 -0
  23. package/dist/extensions/pi-tool-display/src/bash-display.ts +213 -0
  24. package/dist/extensions/pi-tool-display/src/capabilities.ts +88 -0
  25. package/dist/extensions/pi-tool-display/src/config-modal.ts +541 -0
  26. package/dist/extensions/pi-tool-display/src/config-store.ts +304 -0
  27. package/dist/extensions/pi-tool-display/src/debug-logger.ts +150 -0
  28. package/dist/extensions/pi-tool-display/src/diff-presentation.ts +72 -0
  29. package/dist/extensions/pi-tool-display/src/diff-renderer.ts +2517 -0
  30. package/dist/extensions/pi-tool-display/src/disposable.ts +34 -0
  31. package/dist/extensions/pi-tool-display/src/extension-lifecycle.ts +14 -0
  32. package/dist/extensions/pi-tool-display/src/index.ts +109 -0
  33. package/dist/extensions/pi-tool-display/src/line-width-safety.ts +93 -0
  34. package/dist/extensions/pi-tool-display/src/modal-icons.ts +57 -0
  35. package/dist/extensions/pi-tool-display/src/pending-diff-preview.ts +370 -0
  36. package/dist/extensions/pi-tool-display/src/presets.ts +117 -0
  37. package/dist/extensions/pi-tool-display/src/render-utils.ts +186 -0
  38. package/dist/extensions/pi-tool-display/src/settings-inspector-modal.ts +475 -0
  39. package/dist/extensions/pi-tool-display/src/thinking-label.ts +343 -0
  40. package/dist/extensions/pi-tool-display/src/tool-call-box.ts +181 -0
  41. package/dist/extensions/pi-tool-display/src/tool-metadata.ts +139 -0
  42. package/dist/extensions/pi-tool-display/src/tool-overrides.ts +2168 -0
  43. package/dist/extensions/pi-tool-display/src/types.ts +109 -0
  44. package/dist/extensions/pi-tool-display/src/user-message-box-markdown.ts +64 -0
  45. package/dist/extensions/pi-tool-display/src/user-message-box-native.ts +66 -0
  46. package/dist/extensions/pi-tool-display/src/user-message-box-patch.ts +72 -0
  47. package/dist/extensions/pi-tool-display/src/user-message-box-renderer.ts +419 -0
  48. package/dist/extensions/pi-tool-display/src/user-message-box-utils.ts +106 -0
  49. package/dist/extensions/pi-tool-display/src/write-display-utils.ts +31 -0
  50. package/dist/extensions/pi-tool-display/src/zellij-modal.ts +1027 -0
  51. package/dist/extensions/pi-tool-display/tests/active-backlog-red.test.ts +65 -0
  52. package/dist/extensions/pi-tool-display/tests/ansi-utils.test.ts +345 -0
  53. package/dist/extensions/pi-tool-display/tests/bash-display.test.ts +442 -0
  54. package/dist/extensions/pi-tool-display/tests/capabilities-edge.test.ts +360 -0
  55. package/dist/extensions/pi-tool-display/tests/capabilities.test.ts +54 -0
  56. package/dist/extensions/pi-tool-display/tests/config-modal.test.ts +360 -0
  57. package/dist/extensions/pi-tool-display/tests/config-store.test.ts +87 -0
  58. package/dist/extensions/pi-tool-display/tests/custom-tool-overrides.test.ts +415 -0
  59. package/dist/extensions/pi-tool-display/tests/debug-logger-edge.test.ts +630 -0
  60. package/dist/extensions/pi-tool-display/tests/debug-logger.test.ts +62 -0
  61. package/dist/extensions/pi-tool-display/tests/diff-renderer-ansi.test.ts +55 -0
  62. package/dist/extensions/pi-tool-display/tests/diff-renderer-edge.test.ts +886 -0
  63. package/dist/extensions/pi-tool-display/tests/diff-renderer-numbering.test.ts +135 -0
  64. package/dist/extensions/pi-tool-display/tests/diff-renderer-width.test.ts +454 -0
  65. package/dist/extensions/pi-tool-display/tests/diff-renderer-wrap.test.ts +169 -0
  66. package/dist/extensions/pi-tool-display/tests/index-integration.test.ts +354 -0
  67. package/dist/extensions/pi-tool-display/tests/pending-diff-preview.test.ts +79 -0
  68. package/dist/extensions/pi-tool-display/tests/presets-edge.test.ts +229 -0
  69. package/dist/extensions/pi-tool-display/tests/presets.test.ts +26 -0
  70. package/dist/extensions/pi-tool-display/tests/reload-behavior.test.ts +1241 -0
  71. package/dist/extensions/pi-tool-display/tests/render-utils.test.ts +710 -0
  72. package/dist/extensions/pi-tool-display/tests/settings-inspector.test.ts +450 -0
  73. package/dist/extensions/pi-tool-display/tests/thinking-label-edge.test.ts +904 -0
  74. package/dist/extensions/pi-tool-display/tests/thinking-label.test.ts +72 -0
  75. package/dist/extensions/pi-tool-display/tests/tool-call-box.test.ts +105 -0
  76. package/dist/extensions/pi-tool-display/tests/tool-overrides-config.test.ts +613 -0
  77. package/dist/extensions/pi-tool-display/tests/tool-overrides-mcp.test.ts +499 -0
  78. package/dist/extensions/pi-tool-display/tests/tool-overrides-registration.test.ts +315 -0
  79. package/dist/extensions/pi-tool-display/tests/tool-overrides-write-meta.test.ts +68 -0
  80. package/dist/extensions/pi-tool-display/tests/tool-ui-utils.test.ts +413 -0
  81. package/dist/extensions/pi-tool-display/tests/user-message-box-performance-red.test.ts +176 -0
  82. package/dist/extensions/pi-tool-display/tests/user-message-box.test.ts +908 -0
  83. package/dist/extensions/pi-tool-display/tests/zellij-modal.test.ts +848 -0
  84. package/dist/extensions/pi-tool-display/tool-display-api-consumer.d.ts +30 -0
  85. package/dist/extensions/pi-tool-display/tool-display-api-consumer.js +40 -0
  86. package/dist/extensions/pi-zentui/extensions/zentui/format.ts +46 -1
  87. package/dist/extensions/pi-zentui/extensions/zentui/index.ts +10 -0
  88. package/dist/extensions/pi-zentui/extensions/zentui/user-message-styles.ts +1 -1
  89. package/dist/extensions/pi-zentui/test/extension-compliance.test.ts +3 -3
  90. package/dist/extensions/pi-zentui/test/format.test.ts +50 -2
  91. package/dist/modes/interactive/components/startup-box.d.ts +38 -0
  92. package/dist/modes/interactive/components/startup-box.js +90 -0
  93. package/dist/modes/interactive/interactive-mode.d.ts +3 -0
  94. package/dist/modes/interactive/interactive-mode.js +85 -122
  95. package/dist/skills/agent-browser/SKILL.md +1 -0
  96. package/dist/skills/batch-grill-me/SKILL.md +1 -0
  97. package/dist/skills/brandkit/SKILL.md +1 -0
  98. package/dist/skills/design-references/SKILL.md +1 -0
  99. package/dist/skills/design-taste-frontend/SKILL.md +1 -0
  100. package/dist/skills/design-taste-frontend-v1/SKILL.md +1 -0
  101. package/dist/skills/full-output-enforcement/SKILL.md +1 -0
  102. package/dist/skills/gpt-taste/SKILL.md +1 -0
  103. package/dist/skills/grill-me/SKILL.md +1 -0
  104. package/dist/skills/handoff/SKILL.md +1 -0
  105. package/dist/skills/handoff-text/SKILL.md +1 -0
  106. package/dist/skills/high-end-visual-design/SKILL.md +1 -0
  107. package/dist/skills/image-to-code/SKILL.md +1 -0
  108. package/dist/skills/imagegen-frontend-mobile/SKILL.md +1 -0
  109. package/dist/skills/imagegen-frontend-web/SKILL.md +1 -0
  110. package/dist/skills/implanger/SKILL.md +1 -0
  111. package/dist/skills/improve-codebase/SKILL.md +1 -0
  112. package/dist/skills/industrial-brutalist-ui/SKILL.md +1 -0
  113. package/dist/skills/minimalist-ui/SKILL.md +1 -0
  114. package/dist/skills/pi-subagents/SKILL.md +1 -0
  115. package/dist/skills/planger/SKILL.md +1 -0
  116. package/dist/skills/ponytail/SKILL.md +1 -0
  117. package/dist/skills/ponytail-audit/SKILL.md +1 -0
  118. package/dist/skills/ponytail-debt/SKILL.md +1 -0
  119. package/dist/skills/ponytail-gain/SKILL.md +1 -0
  120. package/dist/skills/ponytail-help/SKILL.md +1 -0
  121. package/dist/skills/ponytail-review/SKILL.md +1 -0
  122. package/dist/skills/redesign-existing-projects/SKILL.md +1 -0
  123. package/dist/skills/selesai-handoff/SKILL.md +1 -0
  124. package/dist/skills/stitch-design-taste/SKILL.md +1 -0
  125. package/dist/skills/unlazy/SKILL.md +1 -0
  126. package/dist/skills/web-design-guidelines/SKILL.md +1 -0
  127. package/dist/skills/workflow/SKILL.md +1 -0
  128. package/package.json +3 -3
@@ -0,0 +1,229 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+ import {
4
+ detectToolDisplayPreset,
5
+ getToolDisplayPresetConfig,
6
+ parseToolDisplayPreset,
7
+ TOOL_DISPLAY_PRESETS,
8
+ type ToolDisplayPreset,
9
+ } from "../src/presets.ts";
10
+ import { DEFAULT_TOOL_DISPLAY_CONFIG, type ToolDisplayConfig } from "../src/types.ts";
11
+
12
+ // ---------------------------------------------------------------------------
13
+ // Tests — getToolDisplayPresetConfig
14
+ // ---------------------------------------------------------------------------
15
+
16
+ test("getToolDisplayPresetConfig returns correct config for opencode preset", () => {
17
+ const config = getToolDisplayPresetConfig("opencode");
18
+
19
+ assert.equal(config.readOutputMode, "hidden");
20
+ assert.equal(config.searchOutputMode, "hidden");
21
+ assert.equal(config.mcpOutputMode, "hidden");
22
+ assert.equal(config.bashOutputMode, "opencode");
23
+ assert.equal(config.previewLines, 8);
24
+ assert.equal(config.bashCollapsedLines, 10);
25
+ assert.equal(config.diffViewMode, "auto");
26
+ assert.equal(config.diffIndicatorMode, "bars");
27
+ });
28
+
29
+ test("getToolDisplayPresetConfig returns correct config for balanced preset", () => {
30
+ const config = getToolDisplayPresetConfig("balanced");
31
+
32
+ assert.equal(config.readOutputMode, "summary");
33
+ assert.equal(config.searchOutputMode, "count");
34
+ assert.equal(config.mcpOutputMode, "summary");
35
+ assert.equal(config.bashOutputMode, "summary");
36
+ assert.equal(config.previewLines, 8);
37
+ });
38
+
39
+ test("getToolDisplayPresetConfig returns correct config for verbose preset", () => {
40
+ const config = getToolDisplayPresetConfig("verbose");
41
+
42
+ assert.equal(config.readOutputMode, "preview");
43
+ assert.equal(config.searchOutputMode, "preview");
44
+ assert.equal(config.mcpOutputMode, "preview");
45
+ assert.equal(config.bashOutputMode, "preview");
46
+ assert.equal(config.previewLines, 12);
47
+ assert.equal(config.bashCollapsedLines, 20);
48
+ });
49
+
50
+ test("getToolDisplayPresetConfig returns correct config for boxed preset", () => {
51
+ const config = getToolDisplayPresetConfig("boxed");
52
+
53
+ assert.equal(config.boxedToolCalls, true);
54
+ assert.equal(config.readOutputMode, "hidden");
55
+ assert.equal(config.searchOutputMode, "hidden");
56
+ assert.equal(config.bashOutputMode, "opencode");
57
+ });
58
+
59
+ test("getToolDisplayPresetConfig returns independent clones for each call", () => {
60
+ const a = getToolDisplayPresetConfig("opencode");
61
+ const b = getToolDisplayPresetConfig("opencode");
62
+
63
+ assert.notEqual(a.registerToolOverrides, b.registerToolOverrides, "registerToolOverrides should be different objects");
64
+ assert.deepEqual(a, b, "values should be identical");
65
+ });
66
+
67
+ test("getToolDisplayPresetConfig for all presets preserves unchanged fields from defaults", () => {
68
+ for (const preset of TOOL_DISPLAY_PRESETS) {
69
+ const config = getToolDisplayPresetConfig(preset);
70
+ assert.equal(config.enableNativeUserMessageBox, DEFAULT_TOOL_DISPLAY_CONFIG.enableNativeUserMessageBox);
71
+ assert.equal(config.diffWordWrap, DEFAULT_TOOL_DISPLAY_CONFIG.diffWordWrap);
72
+ assert.equal(config.showTruncationHints, DEFAULT_TOOL_DISPLAY_CONFIG.showTruncationHints);
73
+ assert.equal(config.showRtkCompactionHints, DEFAULT_TOOL_DISPLAY_CONFIG.showRtkCompactionHints);
74
+ }
75
+ });
76
+
77
+ // ---------------------------------------------------------------------------
78
+ // Tests — detectToolDisplayPreset
79
+ // ---------------------------------------------------------------------------
80
+
81
+ test("detectToolDisplayPreset detects opencode preset exactly", () => {
82
+ const config = getToolDisplayPresetConfig("opencode");
83
+ assert.equal(detectToolDisplayPreset(config), "opencode");
84
+ });
85
+
86
+ test("detectToolDisplayPreset detects balanced preset exactly", () => {
87
+ const config = getToolDisplayPresetConfig("balanced");
88
+ assert.equal(detectToolDisplayPreset(config), "balanced");
89
+ });
90
+
91
+ test("detectToolDisplayPreset detects verbose preset exactly", () => {
92
+ const config = getToolDisplayPresetConfig("verbose");
93
+ assert.equal(detectToolDisplayPreset(config), "verbose");
94
+ });
95
+
96
+ test("detectToolDisplayPreset returns 'custom' when config differs by one field", () => {
97
+ const balanced = getToolDisplayPresetConfig("balanced");
98
+ const modified = { ...balanced, previewLines: balanced.previewLines + 1 };
99
+ assert.equal(detectToolDisplayPreset(modified), "custom");
100
+ });
101
+
102
+ test("detectToolDisplayPreset returns 'custom' when bashCollapsedLines differs", () => {
103
+ const verbose = getToolDisplayPresetConfig("verbose");
104
+ const modified = { ...verbose, bashCollapsedLines: verbose.bashCollapsedLines + 5 };
105
+ assert.equal(detectToolDisplayPreset(modified), "custom");
106
+ });
107
+
108
+ test("detectToolDisplayPreset returns 'custom' when tool ownership differs", () => {
109
+ const opencode = getToolDisplayPresetConfig("opencode");
110
+ const modified: ToolDisplayConfig = {
111
+ ...opencode,
112
+ registerToolOverrides: { ...opencode.registerToolOverrides, read: false },
113
+ };
114
+ assert.equal(detectToolDisplayPreset(modified), "custom");
115
+ });
116
+
117
+ test("detectToolDisplayPreset returns 'custom' when diffViewMode differs", () => {
118
+ const opencode = getToolDisplayPresetConfig("opencode");
119
+ const modified = { ...opencode, diffViewMode: "split" as const };
120
+ assert.equal(detectToolDisplayPreset(modified), "custom");
121
+ });
122
+
123
+ test("detectToolDisplayPreset returns 'custom' when showTruncationHints changes", () => {
124
+ const opencode = getToolDisplayPresetConfig("opencode");
125
+ const modified = { ...opencode, showTruncationHints: true };
126
+ assert.equal(detectToolDisplayPreset(modified), "custom");
127
+ });
128
+
129
+ test("detectToolDisplayPreset returns 'custom' when showRtkCompactionHints changes", () => {
130
+ const opencode = getToolDisplayPresetConfig("opencode");
131
+ const modified = { ...opencode, showRtkCompactionHints: true };
132
+ assert.equal(detectToolDisplayPreset(modified), "custom");
133
+ });
134
+
135
+ test("detectToolDisplayPreset finds opencode when boxed calls are turned off", () => {
136
+ const boxed = getToolDisplayPresetConfig("boxed");
137
+ // The boxed preset is opencode + bordered calls, so disabling the border
138
+ // resolves back to the opencode profile.
139
+ assert.equal(detectToolDisplayPreset({ ...boxed, boxedToolCalls: false }), "opencode");
140
+ });
141
+
142
+ test("detectToolDisplayPreset treats deeply equal cloned configs as matching", () => {
143
+ const a = getToolDisplayPresetConfig("balanced");
144
+ const b = getToolDisplayPresetConfig("balanced");
145
+ assert.notEqual(a, b, "should be different references");
146
+ assert.equal(detectToolDisplayPreset(a), "balanced");
147
+ assert.equal(detectToolDisplayPreset(b), "balanced");
148
+ });
149
+
150
+ test("detectToolDisplayPreset detects each preset from the preset list", () => {
151
+ for (const preset of TOOL_DISPLAY_PRESETS) {
152
+ const config = getToolDisplayPresetConfig(preset);
153
+ assert.equal(
154
+ detectToolDisplayPreset(config),
155
+ preset,
156
+ `should detect preset ${preset} from its config`,
157
+ );
158
+ }
159
+ });
160
+
161
+ // ---------------------------------------------------------------------------
162
+ // Tests — parseToolDisplayPreset
163
+ // ---------------------------------------------------------------------------
164
+
165
+ test("parseToolDisplayPreset parses 'opencode'", () => {
166
+ assert.equal(parseToolDisplayPreset("opencode"), "opencode");
167
+ });
168
+
169
+ test("parseToolDisplayPreset parses 'balanced'", () => {
170
+ assert.equal(parseToolDisplayPreset("balanced"), "balanced");
171
+ });
172
+
173
+ test("parseToolDisplayPreset parses 'verbose'", () => {
174
+ assert.equal(parseToolDisplayPreset("verbose"), "verbose");
175
+ });
176
+
177
+ test("parseToolDisplayPreset parses 'boxed'", () => {
178
+ assert.equal(parseToolDisplayPreset("boxed"), "boxed");
179
+ });
180
+
181
+ test("parseToolDisplayPreset is case insensitive", () => {
182
+ assert.equal(parseToolDisplayPreset("OPencode"), "opencode");
183
+ assert.equal(parseToolDisplayPreset("BALANCED"), "balanced");
184
+ assert.equal(parseToolDisplayPreset("Verbose"), "verbose");
185
+ assert.equal(parseToolDisplayPreset("OpenCode"), "opencode");
186
+ });
187
+
188
+ test("parseToolDisplayPreset trims whitespace", () => {
189
+ assert.equal(parseToolDisplayPreset(" opencode "), "opencode");
190
+ assert.equal(parseToolDisplayPreset("\tbalanced\n"), "balanced");
191
+ assert.equal(parseToolDisplayPreset(" verbose "), "verbose");
192
+ });
193
+
194
+ test("parseToolDisplayPreset returns undefined for empty string", () => {
195
+ assert.equal(parseToolDisplayPreset(""), undefined);
196
+ });
197
+
198
+ test("parseToolDisplayPreset returns undefined for whitespace-only string", () => {
199
+ assert.equal(parseToolDisplayPreset(" "), undefined);
200
+ assert.equal(parseToolDisplayPreset("\t\n"), undefined);
201
+ });
202
+
203
+ test("parseToolDisplayPreset returns undefined for unknown preset name", () => {
204
+ assert.equal(parseToolDisplayPreset("custom"), undefined);
205
+ assert.equal(parseToolDisplayPreset("turbo"), undefined);
206
+ assert.equal(parseToolDisplayPreset("minimal"), undefined);
207
+ assert.equal(parseToolDisplayPreset("opencode-2"), undefined);
208
+ });
209
+
210
+ test("parseToolDisplayPreset returns undefined for mixed case unknown names", () => {
211
+ assert.equal(parseToolDisplayPreset("Custom"), undefined);
212
+ assert.equal(parseToolDisplayPreset("Opencode2"), undefined);
213
+ });
214
+
215
+ test("parseToolDisplayPreset handles all valid preset names", () => {
216
+ for (const preset of TOOL_DISPLAY_PRESETS) {
217
+ assert.equal(
218
+ parseToolDisplayPreset(preset),
219
+ preset,
220
+ `should parse the exact preset name: ${preset}`,
221
+ );
222
+ }
223
+ });
224
+
225
+ test("parseToolDisplayPreset returns undefined for strings with extra characters", () => {
226
+ assert.equal(parseToolDisplayPreset("opencode!"), undefined);
227
+ assert.equal(parseToolDisplayPreset("balanced."), undefined);
228
+ assert.equal(parseToolDisplayPreset("verbose\n"), "verbose"); // trailing newline after trim
229
+ });
@@ -0,0 +1,26 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+ import {
4
+ detectToolDisplayPreset,
5
+ getToolDisplayPresetConfig,
6
+ parseToolDisplayPreset,
7
+ } from "../src/presets.ts";
8
+
9
+ test("preset parsing is case-insensitive and rejects unknown names", () => {
10
+ assert.equal(parseToolDisplayPreset(" BALANCED "), "balanced");
11
+ assert.equal(parseToolDisplayPreset("Verbose"), "verbose");
12
+ assert.equal(parseToolDisplayPreset(""), undefined);
13
+ assert.equal(parseToolDisplayPreset("custom"), undefined);
14
+ });
15
+
16
+ test("preset detection matches cloned preset configs and detects custom changes", () => {
17
+ const balanced = getToolDisplayPresetConfig("balanced");
18
+ const anotherBalanced = getToolDisplayPresetConfig("balanced");
19
+
20
+ assert.notEqual(balanced.registerToolOverrides, anotherBalanced.registerToolOverrides);
21
+ assert.equal(detectToolDisplayPreset(balanced), "balanced");
22
+ assert.equal(
23
+ detectToolDisplayPreset({ ...balanced, previewLines: balanced.previewLines + 1 }),
24
+ "custom",
25
+ );
26
+ });