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
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# Changelog

## 1.0.7

- The agent picker shows its keys the whole time: space to select or unselect, enter to continue. Before, they only appeared after you pressed enter with nothing selected.
- The closing "Next steps" note suggests a few prompts to try in your agent, such as summarizing your security posture or finding out why a workflow run failed.

## 1.0.6

- `add-sg-mcp login` carries on after you sign in: it asks which coding agents should get the server, then installs the server and the skills, the same as `add-sg-mcp`. Before, it stopped at "Run add-sg-mcp to install the server and skills" and you had to run a second command. Without a terminal (CI, a pipe) `login` still only saves the credential.
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "add-sg-mcp",
"version": "1.0.6",
"version": "1.0.7",
"description": "Connect your coding agents to StackGuardian: installs the StackGuardian MCP server and skills into Claude Code, Codex, Cursor, VS Code, Gemini CLI, OpenCode and more with a single command.",
"author": "StackGuardian <support@stackguardian.io>",
"license": "Apache-2.0",
Expand Down
13 changes: 12 additions & 1 deletion src/sg/commands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -430,7 +430,8 @@ async function chooseAgents(
lastSelected,
});
const selected = await p.multiselect({
message: "Which coding agents should get the StackGuardian server?",
// clack shows the keys only after an empty submit; keep them on screen.
message: `Which coding agents should get the StackGuardian server?\n${chalk.gray("│")} ${chalk.dim("space to select/unselect · enter to continue")}`,
options: choices,
required: true,
initialValues: initialValues.length > 0 ? initialValues : detected,
Expand Down Expand Up @@ -580,6 +581,13 @@ export async function runConnect(
await installServerAndSkills(target, options, deps);
}

const SUGGESTED_PROMPTS = [
"Summarize my StackGuardian security posture and top misconfigurations",
"Why did my latest workflow run fail? Show me the logs",
"Create a workflow from a marketplace template for an S3 bucket",
"Upgrade my workflows that use an outdated template version",
];

/** Agent pick, server entry, skills and the closing note: everything after the credential. */
async function installServerAndSkills(
{ apiBase, org, headers, allowed }: SgInstallTarget,
Expand Down Expand Up @@ -617,6 +625,9 @@ async function installServerAndSkills(
`Restart your agents to pick up ${chalk.cyan(outcome.serverName)}.`,
`Claude Code: ${chalk.cyan("/mcp")} lists the server; the skills appear as ${SG_SKILL_NAMES.map((s) => chalk.cyan(`/${s}`)).join(", ")}.`,
`Check anytime with ${chalk.cyan("add-sg-mcp status")}; remove with ${chalk.cyan("add-sg-mcp remove")}.`,
"",
"Try asking your agent:",
...SUGGESTED_PROMPTS.map((prompt) => ` ${chalk.cyan(`"${prompt}"`)}`),
].join("\n"),
"Next steps",
);
Expand Down
2 changes: 2 additions & 0 deletions tests/e2e/sg-login-tty.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -151,8 +151,10 @@ await test("login in a terminal goes on to pick agents and install", async () =>

assert.strictEqual(result.status, 0, result.output);
assert.match(result.output, /Saved credentials for demo-org/);
assert.match(result.output, /space to select\/unselect · enter to continue/);
assert.match(result.output, /Skills \(user scope\)/);
assert.match(result.output, /Next steps/);
assert.match(result.output, /Try asking your agent/);
assert.doesNotMatch(result.output, /to install the server and skills/);

const claude = JSON.parse(
Expand Down
Loading