Documentation
¶
Index ¶
- func ShouldSkipScriptFile(filename string) bool
- type ExecutionRequester
- type Repository
- type Script
- type ScriptExecutionBroker
- func (b *ScriptExecutionBroker) ActiveCount() int
- func (b *ScriptExecutionBroker) CompleteExecution(requestID string, success bool, exitCode int32, ...)
- func (b *ScriptExecutionBroker) Drain(ctx context.Context) error
- func (b *ScriptExecutionBroker) IsDraining() bool
- func (b *ScriptExecutionBroker) PushOutput(requestID, stdoutChunk, stderrChunk string)
- func (b *ScriptExecutionBroker) RegisterExecution(requestID string)
- func (b *ScriptExecutionBroker) SetDraining(draining bool)
- func (b *ScriptExecutionBroker) Subscribe(requestID string) (<-chan *taskguildv1.ScriptExecutionEvent, func())
- type Server
- func (s *Server) CreateScript(ctx context.Context, req *connect.Request[taskguildv1.CreateScriptRequest]) (*connect.Response[taskguildv1.CreateScriptResponse], error)
- func (s *Server) DeleteScript(ctx context.Context, req *connect.Request[taskguildv1.DeleteScriptRequest]) (*connect.Response[taskguildv1.DeleteScriptResponse], error)
- func (s *Server) ExecuteScript(ctx context.Context, req *connect.Request[taskguildv1.ExecuteScriptRequest]) (*connect.Response[taskguildv1.ExecuteScriptResponse], error)
- func (s *Server) GetScript(ctx context.Context, req *connect.Request[taskguildv1.GetScriptRequest]) (*connect.Response[taskguildv1.GetScriptResponse], error)
- func (s *Server) ListScripts(ctx context.Context, req *connect.Request[taskguildv1.ListScriptsRequest]) (*connect.Response[taskguildv1.ListScriptsResponse], error)
- func (s *Server) StreamScriptExecution(ctx context.Context, ...) error
- func (s *Server) SyncScriptsFromDir(ctx context.Context, ...) (*connect.Response[taskguildv1.SyncScriptsFromDirResponse], error)
- func (s *Server) UpdateScript(ctx context.Context, req *connect.Request[taskguildv1.UpdateScriptRequest]) (*connect.Response[taskguildv1.UpdateScriptResponse], error)
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func ShouldSkipScriptFile ¶ added in v0.0.4
ShouldSkipScriptFile returns true if the given filename looks like an editor swap file, backup file, or other temporary file that should not be registered as a script.
It checks for:
- Hidden files (filenames starting with ".")
- Known temporary/swap file suffixes (.swp, .swo, ~, .bak, .tmp, .orig, .rej)
- Emacs auto-save files (filenames wrapped in "#", e.g. #deploy.sh#)
Types ¶
type ExecutionRequester ¶
type ExecutionRequester interface {
// RequestScriptExecution sends an execute command to a connected agent-manager
// and returns a request_id for tracking the result.
RequestScriptExecution(projectID string, script *Script) (string, error)
}
ExecutionRequester is an interface for triggering script execution on agent-managers.
type Repository ¶
type Repository interface {
Create(ctx context.Context, s *Script) error
Get(ctx context.Context, id string) (*Script, error)
List(ctx context.Context, projectID string, limit, offset int) ([]*Script, int, error)
FindByName(ctx context.Context, projectID, name string) (*Script, error)
Update(ctx context.Context, s *Script) error
Delete(ctx context.Context, id string) error
}
type Script ¶
type Script struct {
ID string `yaml:"id"`
ProjectID string `yaml:"project_id"`
Name string `yaml:"name"`
Description string `yaml:"description"`
Filename string `yaml:"filename"`
Content string `yaml:"content"`
IsSynced bool `yaml:"is_synced"`
CreatedAt time.Time `yaml:"created_at"`
UpdatedAt time.Time `yaml:"updated_at"`
}
type ScriptExecutionBroker ¶
type ScriptExecutionBroker struct {
// contains filtered or unexported fields
}
ScriptExecutionBroker manages per-request channels for streaming script execution output to frontend subscribers. It supports late joiners by buffering all events for each execution.
func NewScriptExecutionBroker ¶
func NewScriptExecutionBroker() *ScriptExecutionBroker
NewScriptExecutionBroker creates a new broker for streaming script output.
func (*ScriptExecutionBroker) ActiveCount ¶
func (b *ScriptExecutionBroker) ActiveCount() int
ActiveCount returns the number of currently active (non-completed) executions.
func (*ScriptExecutionBroker) CompleteExecution ¶
func (b *ScriptExecutionBroker) CompleteExecution(requestID string, success bool, exitCode int32, stdout, stderr, errorMessage string)
CompleteExecution marks an execution as complete and sends the completion event to all subscribers. Subscriber channels are closed after sending.
func (*ScriptExecutionBroker) Drain ¶
func (b *ScriptExecutionBroker) Drain(ctx context.Context) error
Drain blocks until all active executions have completed or the context is cancelled (e.g. timeout). Must call SetDraining(true) before calling Drain. Returns the context error if the context was cancelled before all executions completed, or nil if all executions completed successfully.
func (*ScriptExecutionBroker) IsDraining ¶
func (b *ScriptExecutionBroker) IsDraining() bool
IsDraining returns true if the broker is in draining mode (rejecting new executions in preparation for graceful shutdown).
func (*ScriptExecutionBroker) PushOutput ¶
func (b *ScriptExecutionBroker) PushOutput(requestID, stdoutChunk, stderrChunk string)
PushOutput sends an output chunk to all subscribers and buffers it for late joiners. It is a no-op if the execution is not registered or already completed.
func (*ScriptExecutionBroker) RegisterExecution ¶
func (b *ScriptExecutionBroker) RegisterExecution(requestID string)
RegisterExecution registers a new script execution. Must be called before PushOutput or CompleteExecution for the given requestID.
func (*ScriptExecutionBroker) SetDraining ¶
func (b *ScriptExecutionBroker) SetDraining(draining bool)
SetDraining sets the draining flag. When draining, the broker signals when all active executions have completed.
func (*ScriptExecutionBroker) Subscribe ¶
func (b *ScriptExecutionBroker) Subscribe(requestID string) (<-chan *taskguildv1.ScriptExecutionEvent, func())
Subscribe returns a channel that receives ScriptExecutionEvents for the given requestID. The channel is closed when the execution completes. A cleanup function is returned to unsubscribe. Returns nil channel if the requestID is unknown.
Late joiners receive all buffered events immediately before live events.
type Server ¶
type Server struct {
// contains filtered or unexported fields
}
func NewServer ¶
func NewServer(repo Repository, execReq ExecutionRequester, broker *ScriptExecutionBroker) *Server
func (*Server) CreateScript ¶
func (s *Server) CreateScript(ctx context.Context, req *connect.Request[taskguildv1.CreateScriptRequest]) (*connect.Response[taskguildv1.CreateScriptResponse], error)
func (*Server) DeleteScript ¶
func (s *Server) DeleteScript(ctx context.Context, req *connect.Request[taskguildv1.DeleteScriptRequest]) (*connect.Response[taskguildv1.DeleteScriptResponse], error)
func (*Server) ExecuteScript ¶
func (s *Server) ExecuteScript(ctx context.Context, req *connect.Request[taskguildv1.ExecuteScriptRequest]) (*connect.Response[taskguildv1.ExecuteScriptResponse], error)
ExecuteScript triggers execution of a script on a connected agent-manager.
func (*Server) GetScript ¶
func (s *Server) GetScript(ctx context.Context, req *connect.Request[taskguildv1.GetScriptRequest]) (*connect.Response[taskguildv1.GetScriptResponse], error)
func (*Server) ListScripts ¶
func (s *Server) ListScripts(ctx context.Context, req *connect.Request[taskguildv1.ListScriptsRequest]) (*connect.Response[taskguildv1.ListScriptsResponse], error)
func (*Server) StreamScriptExecution ¶
func (s *Server) StreamScriptExecution(ctx context.Context, req *connect.Request[taskguildv1.StreamScriptExecutionRequest], stream *connect.ServerStream[taskguildv1.ScriptExecutionEvent]) error
StreamScriptExecution streams real-time output from a script execution.
func (*Server) SyncScriptsFromDir ¶
func (s *Server) SyncScriptsFromDir(ctx context.Context, req *connect.Request[taskguildv1.SyncScriptsFromDirRequest]) (*connect.Response[taskguildv1.SyncScriptsFromDirResponse], error)
SyncScriptsFromDir scans a directory for .claude/scripts/* files and syncs them.
func (*Server) UpdateScript ¶
func (s *Server) UpdateScript(ctx context.Context, req *connect.Request[taskguildv1.UpdateScriptRequest]) (*connect.Response[taskguildv1.UpdateScriptResponse], error)