plugin-gentleman 1.1.2 → 1.1.4

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/README.md CHANGED
@@ -98,7 +98,7 @@ The ASCII representation features:
98
98
  - **Eyes** that blink and look in 8 directions (center, up, down, left, right, and 4 diagonals) *(sidebar only)*
99
99
  - **Mustache** rendered in grayscale gradient on home screen, semantic zone colors in sidebar
100
100
  - **Tongue** that appears during busy states or periodic expressive cycles *(sidebar only)*
101
- - **Motivational phrases** in Rioplatense Spanish style — single random phrase rotating every 3s *(sidebar only)*
101
+ - **Motivational phrases** in Rioplatense Spanish style — one random phrase per expressive cycle *(sidebar only)*
102
102
 
103
103
  **Example phrases during busy states:**
104
104
  - *"Ponete las pilas, hermano..."*
@@ -126,7 +126,7 @@ The ASCII representation features:
126
126
  **Busy/Expressive State** *(when `animations: true`)*
127
127
  - Tongue appears when OpenCode is processing
128
128
  - Eyes squint during expressive state
129
- - Single motivational phrase rotating every 3 seconds (36+ phrase library)
129
+ - A single motivational phrase is chosen for each expressive cycle or busy state (36+ phrase library)
130
130
  - Active during detected busy states OR periodic expressive cycles
131
131
 
132
132
  **Expressive Cycle Fallback** *(when `animations: true`)*
@@ -407,7 +407,7 @@ All animation intervals are in `components.tsx`:
407
407
  - **Look-around interval:** Currently 3000ms (3s)
408
408
  - **Blink interval:** Currently 2000ms with 35% chance (~5-6s average)
409
409
  - **Blink frame timing:** Currently 80-100ms per frame progression
410
- - **Phrase rotation:** Currently 3000ms (3s) during expressive state
410
+ - **Phrase selection:** One random phrase per expressive cycle or busy state
411
411
  - **Expressive cycle timing:** First cycle at 30-45s, then every 45-60s
412
412
  - **Expressive cycle duration:** Currently 8000ms (8s)
413
413
 
package/ascii-frames.ts CHANGED
@@ -48,7 +48,7 @@ export const eyeNeutralRight = [
48
48
 
49
49
  export const eyeNeutralUpLeft = [
50
50
  " █████ █████ ", // 27 chars
51
- " ██ ░░██ ██░░░░░██ ", // 27 chars - hollow pupil up-left
51
+ " ██ ░░██ ███░░░░██ ", // 27 chars - hollow pupil up-left
52
52
  " ██ ░░░░██ ██░░░░░░░██ ", // 27 chars - hollow pupil up-left
53
53
  " ██░░░░░░░██ ██░░░░░░░██ ", // 27 chars
54
54
  "██ ██░░░░░██ ██░░░░░██ ██", // 27 chars
@@ -56,7 +56,7 @@ export const eyeNeutralUpLeft = [
56
56
 
57
57
  export const eyeNeutralUpRight = [
58
58
  " ██████ █████ ", // 27 chars
59
- " ██░░░ ██ ██░░░░░██ ", // 27 chars - hollow pupil up-right
59
+ " ██░░░ ██ ███░░░░██ ", // 27 chars - hollow pupil up-right
60
60
  " ██░░░░ ██ ██░░░░░░░██ ", // 27 chars - hollow pupil up-right
61
61
  " ██░░░░░░░██ ██░░░░░░░██ ", // 27 chars
62
62
  "██ ██░░░░░██ ██░░░░░██ ██", // 27 chars
package/components.tsx CHANGED
@@ -74,7 +74,7 @@ export const SidebarMustachi = (props: { theme: TuiThemeCurrent; config: Cfg; is
74
74
  const randomDir = 1 + Math.floor(Math.random() * (pupilPositionFrames.length - 1))
75
75
  setPupilIndex(randomDir)
76
76
  }
77
- }, 800) // TEST MODE: faster for demo (was 3000)
77
+ }, 3000) // Natural cadence: check every 3s for eye movement
78
78
 
79
79
  onCleanup(() => clearInterval(interval))
80
80
  })
@@ -97,13 +97,12 @@ export const SidebarMustachi = (props: { theme: TuiThemeCurrent; config: Cfg; is
97
97
  }
98
98
 
99
99
  const interval = setInterval(() => {
100
- // Blink more frequently to feel alive (~every 5-6 seconds)
100
+ // Natural blink frequency (~every 5-6 seconds)
101
101
  // 35% chance every 2s = average 5.7s between blinks
102
- // TEST MODE: 60% chance every 800ms = blink ~every 1.3s for demo
103
- if (Math.random() < 0.6) {
102
+ if (Math.random() < 0.35) {
104
103
  blinkSequence()
105
104
  }
106
- }, 800) // TEST MODE: faster for demo (was 2000)
105
+ }, 2000) // Natural cadence: check every 2s for blink
107
106
 
108
107
  onCleanup(() => clearInterval(interval))
109
108
  })
@@ -137,7 +136,7 @@ export const SidebarMustachi = (props: { theme: TuiThemeCurrent; config: Cfg; is
137
136
  }
138
137
  tongueTimeoutId = setTimeout(growTongue, 200)
139
138
 
140
- // Pick a random phrase and rotate through the library
139
+ // Pick a single random phrase for this expressive cycle/state
141
140
  const pickRandomPhrase = () => {
142
141
  const randomIndex = Math.floor(Math.random() * busyPhrases.length)
143
142
  return busyPhrases[randomIndex]
@@ -145,12 +144,7 @@ export const SidebarMustachi = (props: { theme: TuiThemeCurrent; config: Cfg; is
145
144
 
146
145
  setBusyPhrase(pickRandomPhrase())
147
146
 
148
- const interval = setInterval(() => {
149
- setBusyPhrase(pickRandomPhrase())
150
- }, 3000)
151
-
152
147
  onCleanup(() => {
153
- clearInterval(interval)
154
148
  if (tongueTimeoutId !== undefined) {
155
149
  clearTimeout(tongueTimeoutId)
156
150
  }
@@ -173,14 +167,13 @@ export const SidebarMustachi = (props: { theme: TuiThemeCurrent; config: Cfg; is
173
167
  }, 8000)
174
168
  }
175
169
 
176
- // TEST MODE: First cycle after 5-8s, then every 12-15s for demo
177
- // (Production: first after 30-45s, then every 45-60s)
178
- const firstDelay = 5000 + Math.random() * 3000
170
+ // First cycle after 30-45s, then every 45-60s (calm, occasional expressiveness)
171
+ const firstDelay = 30000 + Math.random() * 15000
179
172
  const firstTimeout = setTimeout(triggerExpressiveCycle, firstDelay)
180
173
 
181
174
  const interval = setInterval(() => {
182
175
  triggerExpressiveCycle()
183
- }, 12000 + Math.random() * 3000)
176
+ }, 45000 + Math.random() * 15000)
184
177
 
185
178
  onCleanup(() => {
186
179
  clearTimeout(firstTimeout)
@@ -244,7 +237,7 @@ export const SidebarMustachi = (props: { theme: TuiThemeCurrent; config: Cfg; is
244
237
  return <text fg={color}>{paddedLine}</text>
245
238
  })}
246
239
 
247
- {/* Display single busy phrase if loading */}
240
+ {/* Display a single busy phrase for the current expressive cycle */}
248
241
  {busyPhrase() && (
249
242
  <text fg={props.theme.warning}>{busyPhrase()}</text>
250
243
  )}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "plugin-gentleman",
4
- "version": "1.1.2",
4
+ "version": "1.1.4",
5
5
  "description": "OpenCode TUI plugin featuring Mustachi - an animated ASCII mascot with eyes, mustache, and optional motivational phrases during busy states",
6
6
  "type": "module",
7
7
  "exports": {