Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
481d1a3
feat: add the experimentation skill to the agent space in setup
cchu-ld Oct 26, 2026
8028961
fix: make the skill step optional and update copies from older versions
cchu-ld Oct 26, 2026
254e9a5
fix: keep the AWS message in skill warnings and report the skill action
cchu-ld Oct 26, 2026
6dfcc56
fix: report a plan change as a skipped skill and warn on stderr in JS…
cchu-ld Oct 26, 2026
44041f7
fix: let the experiment skill resume across runs and wait 2 weeks for…
cchu-ld Oct 26, 2026
9a09cc6
fix: shape the experiment skill for a chat run with approved writes
cchu-ld Oct 26, 2026
800dc4d
fix: add missing MCP tools to an existing allowlist on request, and k…
cchu-ld Oct 26, 2026
3b93320
fix: address review feedback on the experiment skill
cchu-ld Oct 27, 2026
087d39e
feat: add the experiment-orchestrator custom agent to the agent space…
cchu-ld Oct 26, 2026
6d91b76
feat: show the skill and the custom agent in status
cchu-ld Oct 26, 2026
7263e56
fix: shape the custom agent prompt for chat runs and read-only runs
cchu-ld Oct 26, 2026
642f7e3
fix: name the custom agent's tools after the server's name in AWS
cchu-ld Oct 27, 2026
7b480c6
feat: add the experiment-orchestrator custom agent to the agent space…
cchu-ld Oct 26, 2026
32b9e64
feat: show the skill and the custom agent in status
cchu-ld Oct 26, 2026
bcd7105
fix: shape the custom agent prompt for chat runs and read-only runs
cchu-ld Oct 26, 2026
9b17501
fix: name the custom agent's tools after the server's name in AWS
cchu-ld Oct 27, 2026
f4b3213
fix: make the custom agent prompt a thin layer on the experiment skill
cchu-ld Oct 28, 2026
ce5eaf8
Merge the old branch history after the rebase onto main
cchu-ld Oct 28, 2026
aa3f5ea
Merge remote-tracking branch 'origin/main' into cchu/experiment-custo…
cchu-ld Oct 28, 2026
5fe9961
fix: shorten the custom agent prompt to one paragraph
cchu-ld Oct 28, 2026
a020cc5
fix: remove --replace-agent from aws-devops-agent setup
cchu-ld Oct 28, 2026
1c98728
fix: leave the skill and the custom agent out of status
cchu-ld Oct 28, 2026
549cb81
chore: remove comments that repeat the code
cchu-ld Oct 28, 2026
25884c1
chore: remove dead code from the custom agent step
cchu-ld Oct 28, 2026
fbe2e52
chore: pass the MCP server name to the custom agent step
cchu-ld Oct 28, 2026
0ef40ca
fix: give the custom agent the tools that --add-mcp-tools adds
cchu-ld Oct 28, 2026
66eb767
feat: sync the AWS DevOps Agent files from ai-tooling at a fixed commit
cchu-ld Oct 28, 2026
1c7eeb4
chore: sync the AWS DevOps Agent files from the ai-tooling merge commit
cchu-ld Oct 29, 2026
07ed010
docs: say that setting up the skill and the custom agent is optional
cchu-ld Oct 29, 2026
9969b07
feat: allow the MCP tools of the whole experiment flow, and add them …
cchu-ld Oct 29, 2026
6a02bed
feat: download the AWS DevOps Agent skill and prompt from ai-tooling …
cchu-ld Oct 29, 2026
c6aaed2
chore: drop the unknown-tool warning and the ai-tooling history check
cchu-ld Oct 29, 2026
a4489f3
fix: skip an existing skill or agent that differs from ai-tooling main
cchu-ld Oct 29, 2026
d57f70c
chore: trim comments and dead code in the skill and custom agent steps
cchu-ld Oct 29, 2026
e8db6e7
docs: clarify why setup downloads the skill and prompt once
cchu-ld Oct 29, 2026
03c96a9
chore: restore comments that the earlier cleanup only rephrased
cchu-ld Oct 29, 2026
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
19 changes: 15 additions & 4 deletions cmd/aws_devops_agent/confirm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,13 +129,24 @@ func countingClients(spaces ...agenttypes.AgentSpace) (awsdevops.Clients, *write
w := &writes{}

return awsdevops.Clients{
Agent: countingAgent{stubAgent: stubAgent{spaces: spaces}, writes: w},
IAM: countingIAM{writes: w},
STS: accountSTS{},
Region: "eu-west-2",
Agent: countingAgent{stubAgent: stubAgent{spaces: spaces}, writes: w},
IAM: countingIAM{writes: w},
STS: accountSTS{},
Sources: stubSources{skill: "---\nname: experiment-orchestration\ndescription: Run experiments.\n---\n"},
Region: "eu-west-2",
}, w
}

type stubSources struct{ skill string }

func (s stubSources) File(_ context.Context, path string) (string, error) {
if strings.HasSuffix(path, "SKILL.md") {
return s.skill, nil
}

return "# Experiment orchestrator\n", nil
}

// noReadStdin fails the test on any read.
type noReadStdin struct{ t *testing.T }

Expand Down
1 change: 1 addition & 0 deletions cmd/aws_devops_agent/plan_print_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ func TestSetupPlanNamesRolesAndOperatorApp(t *testing.T) {
assert.Contains(t, out.String(), awsdevops.OperatorAppRoleName)
assert.Contains(t, out.String(), "operator app")
assert.Contains(t, out.String(), "Skill: Create skill "+awsdevops.ExperimentSkillName)
assert.Contains(t, out.String(), "Custom agent: Create custom agent "+awsdevops.ExperimentAgentName)
}

// A canceled plan does not create the skill.
Expand Down
37 changes: 26 additions & 11 deletions cmd/aws_devops_agent/setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,15 +57,24 @@ who approved access, in every agent space. If the agent space already has an
MCP server, setup keeps it.

A space that reuses a server keeps its tool allowlist. If the allowlist misses
tools that this ldcli version allows, setup warns. To add them, pass
--add-mcp-tools. AWS does not send back the classification of each tool, so
the rewrite gives every tool the ldcli classification.
tools that this ldcli version allows, setup adds them. AWS does not send back
the classification of each tool, so the rewrite gives every tool the ldcli
classification.

Setup downloads the skill and the custom agent prompt from the main branch of
launchdarkly/ai-tooling on GitHub, so those steps need access to GitHub. If
the download fails, setup skips both steps and warns.

The experiment-orchestration skill tells the agent how to run an experiment
from a goal to a report. Every agent type in the space can load it. If the
skill has the text of an older ldcli version, setup updates it. If someone
edited it, setup does not change it. To overwrite the edits, pass
--replace-skill. The skill is optional: if its step fails, setup warns and
space already has the skill and it differs from the latest version, setup
skips it. To update it to the latest version, pass --replace-skill. Setting
up the skill is optional: if its step fails, setup warns and does the other
steps.

The experiment-orchestrator custom agent runs the skill with the LaunchDarkly
MCP tools that the space allows. It needs the MCP server and the skill.
Setting up the custom agent is optional: if its step fails, setup warns and
does the other steps.`,
Args: cobra.NoArgs,
PreRun: trackRun(analyticsTrackerFn),
Expand All @@ -86,9 +95,9 @@ does the other steps.`,
cmd.Flags().String(idpClientSecretFlag, "", "OIDC client secret, required when --auth-flow=idp")
cmd.Flags().String(mcpServiceIDFlag, "", "Registered MCP server to connect, instead of the server of the AWS account")
cmd.Flags().String(mcpEndpointFlag, "", "MCP endpoint to register. Setup reuses only a server at this endpoint. Defaults to "+awsdevops.MCPServerEndpoint)
cmd.Flags().Bool(replaceSkillFlag, false, "Overwrite the "+awsdevops.ExperimentSkillName+" skill if someone edited it")
cmd.Flags().Bool(addMCPToolsFlag, false, "Add the ldcli tools that the MCP server allowlist of an existing agent space misses. "+
"Every tool gets the ldcli classification")
cmd.Flags().Bool(replaceSkillFlag, false, "Overwrite the "+awsdevops.ExperimentSkillName+" skill if it differs from the latest version")
cmd.Flags().Bool(addMCPToolsFlag, false, "Has no effect. Setup adds the missing tools without it")
_ = cmd.Flags().MarkDeprecated(addMCPToolsFlag, "setup now adds the missing MCP tools without it")

cmd.Flags().Bool(yesFlag, false, "Ask no questions and accept every step")

Expand Down Expand Up @@ -178,6 +187,9 @@ func setupWith(
if result.SkillError != "" {
_, _ = fmt.Fprintf(cmd.ErrOrStderr(), "Warning: %s\n", result.SkillError)
}
if result.AgentError != "" {
_, _ = fmt.Fprintf(cmd.ErrOrStderr(), "Warning: %s\n", result.AgentError)
}

return printJSON(cmd, result)
}
Expand All @@ -188,6 +200,9 @@ func setupWith(
if result.SkillError != "" {
_, _ = fmt.Fprintf(cmd.OutOrStdout(), "\nWarning: %s\n", result.SkillError)
}
if result.AgentError != "" {
_, _ = fmt.Fprintf(cmd.OutOrStdout(), "\nWarning: %s\n", result.AgentError)
}

// Only a connect run leaves the app off, on a space that setup did not
// make. The full setup would change that space, so point to the console.
Expand Down Expand Up @@ -513,7 +528,8 @@ func confirmSetup(cmd *cobra.Command, plan awsdevops.SetupPlan, ask bool) error
_, _ = fmt.Fprintf(out, " Association: %s\n", text.Association)
_, _ = fmt.Fprintf(out, " Operator app: %s\n", text.OperatorApp)
_, _ = fmt.Fprintf(out, " MCP server: %s\n", text.MCPServer)
_, _ = fmt.Fprintf(out, " Skill: %s\n\n", text.Skill)
_, _ = fmt.Fprintf(out, " Skill: %s\n", text.Skill)
_, _ = fmt.Fprintf(out, " Custom agent: %s\n\n", text.Agent)
if !ask {
return nil
}
Expand Down Expand Up @@ -641,7 +657,6 @@ func setupOptions(cmd *cobra.Command) (awsdevops.SetupOptions, error) {
MCPEndpoint: mustString(cmd, mcpEndpointFlag),
OpenURL: browser.OpenURL,
ReplaceSkill: mustBool(cmd, replaceSkillFlag),
AddMCPTools: mustBool(cmd, addMCPToolsFlag),
}

idcSet := opts.IdcInstanceARN != ""
Expand Down
Loading
Loading