diff --git a/CHANGELOG.md b/CHANGELOG.md index b3243b6..580410a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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. diff --git a/package.json b/package.json index 27d5ee0..1c15f5c 100644 --- a/package.json +++ b/package.json @@ -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 ", "license": "Apache-2.0", diff --git a/src/sg/commands.ts b/src/sg/commands.ts index 9e252f1..788be9f 100644 --- a/src/sg/commands.ts +++ b/src/sg/commands.ts @@ -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, @@ -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, @@ -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", ); diff --git a/tests/e2e/sg-login-tty.test.ts b/tests/e2e/sg-login-tty.test.ts index 2e4c196..ede6573 100644 --- a/tests/e2e/sg-login-tty.test.ts +++ b/tests/e2e/sg-login-tty.test.ts @@ -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(