mirror of
https://github.com/mark3labs/kit.git
synced 2026-06-13 19:20:06 +00:00
aede76d807
- ctx.SuspendTUI(callback): releases terminal for interactive subprocesses (vim, shell, htop), automatically restores TUI when callback returns. Uses BubbleTea v2 ReleaseTerminal/RestoreTerminal. - api.RegisterMessageRenderer(config) + ctx.RenderMessage(name, content): named render functions for branded/styled extension output. Renderers receive content and terminal width, return ANSI-styled strings. - ctx.ReloadExtensions(): hot-reloads all extensions from disk. Emits SessionShutdown to old extensions, reloads source, emits SessionStart to new. Event handlers, commands, renderers, shortcuts update immediately. TUI command list refreshes via WidgetUpdateEvent. Extension tools are NOT updated (baked into agent at creation, documented limitation). New example extensions: interactive-shell.go, branded-output.go, dev-reload.go
77 lines
2.3 KiB
Go
77 lines
2.3 KiB
Go
//go:build ignore
|
|
|
|
// branded-output.go — Custom Message Rendering example extension for Kit.
|
|
//
|
|
// Demonstrates api.RegisterMessageRenderer() and ctx.RenderMessage() which
|
|
// let extensions define reusable visual styles for output. Each renderer has
|
|
// a name and a render function that receives content and terminal width.
|
|
//
|
|
// This extension registers three renderers:
|
|
// "success" — green-bordered block for success messages
|
|
// "warning" — yellow-bordered block for warnings
|
|
// "metric" — compact key=value display for metrics
|
|
//
|
|
// Commands:
|
|
// /demo-render — shows all three renderers in action
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
"time"
|
|
|
|
ext "kit/ext"
|
|
)
|
|
|
|
func Init(api ext.API) {
|
|
// Register a "success" renderer — green-accented block.
|
|
api.RegisterMessageRenderer(ext.MessageRendererConfig{
|
|
Name: "success",
|
|
Render: func(content string, width int) string {
|
|
maxW := width - 6
|
|
if maxW < 20 {
|
|
maxW = 20
|
|
}
|
|
bar := strings.Repeat("─", maxW)
|
|
return fmt.Sprintf(" \033[32m┌%s┐\033[0m\n \033[32m│\033[0m \033[1;32m%s\033[0m\n \033[32m└%s┘\033[0m",
|
|
bar, content, bar)
|
|
},
|
|
})
|
|
|
|
// Register a "warning" renderer — yellow-accented block.
|
|
api.RegisterMessageRenderer(ext.MessageRendererConfig{
|
|
Name: "warning",
|
|
Render: func(content string, width int) string {
|
|
maxW := width - 6
|
|
if maxW < 20 {
|
|
maxW = 20
|
|
}
|
|
bar := strings.Repeat("─", maxW)
|
|
return fmt.Sprintf(" \033[33m┌%s┐\033[0m\n \033[33m│\033[0m \033[1;33m%s\033[0m\n \033[33m└%s┘\033[0m",
|
|
bar, content, bar)
|
|
},
|
|
})
|
|
|
|
// Register a "metric" renderer — compact label: value format.
|
|
api.RegisterMessageRenderer(ext.MessageRendererConfig{
|
|
Name: "metric",
|
|
Render: func(content string, width int) string {
|
|
return fmt.Sprintf(" \033[36m▸\033[0m %s", content)
|
|
},
|
|
})
|
|
|
|
api.RegisterCommand(ext.CommandDef{
|
|
Name: "demo-render",
|
|
Description: "Demonstrate custom message renderers",
|
|
Execute: func(args string, ctx ext.Context) (string, error) {
|
|
ctx.RenderMessage("success", "All 42 tests passed in 3.2s")
|
|
ctx.RenderMessage("warning", "3 deprecation warnings detected")
|
|
ctx.RenderMessage("metric", fmt.Sprintf("build_time=%.1fs tests=42 coverage=87%% timestamp=%s",
|
|
3.2, time.Now().Format("15:04:05")))
|
|
|
|
return "Rendered three message styles.", nil
|
|
},
|
|
})
|
|
}
|