@dungle-scrubs/tallow 0.9.4 → 0.9.7

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 (212) hide show
  1. package/dist/cli.js +8 -5
  2. package/dist/cli.js.map +1 -1
  3. package/dist/config.d.ts +1 -1
  4. package/dist/config.js +1 -1
  5. package/dist/interactive-mode-patch.d.ts +24 -12
  6. package/dist/interactive-mode-patch.d.ts.map +1 -1
  7. package/dist/interactive-mode-patch.js +229 -146
  8. package/dist/interactive-mode-patch.js.map +1 -1
  9. package/dist/interactive-reset.d.ts +49 -0
  10. package/dist/interactive-reset.d.ts.map +1 -0
  11. package/dist/interactive-reset.js +40 -0
  12. package/dist/interactive-reset.js.map +1 -0
  13. package/dist/pi-tui-editor-patch.d.ts +10 -0
  14. package/dist/pi-tui-editor-patch.d.ts.map +1 -0
  15. package/dist/pi-tui-editor-patch.js +159 -0
  16. package/dist/pi-tui-editor-patch.js.map +1 -0
  17. package/dist/pi-tui-patch.d.ts +2 -0
  18. package/dist/pi-tui-patch.d.ts.map +1 -0
  19. package/dist/pi-tui-patch.js +563 -0
  20. package/dist/pi-tui-patch.js.map +1 -0
  21. package/dist/pi-tui-settings-list-patch.d.ts +11 -0
  22. package/dist/pi-tui-settings-list-patch.d.ts.map +1 -0
  23. package/dist/pi-tui-settings-list-patch.js +38 -0
  24. package/dist/pi-tui-settings-list-patch.js.map +1 -0
  25. package/dist/process-cleanup.js +1 -1
  26. package/dist/process-cleanup.js.map +1 -1
  27. package/dist/reset-diagnostics.d.ts +69 -0
  28. package/dist/reset-diagnostics.d.ts.map +1 -0
  29. package/dist/reset-diagnostics.js +41 -0
  30. package/dist/reset-diagnostics.js.map +1 -0
  31. package/dist/sdk.d.ts +7 -23
  32. package/dist/sdk.d.ts.map +1 -1
  33. package/dist/sdk.js +211 -174
  34. package/dist/sdk.js.map +1 -1
  35. package/dist/workspace-transition-interactive.d.ts +1 -0
  36. package/dist/workspace-transition-interactive.d.ts.map +1 -1
  37. package/dist/workspace-transition-interactive.js +8 -18
  38. package/dist/workspace-transition-interactive.js.map +1 -1
  39. package/extensions/__integration__/audit-findings.test.ts +4 -5
  40. package/extensions/_icons/index.ts +2 -4
  41. package/extensions/_shared/__tests__/image-metadata.test.ts +33 -0
  42. package/extensions/_shared/__tests__/shell-policy.test.ts +19 -0
  43. package/extensions/_shared/__tests__/terminal-links.test.ts +18 -0
  44. package/extensions/_shared/image-metadata.ts +99 -0
  45. package/extensions/_shared/inline-preview.ts +1 -1
  46. package/extensions/_shared/shell-policy.ts +121 -1
  47. package/extensions/_shared/terminal-links.ts +22 -0
  48. package/extensions/ask-user-question-tool/index.ts +0 -3
  49. package/extensions/clear/__tests__/clear.test.ts +269 -2
  50. package/extensions/command-expansion/index.ts +9 -3
  51. package/extensions/context-files/index.ts +5 -1
  52. package/extensions/context-fork/__tests__/context-fork.test.ts +94 -1
  53. package/extensions/context-fork/extension.json +1 -1
  54. package/extensions/context-fork/frontmatter-index.ts +6 -1
  55. package/extensions/context-fork/index.ts +32 -0
  56. package/extensions/edit-tool-enhanced/index.ts +2 -1
  57. package/extensions/git-status/__tests__/git-status.test.ts +65 -2
  58. package/extensions/git-status/index.ts +268 -98
  59. package/extensions/hooks/index.ts +33 -11
  60. package/extensions/loop/index.ts +14 -1
  61. package/extensions/lsp/index.ts +64 -13
  62. package/extensions/lsp/package.json +2 -2
  63. package/extensions/minimal-skill-display/index.ts +7 -1
  64. package/extensions/random-spinner/index.ts +7 -642
  65. package/extensions/read-tool-enhanced/index.ts +13 -10
  66. package/extensions/render-stabilizer/__tests__/render-stabilizer.test.ts +2 -3
  67. package/extensions/render-stabilizer/index.ts +6 -6
  68. package/extensions/rewind/__tests__/session-files.test.ts +115 -0
  69. package/extensions/rewind/__tests__/snapshots.test.ts +23 -0
  70. package/extensions/rewind/index.ts +5 -0
  71. package/extensions/rewind/session-files.ts +138 -0
  72. package/extensions/rewind/snapshots.ts +104 -5
  73. package/extensions/skill-commands/index.ts +6 -1
  74. package/extensions/slash-command-bridge/__tests__/slash-command-bridge.test.ts +26 -0
  75. package/extensions/slash-command-bridge/index.ts +14 -2
  76. package/extensions/subagent-tool/model-resolver.ts +274 -7
  77. package/extensions/subagent-tool/schema.ts +1 -2
  78. package/extensions/tasks/commands/register-tasks-extension.ts +9 -9
  79. package/extensions/teams-tool/tools/register-extension.ts +1 -3
  80. package/extensions/teams-tool/tools/teammate-tools.ts +1 -2
  81. package/extensions/web-search-tool/index.ts +2 -1
  82. package/extensions/wezterm-pane-control/index.ts +1 -2
  83. package/extensions/write-tool-enhanced/index.ts +2 -1
  84. package/node_modules/@mariozechner/pi-tui/README.md +56 -34
  85. package/node_modules/@mariozechner/pi-tui/dist/autocomplete.d.ts +18 -13
  86. package/node_modules/@mariozechner/pi-tui/dist/autocomplete.d.ts.map +1 -1
  87. package/node_modules/@mariozechner/pi-tui/dist/autocomplete.js +182 -113
  88. package/node_modules/@mariozechner/pi-tui/dist/autocomplete.js.map +1 -1
  89. package/node_modules/@mariozechner/pi-tui/dist/components/cancellable-loader.js +3 -3
  90. package/node_modules/@mariozechner/pi-tui/dist/components/cancellable-loader.js.map +1 -1
  91. package/node_modules/@mariozechner/pi-tui/dist/components/editor.d.ts +45 -36
  92. package/node_modules/@mariozechner/pi-tui/dist/components/editor.d.ts.map +1 -1
  93. package/node_modules/@mariozechner/pi-tui/dist/components/editor.js +489 -325
  94. package/node_modules/@mariozechner/pi-tui/dist/components/editor.js.map +1 -1
  95. package/node_modules/@mariozechner/pi-tui/dist/components/image.d.ts +1 -99
  96. package/node_modules/@mariozechner/pi-tui/dist/components/image.d.ts.map +1 -1
  97. package/node_modules/@mariozechner/pi-tui/dist/components/image.js +17 -192
  98. package/node_modules/@mariozechner/pi-tui/dist/components/image.js.map +1 -1
  99. package/node_modules/@mariozechner/pi-tui/dist/components/input.d.ts.map +1 -1
  100. package/node_modules/@mariozechner/pi-tui/dist/components/input.js +57 -60
  101. package/node_modules/@mariozechner/pi-tui/dist/components/input.js.map +1 -1
  102. package/node_modules/@mariozechner/pi-tui/dist/components/loader.d.ts +2 -69
  103. package/node_modules/@mariozechner/pi-tui/dist/components/loader.d.ts.map +1 -1
  104. package/node_modules/@mariozechner/pi-tui/dist/components/loader.js +5 -102
  105. package/node_modules/@mariozechner/pi-tui/dist/components/loader.js.map +1 -1
  106. package/node_modules/@mariozechner/pi-tui/dist/components/markdown.d.ts.map +1 -1
  107. package/node_modules/@mariozechner/pi-tui/dist/components/markdown.js +111 -53
  108. package/node_modules/@mariozechner/pi-tui/dist/components/markdown.js.map +1 -1
  109. package/node_modules/@mariozechner/pi-tui/dist/components/select-list.d.ts +19 -1
  110. package/node_modules/@mariozechner/pi-tui/dist/components/select-list.d.ts.map +1 -1
  111. package/node_modules/@mariozechner/pi-tui/dist/components/select-list.js +78 -67
  112. package/node_modules/@mariozechner/pi-tui/dist/components/select-list.js.map +1 -1
  113. package/node_modules/@mariozechner/pi-tui/dist/components/settings-list.d.ts +1 -25
  114. package/node_modules/@mariozechner/pi-tui/dist/components/settings-list.d.ts.map +1 -1
  115. package/node_modules/@mariozechner/pi-tui/dist/components/settings-list.js +13 -50
  116. package/node_modules/@mariozechner/pi-tui/dist/components/settings-list.js.map +1 -1
  117. package/node_modules/@mariozechner/pi-tui/dist/index.d.ts +8 -10
  118. package/node_modules/@mariozechner/pi-tui/dist/index.d.ts.map +1 -1
  119. package/node_modules/@mariozechner/pi-tui/dist/index.js +6 -9
  120. package/node_modules/@mariozechner/pi-tui/dist/index.js.map +1 -1
  121. package/node_modules/@mariozechner/pi-tui/dist/keybindings.d.ts +108 -238
  122. package/node_modules/@mariozechner/pi-tui/dist/keybindings.d.ts.map +1 -1
  123. package/node_modules/@mariozechner/pi-tui/dist/keybindings.js +108 -365
  124. package/node_modules/@mariozechner/pi-tui/dist/keybindings.js.map +1 -1
  125. package/node_modules/@mariozechner/pi-tui/dist/keys.d.ts +33 -48
  126. package/node_modules/@mariozechner/pi-tui/dist/keys.d.ts.map +1 -1
  127. package/node_modules/@mariozechner/pi-tui/dist/keys.js +239 -155
  128. package/node_modules/@mariozechner/pi-tui/dist/keys.js.map +1 -1
  129. package/node_modules/@mariozechner/pi-tui/dist/terminal-image.d.ts +14 -94
  130. package/node_modules/@mariozechner/pi-tui/dist/terminal-image.d.ts.map +1 -1
  131. package/node_modules/@mariozechner/pi-tui/dist/terminal-image.js +44 -186
  132. package/node_modules/@mariozechner/pi-tui/dist/terminal-image.js.map +1 -1
  133. package/node_modules/@mariozechner/pi-tui/dist/terminal.d.ts +13 -58
  134. package/node_modules/@mariozechner/pi-tui/dist/terminal.d.ts.map +1 -1
  135. package/node_modules/@mariozechner/pi-tui/dist/terminal.js +78 -111
  136. package/node_modules/@mariozechner/pi-tui/dist/terminal.js.map +1 -1
  137. package/node_modules/@mariozechner/pi-tui/dist/tui.d.ts +24 -110
  138. package/node_modules/@mariozechner/pi-tui/dist/tui.d.ts.map +1 -1
  139. package/node_modules/@mariozechner/pi-tui/dist/tui.js +188 -435
  140. package/node_modules/@mariozechner/pi-tui/dist/tui.js.map +1 -1
  141. package/node_modules/@mariozechner/pi-tui/dist/utils.d.ts +0 -18
  142. package/node_modules/@mariozechner/pi-tui/dist/utils.d.ts.map +1 -1
  143. package/node_modules/@mariozechner/pi-tui/dist/utils.js +251 -119
  144. package/node_modules/@mariozechner/pi-tui/dist/utils.js.map +1 -1
  145. package/node_modules/@mariozechner/pi-tui/package.json +6 -6
  146. package/node_modules/@mariozechner/pi-tui/src/__tests__/__snapshots__/render.test.ts.snap +3 -40
  147. package/node_modules/@mariozechner/pi-tui/src/__tests__/image-component.test.ts +71 -81
  148. package/node_modules/@mariozechner/pi-tui/src/__tests__/render.test.ts +0 -33
  149. package/node_modules/@mariozechner/pi-tui/src/__tests__/terminal-image.test.ts +93 -334
  150. package/node_modules/@mariozechner/pi-tui/src/__tests__/tui-render-scheduling.test.ts +1 -1
  151. package/node_modules/@mariozechner/pi-tui/src/__tests__/utils.test.ts +11 -196
  152. package/node_modules/@mariozechner/pi-tui/src/autocomplete.ts +228 -142
  153. package/node_modules/@mariozechner/pi-tui/src/components/cancellable-loader.ts +3 -3
  154. package/node_modules/@mariozechner/pi-tui/src/components/editor.ts +624 -390
  155. package/node_modules/@mariozechner/pi-tui/src/components/image.ts +17 -227
  156. package/node_modules/@mariozechner/pi-tui/src/components/input.ts +71 -63
  157. package/node_modules/@mariozechner/pi-tui/src/components/loader.ts +5 -137
  158. package/node_modules/@mariozechner/pi-tui/src/components/markdown.ts +143 -52
  159. package/node_modules/@mariozechner/pi-tui/src/components/select-list.ts +136 -70
  160. package/node_modules/@mariozechner/pi-tui/src/components/settings-list.ts +12 -51
  161. package/node_modules/@mariozechner/pi-tui/src/index.ts +17 -36
  162. package/node_modules/@mariozechner/pi-tui/src/keybindings.ts +148 -421
  163. package/node_modules/@mariozechner/pi-tui/src/keys.ts +253 -181
  164. package/node_modules/@mariozechner/pi-tui/src/terminal-image.ts +51 -252
  165. package/node_modules/@mariozechner/pi-tui/src/terminal.ts +78 -133
  166. package/node_modules/@mariozechner/pi-tui/src/tui.ts +202 -478
  167. package/node_modules/@mariozechner/pi-tui/src/utils.ts +289 -125
  168. package/node_modules/@mariozechner/pi-tui/tsconfig.build.json +1 -0
  169. package/package.json +13 -13
  170. package/packages/tallow-tui/node_modules/@types/mime-types/README.md +8 -2
  171. package/packages/tallow-tui/node_modules/@types/mime-types/index.d.ts +6 -0
  172. package/packages/tallow-tui/node_modules/@types/mime-types/package.json +9 -3
  173. package/packages/tallow-tui/node_modules/get-east-asian-width/lookup-data.js +18 -0
  174. package/packages/tallow-tui/node_modules/get-east-asian-width/lookup.js +116 -384
  175. package/packages/tallow-tui/node_modules/get-east-asian-width/package.json +5 -4
  176. package/packages/tallow-tui/node_modules/get-east-asian-width/utilities.js +24 -0
  177. package/packages/tallow-tui/node_modules/marked/README.md +5 -4
  178. package/packages/tallow-tui/node_modules/marked/bin/main.js +10 -8
  179. package/packages/tallow-tui/node_modules/marked/bin/marked.js +2 -1
  180. package/packages/tallow-tui/node_modules/marked/lib/marked.d.ts +156 -125
  181. package/packages/tallow-tui/node_modules/marked/lib/marked.esm.js +67 -2179
  182. package/packages/tallow-tui/node_modules/marked/lib/marked.esm.js.map +3 -3
  183. package/packages/tallow-tui/node_modules/marked/lib/marked.umd.js +67 -2201
  184. package/packages/tallow-tui/node_modules/marked/lib/marked.umd.js.map +3 -3
  185. package/packages/tallow-tui/node_modules/marked/man/marked.1 +4 -2
  186. package/packages/tallow-tui/node_modules/marked/man/marked.1.md +2 -1
  187. package/packages/tallow-tui/node_modules/marked/package.json +26 -34
  188. package/skills/tallow-expert/SKILL.md +3 -5
  189. package/node_modules/@mariozechner/pi-tui/dist/border-styles.d.ts +0 -32
  190. package/node_modules/@mariozechner/pi-tui/dist/border-styles.d.ts.map +0 -1
  191. package/node_modules/@mariozechner/pi-tui/dist/border-styles.js +0 -46
  192. package/node_modules/@mariozechner/pi-tui/dist/border-styles.js.map +0 -1
  193. package/node_modules/@mariozechner/pi-tui/dist/components/bordered-box.d.ts +0 -52
  194. package/node_modules/@mariozechner/pi-tui/dist/components/bordered-box.d.ts.map +0 -1
  195. package/node_modules/@mariozechner/pi-tui/dist/components/bordered-box.js +0 -89
  196. package/node_modules/@mariozechner/pi-tui/dist/components/bordered-box.js.map +0 -1
  197. package/node_modules/@mariozechner/pi-tui/dist/test-utils/capability-env.d.ts +0 -14
  198. package/node_modules/@mariozechner/pi-tui/dist/test-utils/capability-env.d.ts.map +0 -1
  199. package/node_modules/@mariozechner/pi-tui/dist/test-utils/capability-env.js +0 -55
  200. package/node_modules/@mariozechner/pi-tui/dist/test-utils/capability-env.js.map +0 -1
  201. package/node_modules/@mariozechner/pi-tui/src/__tests__/editor-change-listener.test.ts +0 -121
  202. package/node_modules/@mariozechner/pi-tui/src/__tests__/editor-ghost-text.test.ts +0 -112
  203. package/node_modules/@mariozechner/pi-tui/src/__tests__/mouse-events.test.ts +0 -134
  204. package/node_modules/@mariozechner/pi-tui/src/__tests__/settings-list.test.ts +0 -81
  205. package/node_modules/@mariozechner/pi-tui/src/__tests__/tui-diff-regression.test.ts +0 -555
  206. package/node_modules/@mariozechner/pi-tui/src/border-styles.ts +0 -60
  207. package/node_modules/@mariozechner/pi-tui/src/components/bordered-box.ts +0 -113
  208. package/node_modules/@mariozechner/pi-tui/src/test-utils/capability-env.ts +0 -56
  209. package/packages/tallow-tui/node_modules/marked/lib/marked.cjs +0 -2211
  210. package/packages/tallow-tui/node_modules/marked/lib/marked.cjs.map +0 -7
  211. package/packages/tallow-tui/node_modules/marked/lib/marked.d.cts +0 -728
  212. package/packages/tallow-tui/node_modules/marked/marked.min.js +0 -69
@@ -1,650 +1,15 @@
1
1
  /**
2
- * Random Spinner Extension
3
- *
4
- * Replaces the default Loader spinner with a randomly-picked preset
5
- * on each session start. All presets are inlined — no external dependency.
2
+ * Random spinner extension.
6
3
  *
7
- * Users can pin a specific spinner via settings.json:
8
- * { "spinner": "arc" }
9
- * Or keep the default "random" behavior.
4
+ * Spinner customization previously depended on fork-only Loader globals.
5
+ * The pi-tui fork is being reduced back toward upstream behavior, so this
6
+ * extension now intentionally leaves Loader behavior unchanged.
10
7
  *
11
- * Disable this extension to always use the Loader's hardcoded default (dots).
8
+ * @param pi - Extension API
9
+ * @returns Nothing
12
10
  */
13
-
14
- import * as fs from "node:fs";
15
11
  import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
16
- import { Loader } from "@mariozechner/pi-tui";
17
- import { getTallowSettingsPath } from "../_shared/tallow-paths.js";
18
-
19
- // ─── Types ───────────────────────────────────────────────────────────────────
20
-
21
- interface SpinnerPreset {
22
- interval: number;
23
- frames: string[];
24
- }
25
-
26
- interface SpinnerSettings {
27
- spinner?: string;
28
- }
29
-
30
- // ─── Curated Presets ─────────────────────────────────────────────────────────
31
- // Source: cli-spinners, filtered to glyphs that render reliably in common
32
- // monospace terminal fonts. Only frames using well-supported Unicode blocks:
33
- // ASCII, Latin-1, General Punctuation, Arrows, Math Operators, Misc Technical,
34
- // Box Drawing, Block Elements, Geometric Shapes, Misc Symbols, Dingbats, Braille.
35
-
36
- /* eslint-disable @stylistic/max-len */
37
- const SPINNERS: Record<string, SpinnerPreset> = {
38
- dots: { interval: 80, frames: ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"] },
39
- dots2: { interval: 80, frames: ["⣾", "⣽", "⣻", "⢿", "⡿", "⣟", "⣯", "⣷"] },
40
- dots3: { interval: 80, frames: ["⠋", "⠙", "⠚", "⠞", "⠖", "⠦", "⠴", "⠲", "⠳", "⠓"] },
41
- dots4: {
42
- interval: 80,
43
- frames: ["⠄", "⠆", "⠇", "⠋", "⠙", "⠸", "⠰", "⠠", "⠰", "⠸", "⠙", "⠋", "⠇", "⠆"],
44
- },
45
- dots5: {
46
- interval: 80,
47
- frames: ["⠋", "⠙", "⠚", "⠒", "⠂", "⠂", "⠒", "⠲", "⠴", "⠦", "⠖", "⠒", "⠐", "⠐", "⠒", "⠓", "⠋"],
48
- },
49
- dots6: {
50
- interval: 80,
51
- frames: [
52
- "⠁",
53
- "⠉",
54
- "⠙",
55
- "⠚",
56
- "⠒",
57
- "⠂",
58
- "⠂",
59
- "⠒",
60
- "⠲",
61
- "⠴",
62
- "⠤",
63
- "⠄",
64
- "⠄",
65
- "⠤",
66
- "⠴",
67
- "⠲",
68
- "⠒",
69
- "⠂",
70
- "⠂",
71
- "⠒",
72
- "⠚",
73
- "⠙",
74
- "⠉",
75
- "⠁",
76
- ],
77
- },
78
- dots7: {
79
- interval: 80,
80
- frames: [
81
- "⠈",
82
- "⠉",
83
- "⠋",
84
- "⠓",
85
- "⠒",
86
- "⠐",
87
- "⠐",
88
- "⠒",
89
- "⠖",
90
- "⠦",
91
- "⠤",
92
- "⠠",
93
- "⠠",
94
- "⠤",
95
- "⠦",
96
- "⠖",
97
- "⠒",
98
- "⠐",
99
- "⠐",
100
- "⠒",
101
- "⠓",
102
- "⠋",
103
- "⠉",
104
- "⠈",
105
- ],
106
- },
107
- dots8: {
108
- interval: 80,
109
- frames: [
110
- "⠁",
111
- "⠁",
112
- "⠉",
113
- "⠙",
114
- "⠚",
115
- "⠒",
116
- "⠂",
117
- "⠂",
118
- "⠒",
119
- "⠲",
120
- "⠴",
121
- "⠤",
122
- "⠄",
123
- "⠄",
124
- "⠤",
125
- "⠠",
126
- "⠠",
127
- "⠤",
128
- "⠦",
129
- "⠖",
130
- "⠒",
131
- "⠐",
132
- "⠐",
133
- "⠒",
134
- "⠓",
135
- "⠋",
136
- "⠉",
137
- "⠈",
138
- "⠈",
139
- ],
140
- },
141
- dots9: { interval: 80, frames: ["⢹", "⢺", "⢼", "⣸", "⣇", "⡧", "⡗", "⡏"] },
142
- dots10: { interval: 80, frames: ["⢄", "⢂", "⢁", "⡁", "⡈", "⡐", "⡠"] },
143
- dots11: { interval: 100, frames: ["⠁", "⠂", "⠄", "⡀", "⢀", "⠠", "⠐", "⠈"] },
144
- dots12: {
145
- interval: 80,
146
- frames: [
147
- "⢀⠀",
148
- "⡀⠀",
149
- "⠄⠀",
150
- "⢂⠀",
151
- "⡂⠀",
152
- "⠅⠀",
153
- "⢃⠀",
154
- "⡃⠀",
155
- "⠍⠀",
156
- "⢋⠀",
157
- "⡋⠀",
158
- "⠍⠁",
159
- "⢋⠁",
160
- "⡋⠁",
161
- "⠍⠉",
162
- "⠋⠉",
163
- "⠋⠉",
164
- "⠉⠙",
165
- "⠉⠙",
166
- "⠉⠩",
167
- "⠈⢙",
168
- "⠈⡙",
169
- "⢈⠩",
170
- "⡀⢙",
171
- "⠄⡙",
172
- "⢂⠩",
173
- "⡂⢘",
174
- "⠅⡘",
175
- "⢃⠨",
176
- "⡃⢐",
177
- "⠍⡐",
178
- "⢋⠠",
179
- "⡋⢀",
180
- "⠍⡁",
181
- "⢋⠁",
182
- "⡋⠁",
183
- "⠍⠉",
184
- "⠋⠉",
185
- "⠋⠉",
186
- "⠉⠙",
187
- "⠉⠙",
188
- "⠉⠩",
189
- "⠈⢙",
190
- "⠈⡙",
191
- "⠈⠩",
192
- "⠀⢙",
193
- "⠀⡙",
194
- "⠀⠩",
195
- "⠀⢘",
196
- "⠀⡘",
197
- "⠀⠨",
198
- "⠀⢐",
199
- "⠀⡐",
200
- "⠀⠠",
201
- "⠀⢀",
202
- "⠀⡀",
203
- ],
204
- },
205
- dots13: { interval: 80, frames: ["⣼", "⣹", "⢻", "⠿", "⡟", "⣏", "⣧", "⣶"] },
206
- dots14: {
207
- interval: 80,
208
- frames: ["⠉⠉", "⠈⠙", "⠀⠹", "⠀⢸", "⠀⣰", "⢀⣠", "⣀⣀", "⣄⡀", "⣆⠀", "⡇⠀", "⠏⠀", "⠋⠁"],
209
- },
210
- dots8Bit: {
211
- interval: 80,
212
- frames: [
213
- "⠀",
214
- "⠁",
215
- "⠂",
216
- "⠃",
217
- "⠄",
218
- "⠅",
219
- "⠆",
220
- "⠇",
221
- "⡀",
222
- "⡁",
223
- "⡂",
224
- "⡃",
225
- "⡄",
226
- "⡅",
227
- "⡆",
228
- "⡇",
229
- "⠈",
230
- "⠉",
231
- "⠊",
232
- "⠋",
233
- "⠌",
234
- "⠍",
235
- "⠎",
236
- "⠏",
237
- "⡈",
238
- "⡉",
239
- "⡊",
240
- "⡋",
241
- "⡌",
242
- "⡍",
243
- "⡎",
244
- "⡏",
245
- "⠐",
246
- "⠑",
247
- "⠒",
248
- "⠓",
249
- "⠔",
250
- "⠕",
251
- "⠖",
252
- "⠗",
253
- "⡐",
254
- "⡑",
255
- "⡒",
256
- "⡓",
257
- "⡔",
258
- "⡕",
259
- "⡖",
260
- "⡗",
261
- "⠘",
262
- "⠙",
263
- "⠚",
264
- "⠛",
265
- "⠜",
266
- "⠝",
267
- "⠞",
268
- "⠟",
269
- "⡘",
270
- "⡙",
271
- "⡚",
272
- "⡛",
273
- "⡜",
274
- "⡝",
275
- "⡞",
276
- "⡟",
277
- "⠠",
278
- "⠡",
279
- "⠢",
280
- "⠣",
281
- "⠤",
282
- "⠥",
283
- "⠦",
284
- "⠧",
285
- "⡠",
286
- "⡡",
287
- "⡢",
288
- "⡣",
289
- "⡤",
290
- "⡥",
291
- "⡦",
292
- "⡧",
293
- "⠨",
294
- "⠩",
295
- "⠪",
296
- "⠫",
297
- "⠬",
298
- "⠭",
299
- "⠮",
300
- "⠯",
301
- "⡨",
302
- "⡩",
303
- "⡪",
304
- "⡫",
305
- "⡬",
306
- "⡭",
307
- "⡮",
308
- "⡯",
309
- "⠰",
310
- "⠱",
311
- "⠲",
312
- "⠳",
313
- "⠴",
314
- "⠵",
315
- "⠶",
316
- "⠷",
317
- "⡰",
318
- "⡱",
319
- "⡲",
320
- "⡳",
321
- "⡴",
322
- "⡵",
323
- "⡶",
324
- "⡷",
325
- "⠸",
326
- "⠹",
327
- "⠺",
328
- "⠻",
329
- "⠼",
330
- "⠽",
331
- "⠾",
332
- "⠿",
333
- "⡸",
334
- "⡹",
335
- "⡺",
336
- "⡻",
337
- "⡼",
338
- "⡽",
339
- "⡾",
340
- "⡿",
341
- "⢀",
342
- "⢁",
343
- "⢂",
344
- "⢃",
345
- "⢄",
346
- "⢅",
347
- "⢆",
348
- "⢇",
349
- "⣀",
350
- "⣁",
351
- "⣂",
352
- "⣃",
353
- "⣄",
354
- "⣅",
355
- "⣆",
356
- "⣇",
357
- "⢈",
358
- "⢉",
359
- "⢊",
360
- "⢋",
361
- "⢌",
362
- "⢍",
363
- "⢎",
364
- "⢏",
365
- "⣈",
366
- "⣉",
367
- "⣊",
368
- "⣋",
369
- "⣌",
370
- "⣍",
371
- "⣎",
372
- "⣏",
373
- "⢐",
374
- "⢑",
375
- "⢒",
376
- "⢓",
377
- "⢔",
378
- "⢕",
379
- "⢖",
380
- "⢗",
381
- "⣐",
382
- "⣑",
383
- "⣒",
384
- "⣓",
385
- "⣔",
386
- "⣕",
387
- "⣖",
388
- "⣗",
389
- "⢘",
390
- "⢙",
391
- "⢚",
392
- "⢛",
393
- "⢜",
394
- "⢝",
395
- "⢞",
396
- "⢟",
397
- "⣘",
398
- "⣙",
399
- "⣚",
400
- "⣛",
401
- "⣜",
402
- "⣝",
403
- "⣞",
404
- "⣟",
405
- "⢠",
406
- "⢡",
407
- "⢢",
408
- "⢣",
409
- "⢤",
410
- "⢥",
411
- "⢦",
412
- "⢧",
413
- "⣠",
414
- "⣡",
415
- "⣢",
416
- "⣣",
417
- "⣤",
418
- "⣥",
419
- "⣦",
420
- "⣧",
421
- "⢨",
422
- "⢩",
423
- "⢪",
424
- "⢫",
425
- "⢬",
426
- "⢭",
427
- "⢮",
428
- "⢯",
429
- "⣨",
430
- "⣩",
431
- "⣪",
432
- "⣫",
433
- "⣬",
434
- "⣭",
435
- "⣮",
436
- "⣯",
437
- "⢰",
438
- "⢱",
439
- "⢲",
440
- "⢳",
441
- "⢴",
442
- "⢵",
443
- "⢶",
444
- "⢷",
445
- "⣰",
446
- "⣱",
447
- "⣲",
448
- "⣳",
449
- "⣴",
450
- "⣵",
451
- "⣶",
452
- "⣷",
453
- "⢸",
454
- "⢹",
455
- "⢺",
456
- "⢻",
457
- "⢼",
458
- "⢽",
459
- "⢾",
460
- "⢿",
461
- "⣸",
462
- "⣹",
463
- "⣺",
464
- "⣻",
465
- "⣼",
466
- "⣽",
467
- "⣾",
468
- "⣿",
469
- ],
470
- },
471
- dotsCircle: { interval: 80, frames: ["⢎ ", "⠎⠁", "⠊⠑", "⠈⠱", " ⡱", "⢀⡰", "⢄⡠", "⢆⡀"] },
472
- sand: {
473
- interval: 80,
474
- frames: [
475
- "⠁",
476
- "⠂",
477
- "⠄",
478
- "⡀",
479
- "⡈",
480
- "⡐",
481
- "⡠",
482
- "⣀",
483
- "⣁",
484
- "⣂",
485
- "⣄",
486
- "⣌",
487
- "⣔",
488
- "⣤",
489
- "⣥",
490
- "⣦",
491
- "⣮",
492
- "⣶",
493
- "⣷",
494
- "⣿",
495
- "⡿",
496
- "⠿",
497
- "⢟",
498
- "⠟",
499
- "⡛",
500
- "⠛",
501
- "⠫",
502
- "⢋",
503
- "⠋",
504
- "⠍",
505
- "⡉",
506
- "⠉",
507
- "⠑",
508
- "⠡",
509
- "⢁",
510
- ],
511
- },
512
- line: { interval: 130, frames: ["-", "\\", "|", "/"] },
513
- line2: { interval: 100, frames: ["⠂", "-", "–", "—", "–", "-"] },
514
- rollingLine: { interval: 80, frames: ["/ ", " - ", " \\ ", " |", " |", " \\ ", " - ", "/ "] },
515
- pipe: { interval: 100, frames: ["┤", "┘", "┴", "└", "├", "┌", "┬", "┐"] },
516
- simpleDots: { interval: 400, frames: [". ", ".. ", "...", " "] },
517
- simpleDotsScrolling: { interval: 200, frames: [". ", ".. ", "...", " ..", " .", " "] },
518
- star: { interval: 70, frames: ["✶", "✸", "✹", "✺", "✹", "✷"] },
519
- star2: { interval: 80, frames: ["+", "x", "*"] },
520
- flip: { interval: 70, frames: ["_", "_", "_", "-", "`", "`", "'", "´", "-", "_", "_", "_"] },
521
- hamburger: { interval: 100, frames: ["☱", "☲", "☴"] },
522
- growVertical: { interval: 120, frames: ["▁", "▃", "▄", "▅", "▆", "▇", "▆", "▅", "▄", "▃"] },
523
- growHorizontal: {
524
- interval: 120,
525
- frames: ["▏", "▎", "▍", "▌", "▋", "▊", "▉", "▊", "▋", "▌", "▍", "▎"],
526
- },
527
- balloon: { interval: 140, frames: [" ", ".", "o", "O", "@", "*", " "] },
528
- balloon2: { interval: 120, frames: [".", "o", "O", "°", "O", "o", "."] },
529
- noise: { interval: 100, frames: ["▓", "▒", "░"] },
530
- bounce: { interval: 120, frames: ["⠁", "⠂", "⠄", "⠂"] },
531
- boxBounce: { interval: 120, frames: ["▖", "▘", "▝", "▗"] },
532
- boxBounce2: { interval: 100, frames: ["▌", "▀", "▐", "▄"] },
533
- triangle: { interval: 50, frames: ["◢", "◣", "◤", "◥"] },
534
- arc: { interval: 100, frames: ["◜", "◠", "◝", "◞", "◡", "◟"] },
535
- circle: { interval: 120, frames: ["◡", "⊙", "◠"] },
536
- squareCorners: { interval: 180, frames: ["◰", "◳", "◲", "◱"] },
537
- circleQuarters: { interval: 120, frames: ["◴", "◷", "◶", "◵"] },
538
- circleHalves: { interval: 50, frames: ["◐", "◓", "◑", "◒"] },
539
- squish: { interval: 100, frames: ["╫", "╪"] },
540
- toggle: { interval: 250, frames: ["⊶", "⊷"] },
541
- toggle2: { interval: 80, frames: ["▫", "▪"] },
542
- toggle3: { interval: 120, frames: ["□", "■"] },
543
- toggle4: { interval: 100, frames: ["■", "□", "▪", "▫"] },
544
- toggle5: { interval: 100, frames: ["▮", "▯"] },
545
- toggle8: { interval: 100, frames: ["◍", "◌"] },
546
- toggle9: { interval: 100, frames: ["◉", "◎"] },
547
- toggle12: { interval: 120, frames: ["☗", "☖"] },
548
- toggle13: { interval: 80, frames: ["=", "*", "-"] },
549
- arrow: { interval: 100, frames: ["←", "↖", "↑", "↗", "→", "↘", "↓", "↙"] },
550
- dqpb: { interval: 100, frames: ["d", "q", "p", "b"] },
551
- point: { interval: 125, frames: ["∙∙∙", "●∙∙", "∙●∙", "∙∙●", "∙∙∙"] },
552
- layer: { interval: 150, frames: ["-", "=", "≡"] },
553
- centipede: {
554
- interval: 180,
555
- frames: [
556
- "🍕😊😊😊😊😊 ",
557
- "🍕😊😊😊😊😊 ",
558
- "🍕😊😊😊😊😊 ",
559
- " 😊😊😊😊😊 ",
560
- " 😐😊😊😊😊 ",
561
- " 😣😐😊😊😊 ",
562
- " 😣😣😐😊😊 ",
563
- " 😣😣😣😐😊 ",
564
- " 😣😣😣😣😐 ",
565
- " 😣😣😣😣😣 ",
566
- " 😣😣😣😣😣💩",
567
- " 😣😣😣😣😣💩",
568
- " 😣😣😣😣😣💩",
569
- ],
570
- },
571
- };
572
- /* eslint-enable @stylistic/max-len */
573
-
574
- const SPINNER_NAMES = Object.keys(SPINNERS);
575
-
576
- // ─── Helpers ─────────────────────────────────────────────────────────────────
577
-
578
- /**
579
- * Pick a random spinner preset.
580
- * @returns Spinner definition with frames and interval
581
- */
582
- function pickRandom(): SpinnerPreset {
583
- return SPINNERS[SPINNER_NAMES[Math.floor(Math.random() * SPINNER_NAMES.length)]];
584
- }
585
-
586
- /**
587
- * Resolve a spinner by name.
588
- * @param name - Preset name (e.g. "dots", "arc") or "random"
589
- * @returns Spinner preset, or undefined if name not found
590
- */
591
- function resolve(name: string): SpinnerPreset | undefined {
592
- if (name === "random") return pickRandom();
593
- return SPINNERS[name];
594
- }
595
-
596
- /**
597
- * Read spinner settings from ~/.tallow/settings.json.
598
- * @returns Parsed spinner settings with defaults
599
- */
600
- function readSettings(): SpinnerSettings {
601
- const settingsPath = getTallowSettingsPath();
602
- try {
603
- const raw = fs.readFileSync(settingsPath, "utf-8");
604
- return JSON.parse(raw) as SpinnerSettings;
605
- } catch {
606
- return {};
607
- }
608
- }
609
-
610
- // ─── Extension Entry ─────────────────────────────────────────────────────────
611
12
 
612
- /**
613
- * Random spinner extension.
614
- * Reads spinner settings on session_start, bridges into Loader defaults.
615
- *
616
- * @param pi - Extension API
617
- */
618
13
  export default function randomSpinnerExtension(pi: ExtensionAPI): void {
619
- pi.on("session_start", async () => {
620
- const settings = readSettings();
621
- const spinnerSetting = settings.spinner ?? "random";
622
- const isRandom = spinnerSetting === "random";
623
-
624
- // ── Spinner frames ──
625
- if (isRandom) {
626
- let cached: SpinnerPreset | undefined;
627
- const roll = (): SpinnerPreset => {
628
- if (!cached) cached = pickRandom();
629
- return cached;
630
- };
631
- Object.defineProperty(Loader, "defaultFrames", {
632
- get: () => {
633
- cached = undefined;
634
- return roll().frames;
635
- },
636
- configurable: true,
637
- });
638
- Object.defineProperty(Loader, "defaultIntervalMs", {
639
- get: () => roll().interval,
640
- configurable: true,
641
- });
642
- } else {
643
- const preset = resolve(spinnerSetting);
644
- if (preset) {
645
- Loader.defaultFrames = preset.frames;
646
- Loader.defaultIntervalMs = preset.interval;
647
- }
648
- }
649
- });
14
+ pi.on("session_start", async () => {});
650
15
  }
@@ -28,20 +28,18 @@ import {
28
28
  loadSkills,
29
29
  parseFrontmatter,
30
30
  } from "@mariozechner/pi-coding-agent";
31
+ import { getImageDimensions, Text, visibleWidth } from "@mariozechner/pi-tui";
32
+ import { Type } from "@sinclair/typebox";
33
+ import { getIcon } from "../_icons/index.js";
34
+ import type { ImageMetadata } from "../_shared/image-metadata.js";
31
35
  import {
32
36
  createImageMetadata,
33
37
  detectImageFormat,
34
- fileLink,
35
38
  formatImageDimensions,
36
- getImageDimensions,
37
- type ImageMetadata,
38
39
  imageFormatToMime,
39
- Text,
40
- visibleWidth,
41
- } from "@mariozechner/pi-tui";
42
- import { Type } from "@sinclair/typebox";
43
- import { getIcon } from "../_icons/index.js";
44
- import { getTallowSettingsPath } from "../_shared/tallow-paths.js";
40
+ } from "../_shared/image-metadata.js";
41
+ import { getTallowHomeDir, getTallowSettingsPath } from "../_shared/tallow-paths.js";
42
+ import { fileLink } from "../_shared/terminal-links.js";
45
43
  import {
46
44
  appendSection,
47
45
  dimProcessOutputLine,
@@ -153,7 +151,12 @@ function getSkillPathMap(): Map<string, SkillCacheEntry> {
153
151
  if (!skillPathMap) {
154
152
  skillPathMap = new Map();
155
153
  try {
156
- const { skills } = loadSkills({ skillPaths: getPackageSkillPaths() });
154
+ const { skills } = loadSkills({
155
+ cwd: process.cwd(),
156
+ agentDir: getTallowHomeDir(),
157
+ skillPaths: getPackageSkillPaths(),
158
+ includeDefaults: false,
159
+ });
157
160
  for (const s of skills) {
158
161
  skillPathMap.set(s.name, {
159
162
  path: s.filePath,