Prepare for v2 development: Add MCP integration and future development planning
- Add FUTURE_DEVELOPMENT.md with comprehensive v2 protocol specification - Add MCP integration design and implementation foundation - Add infrastructure and deployment configurations - Update system architecture for v2 evolution 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
222
pkg/config/slurp_config.go
Normal file
222
pkg/config/slurp_config.go
Normal file
@@ -0,0 +1,222 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
// SlurpConfig holds SLURP event system integration configuration
|
||||
type SlurpConfig struct {
|
||||
// Connection settings
|
||||
Enabled bool `yaml:"enabled" json:"enabled"`
|
||||
BaseURL string `yaml:"base_url" json:"base_url"`
|
||||
APIKey string `yaml:"api_key" json:"api_key"`
|
||||
Timeout time.Duration `yaml:"timeout" json:"timeout"`
|
||||
RetryCount int `yaml:"retry_count" json:"retry_count"`
|
||||
RetryDelay time.Duration `yaml:"retry_delay" json:"retry_delay"`
|
||||
|
||||
// Event generation settings
|
||||
EventGeneration EventGenerationConfig `yaml:"event_generation" json:"event_generation"`
|
||||
|
||||
// Project-specific event mappings
|
||||
ProjectMappings map[string]ProjectEventMapping `yaml:"project_mappings" json:"project_mappings"`
|
||||
|
||||
// Default event settings
|
||||
DefaultEventSettings DefaultEventConfig `yaml:"default_event_settings" json:"default_event_settings"`
|
||||
|
||||
// Batch processing settings
|
||||
BatchProcessing BatchConfig `yaml:"batch_processing" json:"batch_processing"`
|
||||
}
|
||||
|
||||
// EventGenerationConfig controls when and how SLURP events are generated
|
||||
type EventGenerationConfig struct {
|
||||
// Consensus requirements
|
||||
MinConsensusStrength float64 `yaml:"min_consensus_strength" json:"min_consensus_strength"`
|
||||
MinParticipants int `yaml:"min_participants" json:"min_participants"`
|
||||
RequireUnanimity bool `yaml:"require_unanimity" json:"require_unanimity"`
|
||||
|
||||
// Time-based triggers
|
||||
MaxDiscussionDuration time.Duration `yaml:"max_discussion_duration" json:"max_discussion_duration"`
|
||||
MinDiscussionDuration time.Duration `yaml:"min_discussion_duration" json:"min_discussion_duration"`
|
||||
|
||||
// Event type generation rules
|
||||
EnabledEventTypes []string `yaml:"enabled_event_types" json:"enabled_event_types"`
|
||||
DisabledEventTypes []string `yaml:"disabled_event_types" json:"disabled_event_types"`
|
||||
|
||||
// Severity calculation
|
||||
SeverityRules SeverityConfig `yaml:"severity_rules" json:"severity_rules"`
|
||||
}
|
||||
|
||||
// SeverityConfig defines how to calculate event severity from HMMM discussions
|
||||
type SeverityConfig struct {
|
||||
// Base severity for each event type (1-10 scale)
|
||||
BaseSeverity map[string]int `yaml:"base_severity" json:"base_severity"`
|
||||
|
||||
// Modifiers based on discussion characteristics
|
||||
ParticipantMultiplier float64 `yaml:"participant_multiplier" json:"participant_multiplier"`
|
||||
DurationMultiplier float64 `yaml:"duration_multiplier" json:"duration_multiplier"`
|
||||
UrgencyKeywords []string `yaml:"urgency_keywords" json:"urgency_keywords"`
|
||||
UrgencyBoost int `yaml:"urgency_boost" json:"urgency_boost"`
|
||||
|
||||
// Severity caps
|
||||
MinSeverity int `yaml:"min_severity" json:"min_severity"`
|
||||
MaxSeverity int `yaml:"max_severity" json:"max_severity"`
|
||||
}
|
||||
|
||||
// ProjectEventMapping defines project-specific event mapping rules
|
||||
type ProjectEventMapping struct {
|
||||
ProjectPath string `yaml:"project_path" json:"project_path"`
|
||||
CustomEventTypes map[string]string `yaml:"custom_event_types" json:"custom_event_types"`
|
||||
SeverityOverrides map[string]int `yaml:"severity_overrides" json:"severity_overrides"`
|
||||
AdditionalMetadata map[string]interface{} `yaml:"additional_metadata" json:"additional_metadata"`
|
||||
EventFilters []EventFilter `yaml:"event_filters" json:"event_filters"`
|
||||
}
|
||||
|
||||
// EventFilter defines conditions for filtering or modifying events
|
||||
type EventFilter struct {
|
||||
Name string `yaml:"name" json:"name"`
|
||||
Conditions map[string]string `yaml:"conditions" json:"conditions"`
|
||||
Action string `yaml:"action" json:"action"` // "allow", "deny", "modify"
|
||||
Modifications map[string]string `yaml:"modifications" json:"modifications"`
|
||||
}
|
||||
|
||||
// DefaultEventConfig provides default settings for generated events
|
||||
type DefaultEventConfig struct {
|
||||
DefaultSeverity int `yaml:"default_severity" json:"default_severity"`
|
||||
DefaultCreatedBy string `yaml:"default_created_by" json:"default_created_by"`
|
||||
DefaultTags []string `yaml:"default_tags" json:"default_tags"`
|
||||
MetadataTemplate map[string]string `yaml:"metadata_template" json:"metadata_template"`
|
||||
}
|
||||
|
||||
// BatchConfig controls batch processing of SLURP events
|
||||
type BatchConfig struct {
|
||||
Enabled bool `yaml:"enabled" json:"enabled"`
|
||||
MaxBatchSize int `yaml:"max_batch_size" json:"max_batch_size"`
|
||||
MaxBatchWait time.Duration `yaml:"max_batch_wait" json:"max_batch_wait"`
|
||||
FlushOnShutdown bool `yaml:"flush_on_shutdown" json:"flush_on_shutdown"`
|
||||
}
|
||||
|
||||
// HmmmToSlurpMapping defines the mapping between HMMM discussion outcomes and SLURP event types
|
||||
type HmmmToSlurpMapping struct {
|
||||
// Consensus types to SLURP event types
|
||||
ConsensusApproval string `yaml:"consensus_approval" json:"consensus_approval"` // -> "approval"
|
||||
RiskIdentified string `yaml:"risk_identified" json:"risk_identified"` // -> "warning"
|
||||
CriticalBlocker string `yaml:"critical_blocker" json:"critical_blocker"` // -> "blocker"
|
||||
PriorityChange string `yaml:"priority_change" json:"priority_change"` // -> "priority_change"
|
||||
AccessRequest string `yaml:"access_request" json:"access_request"` // -> "access_update"
|
||||
ArchitectureDecision string `yaml:"architecture_decision" json:"architecture_decision"` // -> "structural_change"
|
||||
InformationShare string `yaml:"information_share" json:"information_share"` // -> "announcement"
|
||||
|
||||
// Keywords that trigger specific event types
|
||||
ApprovalKeywords []string `yaml:"approval_keywords" json:"approval_keywords"`
|
||||
WarningKeywords []string `yaml:"warning_keywords" json:"warning_keywords"`
|
||||
BlockerKeywords []string `yaml:"blocker_keywords" json:"blocker_keywords"`
|
||||
PriorityKeywords []string `yaml:"priority_keywords" json:"priority_keywords"`
|
||||
AccessKeywords []string `yaml:"access_keywords" json:"access_keywords"`
|
||||
StructuralKeywords []string `yaml:"structural_keywords" json:"structural_keywords"`
|
||||
AnnouncementKeywords []string `yaml:"announcement_keywords" json:"announcement_keywords"`
|
||||
}
|
||||
|
||||
// GetDefaultSlurpConfig returns default SLURP configuration
|
||||
func GetDefaultSlurpConfig() SlurpConfig {
|
||||
return SlurpConfig{
|
||||
Enabled: false, // Disabled by default until configured
|
||||
BaseURL: "http://localhost:8080",
|
||||
Timeout: 30 * time.Second,
|
||||
RetryCount: 3,
|
||||
RetryDelay: 5 * time.Second,
|
||||
|
||||
EventGeneration: EventGenerationConfig{
|
||||
MinConsensusStrength: 0.7,
|
||||
MinParticipants: 2,
|
||||
RequireUnanimity: false,
|
||||
MaxDiscussionDuration: 30 * time.Minute,
|
||||
MinDiscussionDuration: 1 * time.Minute,
|
||||
EnabledEventTypes: []string{
|
||||
"announcement", "warning", "blocker", "approval",
|
||||
"priority_change", "access_update", "structural_change",
|
||||
},
|
||||
DisabledEventTypes: []string{},
|
||||
SeverityRules: SeverityConfig{
|
||||
BaseSeverity: map[string]int{
|
||||
"announcement": 3,
|
||||
"warning": 5,
|
||||
"blocker": 8,
|
||||
"approval": 4,
|
||||
"priority_change": 6,
|
||||
"access_update": 5,
|
||||
"structural_change": 7,
|
||||
},
|
||||
ParticipantMultiplier: 0.2,
|
||||
DurationMultiplier: 0.1,
|
||||
UrgencyKeywords: []string{"urgent", "critical", "blocker", "emergency", "immediate"},
|
||||
UrgencyBoost: 2,
|
||||
MinSeverity: 1,
|
||||
MaxSeverity: 10,
|
||||
},
|
||||
},
|
||||
|
||||
ProjectMappings: make(map[string]ProjectEventMapping),
|
||||
|
||||
DefaultEventSettings: DefaultEventConfig{
|
||||
DefaultSeverity: 5,
|
||||
DefaultCreatedBy: "hmmm-consensus",
|
||||
DefaultTags: []string{"hmmm-generated", "automated"},
|
||||
MetadataTemplate: map[string]string{
|
||||
"source": "hmmm-discussion",
|
||||
"generation_type": "consensus-based",
|
||||
},
|
||||
},
|
||||
|
||||
BatchProcessing: BatchConfig{
|
||||
Enabled: true,
|
||||
MaxBatchSize: 10,
|
||||
MaxBatchWait: 5 * time.Second,
|
||||
FlushOnShutdown: true,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// GetHmmmToSlurpMapping returns the default mapping configuration
|
||||
func GetHmmmToSlurpMapping() HmmmToSlurpMapping {
|
||||
return HmmmToSlurpMapping{
|
||||
ConsensusApproval: "approval",
|
||||
RiskIdentified: "warning",
|
||||
CriticalBlocker: "blocker",
|
||||
PriorityChange: "priority_change",
|
||||
AccessRequest: "access_update",
|
||||
ArchitectureDecision: "structural_change",
|
||||
InformationShare: "announcement",
|
||||
|
||||
ApprovalKeywords: []string{"approve", "approved", "looks good", "lgtm", "accepted", "agree"},
|
||||
WarningKeywords: []string{"warning", "caution", "risk", "potential issue", "concern", "careful"},
|
||||
BlockerKeywords: []string{"blocker", "blocked", "critical", "urgent", "cannot proceed", "show stopper"},
|
||||
PriorityKeywords: []string{"priority", "urgent", "high priority", "low priority", "reprioritize"},
|
||||
AccessKeywords: []string{"access", "permission", "auth", "authorization", "credentials", "token"},
|
||||
StructuralKeywords: []string{"architecture", "structure", "design", "refactor", "framework", "pattern"},
|
||||
AnnouncementKeywords: []string{"announce", "fyi", "information", "update", "news", "notice"},
|
||||
}
|
||||
}
|
||||
|
||||
// ValidateSlurpConfig validates SLURP configuration
|
||||
func ValidateSlurpConfig(config SlurpConfig) error {
|
||||
if config.Enabled {
|
||||
if config.BaseURL == "" {
|
||||
return fmt.Errorf("slurp.base_url is required when SLURP is enabled")
|
||||
}
|
||||
|
||||
if config.EventGeneration.MinConsensusStrength < 0 || config.EventGeneration.MinConsensusStrength > 1 {
|
||||
return fmt.Errorf("slurp.event_generation.min_consensus_strength must be between 0 and 1")
|
||||
}
|
||||
|
||||
if config.EventGeneration.MinParticipants < 1 {
|
||||
return fmt.Errorf("slurp.event_generation.min_participants must be at least 1")
|
||||
}
|
||||
|
||||
if config.DefaultEventSettings.DefaultSeverity < 1 || config.DefaultEventSettings.DefaultSeverity > 10 {
|
||||
return fmt.Errorf("slurp.default_event_settings.default_severity must be between 1 and 10")
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user