Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 12 additions & 5 deletions cmd/deploy.go
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ Examples:
fmt.Fprintf(os.Stderr, format+"\n", args...)
}
if sreMode {
logf("[deploy] --sre requested; Docker is the default SRE runtime. After deployment, run: clanker sre install --target docker --apply")
logf("[deploy] --sre requested; planning a long-running Clanker SRE agent with heartbeat verification")
}

// 3. Resolve AWS profile/region early so intelligence pipeline can scan infra
Expand Down Expand Up @@ -323,7 +323,7 @@ Examples:
if planProvider == "" {
planProvider = "aws"
}
deployObjectiveContext := withOneClickDeployContext(baseQuestion, planProvider, intel.Architecture.Method, enforceImageDeploy)
deployObjectiveContext := withOneClickDeployContext(baseQuestion, planProvider, intel.Architecture.Method, enforceImageDeploy, sreMode)
planningContext := compactPlanningContext(deployObjectiveContext, planProvider)
projectSummaryForLLM := strings.TrimSpace(rp.Summary)
if intel.DeepAnalysis != nil && strings.TrimSpace(intel.DeepAnalysis.AppDescription) != "" {
Expand Down Expand Up @@ -1773,20 +1773,27 @@ func compactOneLine(raw string, limit int) string {

var shellStylePlaceholderRe = regexp.MustCompile(`\$\{([A-Z0-9_]+)\}`)

func withOneClickDeployContext(base, provider, method string, enforceImageDeploy bool) string {
context := buildOneClickDeployObjective(provider, method, enforceImageDeploy)
func withOneClickDeployContext(base, provider, method string, enforceImageDeploy bool, sreMode bool) string {
context := buildOneClickDeployObjective(provider, method, enforceImageDeploy, sreMode)
base = strings.TrimSpace(base)
if base == "" {
return context
}
return context + "\n\n" + base
}

func buildOneClickDeployObjective(provider, method string, enforceImageDeploy bool) string {
func buildOneClickDeployObjective(provider, method string, enforceImageDeploy bool, sreMode bool) string {
prov := strings.ToLower(strings.TrimSpace(provider))
if prov == "" {
prov = "aws"
}
if sreMode {
deployID := strings.TrimSpace(os.Getenv("CLANKER_SRE_DEPLOY_ID"))
if deployID == "" {
deployID = "$CLANKER_SRE_DEPLOY_ID"
}
return fmt.Sprintf("[one-click SRE deploy objective]\nGenerate command plan steps that deploy only the long-running Clanker SRE agent, not the analyzed app. Use provider=%s and the smallest practical always-on runtime for that provider. Prefer ghcr.io/bgdnvk/clanker:latest and run: clanker sre run --sre --target cloud-vm --provider %s --deploy-id %s. The runtime MUST set CLANKER_CEREBRO_URL, CLANKER_CEREBRO_INGEST_TOKEN, CLANKER_SRE_DEPLOY_ID, and CLANKER_SRE_PROVIDER. Tag or label every created resource with clanker-sre=true and clanker-sre-deploy-id=%s. Keep commands idempotent, preserve created resource IDs, and include a final non-secret health/verification command that checks the service/container is still running. Never print token values.", prov, prov, deployID, deployID)
}
m := strings.ToLower(strings.TrimSpace(method))
if m == "" {
m = "ec2"
Expand Down
9 changes: 8 additions & 1 deletion cmd/sre.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ var sreRunCmd = &cobra.Command{
cerebroURL, _ := cmd.Flags().GetString("cerebro-url")
ingestToken, _ := cmd.Flags().GetString("ingest-token")
provider, _ := cmd.Flags().GetString("provider")
deployID, _ := cmd.Flags().GetString("deploy-id")
interval, err := durationFlag(cmd, "interval", sre.DefaultInterval)
if err != nil {
return err
Expand All @@ -114,6 +115,7 @@ var sreRunCmd = &cobra.Command{
Once: once,
Writer: os.Stdout,
Provider: provider,
DeployID: deployID,
})
if errors.Is(err, context.Canceled) {
return nil
Expand Down Expand Up @@ -184,6 +186,8 @@ func addSREPlanFlags(cmd *cobra.Command) {
cmd.Flags().String("name", sre.DefaultAgentName, "SRE bot name/container/service name")
cmd.Flags().String("cerebro-url", "", "Cerebro API base URL, e.g. http://127.0.0.1:8080/api")
cmd.Flags().String("ingest-token-env", sre.DefaultIngestTokenEnv, "Environment variable name that holds the Cerebro ingest token")
cmd.Flags().String("provider", "", "Cloud provider name for heartbeat identification (aws, gcp, azure, etc.)")
cmd.Flags().String("deploy-id", "", "Stable SRE deployment ID for heartbeat verification")
cmd.Flags().String("interval", sre.DefaultInterval.String(), "Heartbeat/discovery interval")
cmd.Flags().String("format", "text", "Output format: text or json")
}
Expand All @@ -195,6 +199,7 @@ func addSRERunFlags(cmd *cobra.Command) {
cmd.Flags().String("cerebro-url", "", "Cerebro API base URL, e.g. http://127.0.0.1:8080/api")
cmd.Flags().String("ingest-token", "", "Cerebro ingest token (or set CLANKER_CEREBRO_INGEST_TOKEN)")
cmd.Flags().String("provider", "", "Cloud provider name for heartbeat identification (aws, gcp, azure, etc.)")
cmd.Flags().String("deploy-id", "", "Stable SRE deployment ID for heartbeat verification")
cmd.Flags().String("interval", sre.DefaultInterval.String(), "Heartbeat/discovery interval")
cmd.Flags().Bool("once", false, "Send one heartbeat and exit")
}
Expand All @@ -209,8 +214,10 @@ func buildSREPlan(cmd *cobra.Command) (sre.InstallPlan, error) {
name, _ := cmd.Flags().GetString("name")
cerebroURL, _ := cmd.Flags().GetString("cerebro-url")
ingestTokenEnv, _ := cmd.Flags().GetString("ingest-token-env")
provider, _ := cmd.Flags().GetString("provider")
deployID, _ := cmd.Flags().GetString("deploy-id")
discovery := sre.Discover(cmd.Context())
return sre.BuildPlan(discovery, sre.PlanOptions{Target: target, Image: image, Name: name, BackendURL: cerebroURL, IngestTokenEnv: ingestTokenEnv, Interval: interval}), nil
return sre.BuildPlan(discovery, sre.PlanOptions{Target: target, Image: image, Name: name, BackendURL: cerebroURL, IngestTokenEnv: ingestTokenEnv, Provider: provider, DeployID: deployID, Interval: interval}), nil
}

func durationFlag(cmd *cobra.Command, name string, fallback time.Duration) (time.Duration, error) {
Expand Down
Loading