dino-spec 13.5.0 → 13.6.1

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 (99) hide show
  1. package/README.md +2 -47
  2. package/bin/dino-hud.js +0 -0
  3. package/bin/dino.js +0 -0
  4. package/dist/commands/hud.d.ts +8 -1
  5. package/dist/commands/hud.d.ts.map +1 -1
  6. package/dist/commands/hud.js +18 -4
  7. package/dist/commands/hud.js.map +1 -1
  8. package/dist/core/config/feature-flags.d.ts +0 -15
  9. package/dist/core/config/feature-flags.d.ts.map +1 -1
  10. package/dist/core/config/feature-flags.js +0 -3
  11. package/dist/core/config/feature-flags.js.map +1 -1
  12. package/dist/core/context/context-health.d.ts +2 -27
  13. package/dist/core/context/context-health.d.ts.map +1 -1
  14. package/dist/core/context/context-health.js +12 -98
  15. package/dist/core/context/context-health.js.map +1 -1
  16. package/dist/core/context/index.d.ts +2 -3
  17. package/dist/core/context/index.d.ts.map +1 -1
  18. package/dist/core/context/index.js +2 -18
  19. package/dist/core/context/index.js.map +1 -1
  20. package/dist/core/context/lazy-loader.d.ts +1 -44
  21. package/dist/core/context/lazy-loader.d.ts.map +1 -1
  22. package/dist/core/context/lazy-loader.js +1 -59
  23. package/dist/core/context/lazy-loader.js.map +1 -1
  24. package/dist/core/generator/claude-md.js +1 -1
  25. package/dist/core/provider/storage.d.ts.map +1 -1
  26. package/dist/core/provider/storage.js +2 -1
  27. package/dist/core/provider/storage.js.map +1 -1
  28. package/dist/hooks/post-edit.js +0 -73
  29. package/dist/hooks/post-edit.js.map +1 -1
  30. package/dist/hooks/session-start.js +0 -115
  31. package/dist/hooks/session-start.js.map +1 -1
  32. package/dist/hooks/types.js +1 -1
  33. package/dist/hooks/user-prompt-submit.js +0 -100
  34. package/dist/hooks/user-prompt-submit.js.map +1 -1
  35. package/dist/hud/config-tui.d.ts +25 -0
  36. package/dist/hud/config-tui.d.ts.map +1 -0
  37. package/dist/hud/config-tui.js +199 -0
  38. package/dist/hud/config-tui.js.map +1 -0
  39. package/dist/hud/config.d.ts +28 -3
  40. package/dist/hud/config.d.ts.map +1 -1
  41. package/dist/hud/config.js +60 -8
  42. package/dist/hud/config.js.map +1 -1
  43. package/dist/hud/index.d.ts.map +1 -1
  44. package/dist/hud/index.js +1 -0
  45. package/dist/hud/index.js.map +1 -1
  46. package/dist/hud/models.d.ts +58 -0
  47. package/dist/hud/models.d.ts.map +1 -0
  48. package/dist/hud/models.js +124 -0
  49. package/dist/hud/models.js.map +1 -0
  50. package/dist/hud/render/budget-bar.d.ts +2 -0
  51. package/dist/hud/render/budget-bar.d.ts.map +1 -1
  52. package/dist/hud/render/budget-bar.js +8 -5
  53. package/dist/hud/render/budget-bar.js.map +1 -1
  54. package/dist/hud/stdin.d.ts +3 -0
  55. package/dist/hud/stdin.d.ts.map +1 -1
  56. package/dist/hud/stdin.js +29 -2
  57. package/dist/hud/stdin.js.map +1 -1
  58. package/dist/hud/token-estimator.d.ts +79 -0
  59. package/dist/hud/token-estimator.d.ts.map +1 -0
  60. package/dist/hud/token-estimator.js +126 -0
  61. package/dist/hud/token-estimator.js.map +1 -0
  62. package/dist/hud/types.d.ts +2 -0
  63. package/dist/hud/types.d.ts.map +1 -1
  64. package/dist/mcp/server.d.ts +1 -2
  65. package/dist/mcp/server.d.ts.map +1 -1
  66. package/dist/mcp/server.js +3 -12
  67. package/dist/mcp/server.js.map +1 -1
  68. package/dist/mcp/tools/index.d.ts +2 -6
  69. package/dist/mcp/tools/index.d.ts.map +1 -1
  70. package/dist/mcp/tools/index.js +2 -17
  71. package/dist/mcp/tools/index.js.map +1 -1
  72. package/dist/mcp-server.d.ts.map +1 -1
  73. package/dist/mcp-server.js +5 -9
  74. package/dist/mcp-server.js.map +1 -1
  75. package/dist/rules/index.js +2 -2
  76. package/dist/utils/gitignore.d.ts.map +1 -1
  77. package/dist/utils/gitignore.js +0 -5
  78. package/dist/utils/gitignore.js.map +1 -1
  79. package/package.json +2 -1
  80. package/dist/core/context/focus-resource-loader.d.ts +0 -143
  81. package/dist/core/context/focus-resource-loader.d.ts.map +0 -1
  82. package/dist/core/context/focus-resource-loader.js +0 -305
  83. package/dist/core/context/focus-resource-loader.js.map +0 -1
  84. package/dist/mcp/focus-filter.d.ts +0 -74
  85. package/dist/mcp/focus-filter.d.ts.map +0 -1
  86. package/dist/mcp/focus-filter.js +0 -229
  87. package/dist/mcp/focus-filter.js.map +0 -1
  88. package/dist/mcp/tools/auto-inject.d.ts +0 -36
  89. package/dist/mcp/tools/auto-inject.d.ts.map +0 -1
  90. package/dist/mcp/tools/auto-inject.js +0 -143
  91. package/dist/mcp/tools/auto-inject.js.map +0 -1
  92. package/dist/mcp/tools/auto-unload.d.ts +0 -29
  93. package/dist/mcp/tools/auto-unload.d.ts.map +0 -1
  94. package/dist/mcp/tools/auto-unload.js +0 -151
  95. package/dist/mcp/tools/auto-unload.js.map +0 -1
  96. package/dist/mcp/tools/health.d.ts +0 -29
  97. package/dist/mcp/tools/health.d.ts.map +0 -1
  98. package/dist/mcp/tools/health.js +0 -171
  99. package/dist/mcp/tools/health.js.map +0 -1
@@ -154,71 +154,6 @@ if (Test-Path $budgetPath) {
154
154
  } catch {}
155
155
  }
156
156
 
157
- # v13.5.0: Context health check on session start
158
- $healthEnabled = $true
159
- if (Test-Path $configPath) {
160
- try {
161
- $config = Get-Content $configPath -Raw | ConvertFrom-Json
162
- if ($config.features.contextHealthMonitor -eq $false) {
163
- $healthEnabled = $false
164
- }
165
- } catch {}
166
- }
167
-
168
- if ($healthEnabled) {
169
- try {
170
- # Get budget percentage for health check
171
- $healthBudget = 50
172
- if (Test-Path $budgetPath) {
173
- try {
174
- $budgetData = Get-Content $budgetPath -Raw | ConvertFrom-Json
175
- $healthBudget = [math]::Round(($budgetData.estimated / $budgetData.limit) * 100)
176
- } catch {}
177
- }
178
-
179
- $healthResult = & npx dino mcp call dino_health_check --budgetPercentage $healthBudget 2>$null
180
- if ($healthResult -and $healthResult -match "Status:.*\\[(WARNING|CRITICAL)\\]") {
181
- # Extract rot index
182
- $rotMatch = [regex]::Match($healthResult, "Rot Index:\\s*(\\d+)%")
183
- if ($rotMatch.Success) {
184
- $rotIndex = $rotMatch.Groups[1].Value
185
- Write-Host "[dino] Context health: $($matches[1].ToLower()) (\$rotIndex% rot)"
186
- }
187
- }
188
- } catch {}
189
- }
190
-
191
- # v13.5.0: Auto-unload at budget thresholds (70%, 80%, 90%)
192
- $unloadEnabled = $true
193
- if (Test-Path $configPath) {
194
- try {
195
- $config = Get-Content $configPath -Raw | ConvertFrom-Json
196
- if ($config.features.autoUnload -eq $false) {
197
- $unloadEnabled = $false
198
- }
199
- } catch {}
200
- }
201
-
202
- if ($unloadEnabled -and $budgetPercent -ge 70) {
203
- try {
204
- # Determine aggressiveness based on budget level
205
- $aggressiveness = "light"
206
- if ($budgetPercent -ge 90) {
207
- $aggressiveness = "aggressive"
208
- } elseif ($budgetPercent -ge 80) {
209
- $aggressiveness = "medium"
210
- }
211
-
212
- $unloadResult = & npx dino mcp call dino_auto_unload --budgetPercentage $budgetPercent --aggressiveness $aggressiveness 2>$null
213
- if ($unloadResult -and $unloadResult -match "Tokens freed:\\s*~(\\d+)") {
214
- $tokensFreed = $matches[1]
215
- if ([int]$tokensFreed -gt 0) {
216
- Write-Host "[dino] Auto-unload: ~\$tokensFreed tokens freed (budget was \$budgetPercent%)"
217
- }
218
- }
219
- } catch {}
220
- }
221
-
222
157
  # v13.2.1: Clean up completed Ralph loops on session start (more reliable than SessionEnd)
223
158
  $ralphProgressPath = Join-Path $dinoDir "ralph-progress.md"
224
159
  if (Test-Path $ralphProgressPath) {
@@ -414,56 +349,6 @@ if [ -f "\$BUDGET_PATH" ]; then
414
349
  fi
415
350
  fi
416
351
 
417
- # v13.5.0: Context health check on session start
418
- HEALTH_ENABLED="true"
419
- CONFIG_PATH="\$DINO_DIR/config.json"
420
- if [ -f "\$CONFIG_PATH" ]; then
421
- if grep -q '"contextHealthMonitor"[[:space:]]*:[[:space:]]*false' "\$CONFIG_PATH" 2>/dev/null; then
422
- HEALTH_ENABLED="false"
423
- fi
424
- fi
425
-
426
- if [ "\$HEALTH_ENABLED" = "true" ]; then
427
- # Get budget percentage for health check
428
- HEALTH_BUDGET=50
429
- if [ -f "\$BUDGET_PATH" ]; then
430
- HEALTH_BUDGET=\$BUDGET_PERCENT
431
- fi
432
-
433
- HEALTH_RESULT=\$(npx dino mcp call dino_health_check --budgetPercentage "\$HEALTH_BUDGET" 2>/dev/null)
434
- if echo "\$HEALTH_RESULT" | grep -qE "Status:.*\\[(WARNING|CRITICAL)\\]"; then
435
- HEALTH_STATUS=\$(echo "\$HEALTH_RESULT" | grep -oE "\\[(WARNING|CRITICAL)\\]" | tr -d '[]' | tr '[:upper:]' '[:lower:]')
436
- ROT_INDEX=\$(echo "\$HEALTH_RESULT" | grep -oE "Rot Index:\\s*[0-9]+%" | grep -oE "[0-9]+")
437
- if [ -n "\$ROT_INDEX" ]; then
438
- echo "[dino] Context health: \$HEALTH_STATUS (\$ROT_INDEX% rot)"
439
- fi
440
- fi
441
- fi
442
-
443
- # v13.5.0: Auto-unload at budget thresholds (70%, 80%, 90%)
444
- UNLOAD_ENABLED="true"
445
- if [ -f "\$CONFIG_PATH" ]; then
446
- if grep -q '"autoUnload"[[:space:]]*:[[:space:]]*false' "\$CONFIG_PATH" 2>/dev/null; then
447
- UNLOAD_ENABLED="false"
448
- fi
449
- fi
450
-
451
- if [ "\$UNLOAD_ENABLED" = "true" ] && [ "\$BUDGET_PERCENT" -ge 70 ] 2>/dev/null; then
452
- # Determine aggressiveness based on budget level
453
- AGGRESSIVENESS="light"
454
- if [ "\$BUDGET_PERCENT" -ge 90 ]; then
455
- AGGRESSIVENESS="aggressive"
456
- elif [ "\$BUDGET_PERCENT" -ge 80 ]; then
457
- AGGRESSIVENESS="medium"
458
- fi
459
-
460
- UNLOAD_RESULT=\$(npx dino mcp call dino_auto_unload --budgetPercentage "\$BUDGET_PERCENT" --aggressiveness "\$AGGRESSIVENESS" 2>/dev/null)
461
- TOKENS_FREED=\$(echo "\$UNLOAD_RESULT" | grep -oE "Tokens freed:\\s*~[0-9]+" | grep -oE "[0-9]+")
462
- if [ -n "\$TOKENS_FREED" ] && [ "\$TOKENS_FREED" -gt 0 ]; then
463
- echo "[dino] Auto-unload: ~\$TOKENS_FREED tokens freed (budget was \$BUDGET_PERCENT%)"
464
- fi
465
- fi
466
-
467
352
  # v13.2.1: Clean up completed Ralph loops on session start (more reliable than SessionEnd)
468
353
  RALPH_PROGRESS_PATH="\$DINO_DIR/ralph-progress.md"
469
354
  if [ -f "\$RALPH_PROGRESS_PATH" ]; then
@@ -1 +1 @@
1
- {"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../src/hooks/session-start.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../src/hooks/session-start.ts"],"names":[],"mappings":"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"}
@@ -107,7 +107,7 @@ export const DOC_PATTERNS = [
107
107
  * Pending actions for different change types
108
108
  */
109
109
  export const PENDING_ACTIONS = {
110
- dependency: 'Run `bun install` (or equivalent) after dependency changes',
110
+ dependency: 'Run `npm install` (or equivalent) after dependency changes',
111
111
  structural: null,
112
112
  config: null,
113
113
  test: null,
@@ -137,58 +137,6 @@ if ($memoryQuery) {
137
137
  $suggestions += "@dino://memories/summary"
138
138
  }
139
139
 
140
- # v13.5.0: Auto-context injection based on prompt demand signals
141
- $autoInjectConfigPath = Join-Path $dinoDir "config.json"
142
- $autoInjectEnabled = $true
143
- if (Test-Path $autoInjectConfigPath) {
144
- try {
145
- $config = Get-Content $autoInjectConfigPath -Raw | ConvertFrom-Json
146
- if ($config.features.PSObject.Properties['autoContextInjection']) {
147
- $autoInjectEnabled = $config.features.autoContextInjection
148
- }
149
- } catch {}
150
- }
151
-
152
- if ($autoInjectEnabled) {
153
- # Check for demand signals in prompt (questions about past decisions, patterns, failures)
154
- $hasDemand = $false
155
- if ($promptLower -match "\\b(what|why|how)\\b.*\\b(decide|chose|previous|before|earlier|did we)\\b") {
156
- $hasDemand = $true
157
- }
158
- if ($promptLower -match "\\b(usually|normally|pattern|convention|prefer)\\b") {
159
- $hasDemand = $true
160
- }
161
- if ($promptLower -match "\\b(fail|broke|error|issue)\\b.*\\b(earlier|before|last time)\\b") {
162
- $hasDemand = $true
163
- }
164
-
165
- if ($hasDemand) {
166
- try {
167
- # Get current budget percentage (approximate)
168
- $budgetPercent = 50
169
- $sessionState = Join-Path $dinoDir "session.md"
170
- if (Test-Path $sessionState) {
171
- $sessionContent = Get-Content $sessionState -Raw
172
- if ($sessionContent -match "Budget.*?(\d+)%") {
173
- $budgetPercent = [int]$matches[1]
174
- }
175
- }
176
-
177
- # Only inject if budget has headroom
178
- if ($budgetPercent -lt 90) {
179
- $injectResult = & npx dino mcp call dino_auto_inject --prompt "$userPrompt" --budgetPercentage $budgetPercent 2>$null
180
- if ($injectResult -and $injectResult -match "executed.*true") {
181
- # Extract tokens injected
182
- if ($injectResult -match "~(\d+) tokens") {
183
- $tokensInjected = $matches[1]
184
- $contextInjections += "Auto-injected ~$tokensInjected tokens of relevant context"
185
- }
186
- }
187
- }
188
- } catch {}
189
- }
190
- }
191
-
192
140
  # Only check session state if we have alerts to give
193
141
  if (Test-Path $sessionPath) {
194
142
  $content = Get-Content $sessionPath -Raw
@@ -646,54 +594,6 @@ if [ -n "\$MEMORY_QUERY" ]; then
646
594
  SUGGESTIONS="\${SUGGESTIONS}@dino://memories/summary"
647
595
  fi
648
596
 
649
- # v13.5.0: Auto-context injection based on prompt demand signals
650
- AUTO_INJECT_ENABLED="true"
651
- CONFIG_PATH="\$DINO_DIR/config.json"
652
- if [ -f "\$CONFIG_PATH" ]; then
653
- if grep -q '"autoContextInjection"[[:space:]]*:[[:space:]]*false' "\$CONFIG_PATH" 2>/dev/null; then
654
- AUTO_INJECT_ENABLED="false"
655
- fi
656
- fi
657
-
658
- if [ "\$AUTO_INJECT_ENABLED" = "true" ]; then
659
- # Check for demand signals in prompt
660
- HAS_DEMAND="false"
661
- if echo "\$PROMPT_LOWER" | grep -qE "(what|why|how).*(decide|chose|previous|before|earlier|did we)"; then
662
- HAS_DEMAND="true"
663
- fi
664
- if echo "\$PROMPT_LOWER" | grep -qE "(usually|normally|pattern|convention|prefer)"; then
665
- HAS_DEMAND="true"
666
- fi
667
- if echo "\$PROMPT_LOWER" | grep -qE "(fail|broke|error|issue).*(earlier|before|last time)"; then
668
- HAS_DEMAND="true"
669
- fi
670
-
671
- if [ "\$HAS_DEMAND" = "true" ]; then
672
- # Get current budget percentage (approximate)
673
- BUDGET_PERCENT=50
674
- if [ -f "\$SESSION_PATH" ]; then
675
- BUDGET_MATCH=\$(grep -oE "Budget.*[0-9]+%" "\$SESSION_PATH" 2>/dev/null | grep -oE "[0-9]+" | head -1)
676
- if [ -n "\$BUDGET_MATCH" ]; then
677
- BUDGET_PERCENT="\$BUDGET_MATCH"
678
- fi
679
- fi
680
-
681
- # Only inject if budget has headroom
682
- if [ "\$BUDGET_PERCENT" -lt 90 ]; then
683
- INJECT_RESULT=\$(npx dino mcp call dino_auto_inject --prompt "\$USER_PROMPT" --budgetPercentage "\$BUDGET_PERCENT" 2>/dev/null)
684
- if echo "\$INJECT_RESULT" | grep -q "executed.*true"; then
685
- TOKENS_MATCH=\$(echo "\$INJECT_RESULT" | grep -oE "~[0-9]+ tokens" | grep -oE "[0-9]+")
686
- if [ -n "\$TOKENS_MATCH" ]; then
687
- if [ -n "\$CONTEXT_INJECTIONS" ]; then
688
- CONTEXT_INJECTIONS="\$CONTEXT_INJECTIONS; "
689
- fi
690
- CONTEXT_INJECTIONS="\${CONTEXT_INJECTIONS}Auto-injected ~\$TOKENS_MATCH tokens of relevant context"
691
- fi
692
- fi
693
- fi
694
- fi
695
- fi
696
-
697
597
  # Only check session state if we have alerts to give
698
598
  if [ -f "\$SESSION_PATH" ]; then
699
599
  CONTENT=\$(cat "\$SESSION_PATH")
@@ -1 +1 @@
1
- {"version":3,"file":"user-prompt-submit.js","sourceRoot":"","sources":["../../src/hooks/user-prompt-submit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAuB,MAAM,mBAAmB,CAAC;AAEzF;;GAEG;AACH,MAAM,UAAU,8BAA8B,CAAC,OAA+B;IAC5E,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,wBAAwB,EAAE,CAAC;IACpC,CAAC;IACD,OAAO,kBAAkB,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,wBAAwB;IAC/B,MAAM,QAAQ,GAAG,OAAgB,CAAC;IAElC,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,yBAAyB,CAAC;;;;;;;;;;EAU1E,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;EAC1B,KAAK,CAAC,kBAAkB,CAAC,QAAQ,CAAC;;;;;;;;EAQlC,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC;;;EAG9B,iBAAiB,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAud5B,CAAC;AACF,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,QAAQ,GAAG,OAAgB,CAAC;IAElC,uFAAuF;IACvF,OAAO;uCAC8B,OAAO;;;;;;;;;;;EAW5C,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;EAC1B,KAAK,CAAC,kBAAkB,CAAC,QAAQ,CAAC;;;;;;;EAOlC,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC;;;EAG9B,iBAAiB,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkb5B,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"user-prompt-submit.js","sourceRoot":"","sources":["../../src/hooks/user-prompt-submit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAuB,MAAM,mBAAmB,CAAC;AAEzF;;GAEG;AACH,MAAM,UAAU,8BAA8B,CAAC,OAA+B;IAC5E,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,wBAAwB,EAAE,CAAC;IACpC,CAAC;IACD,OAAO,kBAAkB,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,wBAAwB;IAC/B,MAAM,QAAQ,GAAG,OAAgB,CAAC;IAElC,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,yBAAyB,CAAC;;;;;;;;;;EAU1E,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;EAC1B,KAAK,CAAC,kBAAkB,CAAC,QAAQ,CAAC;;;;;;;;EAQlC,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC;;;EAG9B,iBAAiB,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAma5B,CAAC;AACF,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,QAAQ,GAAG,OAAgB,CAAC;IAElC,uFAAuF;IACvF,OAAO;uCAC8B,OAAO;;;;;;;;;;;EAW5C,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;EAC1B,KAAK,CAAC,kBAAkB,CAAC,QAAQ,CAAC;;;;;;;EAOlC,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC;;;EAG9B,iBAAiB,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkY5B,CAAC;AACF,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * HUD Config TUI - Interactive configuration wizard
3
+ *
4
+ * Provides an interactive terminal UI for configuring HUD display options.
5
+ * Uses @inquirer/prompts for cross-platform TUI support.
6
+ *
7
+ * @module config-tui
8
+ */
9
+ import type { HudDisplayConfig } from './types.js';
10
+ /**
11
+ * Run the interactive TUI configuration
12
+ *
13
+ * @param projectDir - Project directory (defaults to cwd)
14
+ * @returns true if configuration was saved
15
+ */
16
+ export declare function runConfigTui(projectDir?: string): Promise<boolean>;
17
+ /**
18
+ * Get count of enabled display options
19
+ */
20
+ export declare function getEnabledCount(display: HudDisplayConfig): number;
21
+ /**
22
+ * Get total count of display options
23
+ */
24
+ export declare function getTotalDisplayOptions(): number;
25
+ //# sourceMappingURL=config-tui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-tui.d.ts","sourceRoot":"","sources":["../../src/hud/config-tui.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAYH,OAAO,KAAK,EAAa,gBAAgB,EAAE,MAAM,YAAY,CAAC;AA8E9D;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,UAAU,GAAE,MAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,CA0HvF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAEjE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C"}
@@ -0,0 +1,199 @@
1
+ /**
2
+ * HUD Config TUI - Interactive configuration wizard
3
+ *
4
+ * Provides an interactive terminal UI for configuring HUD display options.
5
+ * Uses @inquirer/prompts for cross-platform TUI support.
6
+ *
7
+ * @module config-tui
8
+ */
9
+ import chalk from 'chalk';
10
+ import { checkbox, confirm, select } from '@inquirer/prompts';
11
+ import { loadHudConfig, saveHudConfig, saveUserConfig, DEFAULT_CONFIG, getHudConfigPath, getUserConfigPath, } from './config.js';
12
+ /**
13
+ * Organized display options by category
14
+ */
15
+ const DISPLAY_GROUPS = [
16
+ {
17
+ name: 'Context Info',
18
+ options: [
19
+ { key: 'model', label: 'Model', description: 'Show model name (e.g., Opus 4.5)' },
20
+ { key: 'budget', label: 'Budget', description: 'Show context usage percentage with bar' },
21
+ { key: 'contextHealth', label: 'Context Health', description: 'Show health-based coloring (deprecated)' },
22
+ ],
23
+ },
24
+ {
25
+ name: 'Session Info',
26
+ options: [
27
+ { key: 'sessionDuration', label: 'Session Duration', description: 'Show time since session start' },
28
+ { key: 'sessionLimit', label: 'Session Limit', description: 'Show 5-hour rate limit tracking' },
29
+ { key: 'weeklyUsage', label: 'Weekly Usage', description: 'Show weekly rate limit tracking' },
30
+ { key: 'gitBranch', label: 'Git Branch', description: 'Show current git branch' },
31
+ ],
32
+ },
33
+ {
34
+ name: 'Tools & Agents',
35
+ options: [
36
+ { key: 'toolUsage', label: 'Tool Usage', description: 'Show tool call counts' },
37
+ { key: 'agentStatus', label: 'Agent Status', description: 'Show subagent activity' },
38
+ { key: 'todoProgress', label: 'Todo Progress', description: 'Show todo completion status' },
39
+ { key: 'mcpStatus', label: 'MCP Status', description: 'Show MCP server connection' },
40
+ ],
41
+ },
42
+ {
43
+ name: 'Dino Features',
44
+ options: [
45
+ { key: 'configCounts', label: 'Config Counts', description: 'Show CLAUDE.md, rules, hooks counts' },
46
+ { key: 'cacheStats', label: 'Cache Stats', description: 'Show file cache hit rate' },
47
+ { key: 'deferredStatus', label: 'Deferred Status', description: 'Show lazy loading status' },
48
+ { key: 'circuitStatus', label: 'Circuit Status', description: 'Show circuit breaker health' },
49
+ ],
50
+ },
51
+ {
52
+ name: 'Legacy (Session.md)',
53
+ options: [
54
+ { key: 'phase', label: 'Phase', description: 'Show current workflow phase' },
55
+ { key: 'focus', label: 'Focus', description: 'Show current focus area' },
56
+ { key: 'testStatus', label: 'Test Status', description: 'Show test pass/fail status' },
57
+ { key: 'buildStatus', label: 'Build Status', description: 'Show build status' },
58
+ { key: 'lintStatus', label: 'Lint Status', description: 'Show lint status' },
59
+ { key: 'blockers', label: 'Blockers', description: 'Show active blockers' },
60
+ ],
61
+ },
62
+ ];
63
+ /**
64
+ * Print the TUI header
65
+ */
66
+ function printHeader() {
67
+ console.log('');
68
+ console.log(chalk.cyan('┌─────────────────────────────────────────┐'));
69
+ console.log(chalk.cyan('│ ') + chalk.bold('dino-hud Configuration') + chalk.cyan(' │'));
70
+ console.log(chalk.cyan('│ ') + chalk.dim('Configure statusline display options') + chalk.cyan(' │'));
71
+ console.log(chalk.cyan('└─────────────────────────────────────────┘'));
72
+ console.log('');
73
+ }
74
+ /**
75
+ * Run the interactive TUI configuration
76
+ *
77
+ * @param projectDir - Project directory (defaults to cwd)
78
+ * @returns true if configuration was saved
79
+ */
80
+ export async function runConfigTui(projectDir = process.cwd()) {
81
+ // Check if terminal supports TUI
82
+ if (!process.stdout.isTTY) {
83
+ console.log(chalk.red('Error: Interactive configuration requires a terminal.'));
84
+ console.log(chalk.dim('Use --json flag to view config as JSON.'));
85
+ return false;
86
+ }
87
+ printHeader();
88
+ try {
89
+ // Load current config
90
+ const currentConfig = await loadHudConfig(projectDir);
91
+ // Build choices for each group
92
+ const allChoices = [];
93
+ for (const group of DISPLAY_GROUPS) {
94
+ // Add group separator
95
+ allChoices.push({
96
+ name: chalk.cyan.bold(`── ${group.name} ──`),
97
+ value: group.options[0].key, // Dummy value
98
+ checked: false,
99
+ disabled: true,
100
+ });
101
+ for (const option of group.options) {
102
+ allChoices.push({
103
+ name: `${option.label}${option.description ? chalk.dim(` - ${option.description}`) : ''}`,
104
+ value: option.key,
105
+ checked: currentConfig.display[option.key] ?? false,
106
+ });
107
+ }
108
+ }
109
+ // Show checkbox selection
110
+ const selected = await checkbox({
111
+ message: 'Select display options (Space to toggle, Enter to confirm)',
112
+ choices: allChoices.filter(c => !c.disabled),
113
+ pageSize: 15,
114
+ });
115
+ // Build new display config
116
+ const newDisplay = {};
117
+ for (const group of DISPLAY_GROUPS) {
118
+ for (const option of group.options) {
119
+ newDisplay[option.key] = selected.includes(option.key);
120
+ }
121
+ }
122
+ // Check if reset to defaults is desired
123
+ const resetPrompt = await confirm({
124
+ message: 'Reset all other settings to defaults?',
125
+ default: false,
126
+ });
127
+ // Build final config
128
+ let finalConfig;
129
+ if (resetPrompt) {
130
+ finalConfig = {
131
+ ...DEFAULT_CONFIG,
132
+ display: newDisplay,
133
+ };
134
+ }
135
+ else {
136
+ finalConfig = {
137
+ ...currentConfig,
138
+ display: newDisplay,
139
+ };
140
+ }
141
+ // Ask where to save
142
+ const saveLocation = await select({
143
+ message: 'Save configuration to:',
144
+ choices: [
145
+ {
146
+ name: `Project (${chalk.dim('.dino/hud.json')})`,
147
+ value: 'project',
148
+ description: 'Only affects this project',
149
+ },
150
+ {
151
+ name: `Global (${chalk.dim('~/.config/dino/hud.json')})`,
152
+ value: 'global',
153
+ description: 'Default for all projects',
154
+ },
155
+ {
156
+ name: chalk.dim('Cancel'),
157
+ value: 'cancel',
158
+ },
159
+ ],
160
+ });
161
+ if (saveLocation === 'cancel') {
162
+ console.log(chalk.yellow('Configuration not saved.'));
163
+ return false;
164
+ }
165
+ // Save config
166
+ if (saveLocation === 'global') {
167
+ await saveUserConfig(finalConfig);
168
+ console.log(chalk.green(`✓ Saved to ${getUserConfigPath()}`));
169
+ }
170
+ else {
171
+ await saveHudConfig(finalConfig, projectDir);
172
+ console.log(chalk.green(`✓ Saved to ${getHudConfigPath(projectDir)}`));
173
+ }
174
+ console.log('');
175
+ console.log(chalk.cyan('Restart Claude Code to see changes.'));
176
+ console.log('');
177
+ return true;
178
+ }
179
+ catch (error) {
180
+ if (error instanceof Error && (error.message.includes('User force closed') || error.name === 'ExitPromptError')) {
181
+ console.log(chalk.dim('\n Configuration cancelled.\n'));
182
+ return false;
183
+ }
184
+ throw error;
185
+ }
186
+ }
187
+ /**
188
+ * Get count of enabled display options
189
+ */
190
+ export function getEnabledCount(display) {
191
+ return Object.values(display).filter(Boolean).length;
192
+ }
193
+ /**
194
+ * Get total count of display options
195
+ */
196
+ export function getTotalDisplayOptions() {
197
+ return DISPLAY_GROUPS.reduce((count, group) => count + group.options.length, 0);
198
+ }
199
+ //# sourceMappingURL=config-tui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-tui.js","sourceRoot":"","sources":["../../src/hud/config-tui.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,12 @@
1
1
  /**
2
2
  * HUD Config - Load and manage HUD configuration
3
3
  *
4
- * Loads configuration from .dino/hud.json and merges with defaults.
4
+ * Configuration loading order (v13.4.0):
5
+ * 1. Default configuration (hardcoded)
6
+ * 2. User configuration (~/.config/dino/hud.json)
7
+ * 3. Project configuration (.dino/hud.json)
8
+ *
9
+ * Later configs override earlier ones.
5
10
  */
6
11
  import type { HudConfig } from './types.js';
7
12
  /**
@@ -9,10 +14,30 @@ import type { HudConfig } from './types.js';
9
14
  */
10
15
  export declare const DEFAULT_CONFIG: HudConfig;
11
16
  /**
12
- * Load HUD configuration from .dino/hud.json
17
+ * Load user-level HUD configuration from ~/.config/dino/hud.json
18
+ *
19
+ * @returns User config or null if not found
20
+ */
21
+ export declare function loadUserConfig(): Promise<Partial<HudConfig> | null>;
22
+ /**
23
+ * Save user-level HUD configuration to ~/.config/dino/hud.json
24
+ *
25
+ * Creates the ~/.config/dino/ directory if it doesn't exist.
26
+ *
27
+ * @param config - Configuration to save
28
+ */
29
+ export declare function saveUserConfig(config: Partial<HudConfig>): Promise<void>;
30
+ /**
31
+ * Get user config file path
32
+ */
33
+ export declare function getUserConfigPath(): string;
34
+ /**
35
+ * Load HUD configuration with three-level merge
36
+ *
37
+ * Merge order: DEFAULT_CONFIG < userConfig < projectConfig
13
38
  *
14
39
  * @param projectDir - Project directory (defaults to cwd)
15
- * @returns Merged HudConfig with defaults
40
+ * @returns Merged HudConfig
16
41
  */
17
42
  export declare function loadHudConfig(projectDir?: string): Promise<HudConfig>;
18
43
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/hud/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAyE,MAAM,YAAY,CAAC;AA2EnH;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,SAK5B,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,UAAU,GAAE,MAAsB,GAAG,OAAO,CAAC,SAAS,CAAC,CAa1F;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,EAC1B,UAAU,GAAE,MAAsB,GACjC,OAAO,CAAC,IAAI,CAAC,CAIf;AA0BD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,GAAE,MAAsB,GAAG,MAAM,CAE3E"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/hud/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAyE,MAAM,YAAY,CAAC;AAiFnH;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,SAK5B,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAMzE;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAI9E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,UAAU,GAAE,MAAsB,GAAG,OAAO,CAAC,SAAS,CAAC,CAsB1F;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,EAC1B,UAAU,GAAE,MAAsB,GACjC,OAAO,CAAC,IAAI,CAAC,CAIf;AA0BD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,GAAE,MAAsB,GAAG,MAAM,CAE3E"}
@@ -1,11 +1,22 @@
1
1
  /**
2
2
  * HUD Config - Load and manage HUD configuration
3
3
  *
4
- * Loads configuration from .dino/hud.json and merges with defaults.
4
+ * Configuration loading order (v13.4.0):
5
+ * 1. Default configuration (hardcoded)
6
+ * 2. User configuration (~/.config/dino/hud.json)
7
+ * 3. Project configuration (.dino/hud.json)
8
+ *
9
+ * Later configs override earlier ones.
5
10
  */
6
11
  import { join } from 'path';
12
+ import { homedir } from 'os';
7
13
  import { FileSystem } from '../utils/file-system.js';
8
14
  import { DINO_DIR_NAME } from '../core/config/constants.js';
15
+ /**
16
+ * User-level config directory
17
+ */
18
+ const USER_CONFIG_DIR = join(homedir(), '.config', 'dino');
19
+ const USER_CONFIG_PATH = join(USER_CONFIG_DIR, 'hud.json');
9
20
  /**
10
21
  * Default display configuration
11
22
  *
@@ -79,19 +90,60 @@ export const DEFAULT_CONFIG = {
79
90
  limits: DEFAULT_LIMITS,
80
91
  };
81
92
  /**
82
- * Load HUD configuration from .dino/hud.json
93
+ * Load user-level HUD configuration from ~/.config/dino/hud.json
94
+ *
95
+ * @returns User config or null if not found
96
+ */
97
+ export async function loadUserConfig() {
98
+ try {
99
+ return await FileSystem.readJsonSafe(USER_CONFIG_PATH);
100
+ }
101
+ catch {
102
+ return null;
103
+ }
104
+ }
105
+ /**
106
+ * Save user-level HUD configuration to ~/.config/dino/hud.json
107
+ *
108
+ * Creates the ~/.config/dino/ directory if it doesn't exist.
109
+ *
110
+ * @param config - Configuration to save
111
+ */
112
+ export async function saveUserConfig(config) {
113
+ // Ensure directory exists
114
+ await FileSystem.createDirectory(USER_CONFIG_DIR);
115
+ await FileSystem.writeJson(USER_CONFIG_PATH, config);
116
+ }
117
+ /**
118
+ * Get user config file path
119
+ */
120
+ export function getUserConfigPath() {
121
+ return USER_CONFIG_PATH;
122
+ }
123
+ /**
124
+ * Load HUD configuration with three-level merge
125
+ *
126
+ * Merge order: DEFAULT_CONFIG < userConfig < projectConfig
83
127
  *
84
128
  * @param projectDir - Project directory (defaults to cwd)
85
- * @returns Merged HudConfig with defaults
129
+ * @returns Merged HudConfig
86
130
  */
87
131
  export async function loadHudConfig(projectDir = process.cwd()) {
88
132
  try {
89
- const configPath = join(projectDir, DINO_DIR_NAME, 'hud.json');
90
- const userConfig = await FileSystem.readJsonSafe(configPath);
91
- if (!userConfig) {
92
- return DEFAULT_CONFIG;
133
+ // Start with defaults
134
+ let config = DEFAULT_CONFIG;
135
+ // Layer 2: User config (~/.config/dino/hud.json)
136
+ const userConfig = await loadUserConfig();
137
+ if (userConfig) {
138
+ config = mergeConfig(config, userConfig);
139
+ }
140
+ // Layer 3: Project config (.dino/hud.json)
141
+ const projectConfigPath = join(projectDir, DINO_DIR_NAME, 'hud.json');
142
+ const projectConfig = await FileSystem.readJsonSafe(projectConfigPath);
143
+ if (projectConfig) {
144
+ config = mergeConfig(config, projectConfig);
93
145
  }
94
- return mergeConfig(DEFAULT_CONFIG, userConfig);
146
+ return config;
95
147
  }
96
148
  catch {
97
149
  return DEFAULT_CONFIG;