From c25fcfda886a9040e02803219518cc15d063d2ec Mon Sep 17 00:00:00 2001 From: Josh Kodroff Date: Mon, 12 Oct 2026 19:44:51 -0400 Subject: [PATCH 1/4] Restructure Infrastructure AI docs to the standard IA Group /docs/ai/ by page type (Get started, Concepts, Guides, Integrations, Reference) like the other docs sections. Neo pages move under concepts/neo/, integrations become a top-level group, the MCP server page splits into a setup guide and a tools reference, and the Neo settings page splits out instructions and slash commands. Every moved page keeps an alias for its old URL, and moved anchors redirect to their new pages. Refs #22252 Co-Authored-By: Claude Opus 5.5 --- content/docs/ai/_index.md | 50 ++-- content/docs/ai/concepts/_index.md | 36 +++ .../index.md => concepts/agent-skills.md} | 8 +- .../index.md => concepts/cli-for-agents.md} | 13 +- content/docs/ai/{ => concepts}/neo/_index.md | 41 +-- .../_index.md => concepts/neo/automations.md} | 11 +- .../neo/code-reviews.md} | 11 +- .../neo/instructions}/custom-instructions.png | Bin .../ai/concepts/neo/instructions/index.md | 130 +++++++++ .../neo/model-providers.md} | 12 +- .../neo/neo-in-the-cli.md} | 15 +- .../neo/neo-in-your-editor.md} | 12 +- .../_index.md => concepts/neo/permissions.md} | 48 +-- .../neo/previews/index.md} | 5 +- .../neo/previews}/preview-output.png | Bin .../neo/previews}/preview-prompt.png | Bin .../neo/pull-requests/index.md} | 7 +- .../neo/pull-requests/pr-example.png | Bin .../docs/ai/concepts/neo/settings/index.md | 142 +++++++++ .../{ => concepts}/neo/settings/task-mode.png | Bin .../neo/settings/toggle-neo-access.png | Bin .../ai/concepts/neo/slash-commands/index.md | 50 ++++ .../neo/slash-commands}/slash-commands.png | Bin .../tasks/_index.md => concepts/neo/tasks.md} | 11 +- .../neo/usage-limits.md} | 9 +- content/docs/ai/get-started/_index.md | 28 ++ .../_index.md => get-started/neo.md} | 20 +- content/docs/ai/guides/_index.md | 16 + .../index.md => guides/set-up-mcp-server.md} | 82 ++---- .../docs/ai/{neo => }/integrations/_index.md | 12 +- .../cli-integrations.md} | 3 +- .../external-mcp-servers.md} | 5 +- .../_index.md => integrations/slack/index.md} | 4 +- .../slack/neo-slack-conversation.png | Bin content/docs/ai/neo/settings/_index.md | 275 ------------------ content/docs/ai/reference/_index.md | 15 + content/docs/ai/reference/mcp-server-tools.md | 63 ++++ 37 files changed, 664 insertions(+), 470 deletions(-) create mode 100644 content/docs/ai/concepts/_index.md rename content/docs/ai/{skills/index.md => concepts/agent-skills.md} (97%) rename content/docs/ai/{cli-for-agents/index.md => concepts/cli-for-agents.md} (85%) rename content/docs/ai/{ => concepts}/neo/_index.md (69%) rename content/docs/ai/{neo/automations/_index.md => concepts/neo/automations.md} (67%) rename content/docs/ai/{neo/code-reviews/_index.md => concepts/neo/code-reviews.md} (87%) rename content/docs/ai/{neo/settings => concepts/neo/instructions}/custom-instructions.png (100%) create mode 100644 content/docs/ai/concepts/neo/instructions/index.md rename content/docs/ai/{neo/model-providers/_index.md => concepts/neo/model-providers.md} (95%) rename content/docs/ai/{neo/pulumi-cli/_index.md => concepts/neo/neo-in-the-cli.md} (71%) rename content/docs/ai/{neo/editors/_index.md => concepts/neo/neo-in-your-editor.md} (81%) rename content/docs/ai/{neo/permissions/_index.md => concepts/neo/permissions.md} (70%) rename content/docs/ai/{neo/running-previews/_index.md => concepts/neo/previews/index.md} (98%) rename content/docs/ai/{neo/running-previews => concepts/neo/previews}/preview-output.png (100%) rename content/docs/ai/{neo/running-previews => concepts/neo/previews}/preview-prompt.png (100%) rename content/docs/ai/{neo/pull-requests/_index.md => concepts/neo/pull-requests/index.md} (96%) rename content/docs/ai/{ => concepts}/neo/pull-requests/pr-example.png (100%) create mode 100644 content/docs/ai/concepts/neo/settings/index.md rename content/docs/ai/{ => concepts}/neo/settings/task-mode.png (100%) rename content/docs/ai/{ => concepts}/neo/settings/toggle-neo-access.png (100%) create mode 100644 content/docs/ai/concepts/neo/slash-commands/index.md rename content/docs/ai/{neo/settings => concepts/neo/slash-commands}/slash-commands.png (100%) rename content/docs/ai/{neo/tasks/_index.md => concepts/neo/tasks.md} (91%) rename content/docs/ai/{neo/usage-limits/_index.md => concepts/neo/usage-limits.md} (89%) create mode 100644 content/docs/ai/get-started/_index.md rename content/docs/ai/{neo/get-started/_index.md => get-started/neo.md} (85%) create mode 100644 content/docs/ai/guides/_index.md rename content/docs/ai/{mcp-server/index.md => guides/set-up-mcp-server.md} (76%) rename content/docs/ai/{neo => }/integrations/_index.md (60%) rename content/docs/ai/{neo/integrations/cli/_index.md => integrations/cli-integrations.md} (98%) rename content/docs/ai/{neo/integrations/mcp/_index.md => integrations/external-mcp-servers.md} (97%) rename content/docs/ai/{neo/integrations/slack/_index.md => integrations/slack/index.md} (88%) rename content/docs/ai/{neo => }/integrations/slack/neo-slack-conversation.png (100%) delete mode 100644 content/docs/ai/neo/settings/_index.md create mode 100644 content/docs/ai/reference/_index.md create mode 100644 content/docs/ai/reference/mcp-server-tools.md diff --git a/content/docs/ai/_index.md b/content/docs/ai/_index.md index 1ba46859de13..c7be3ea57f67 100644 --- a/content/docs/ai/_index.md +++ b/content/docs/ai/_index.md @@ -16,43 +16,43 @@ menu: link_buttons: primary: label: Get Started - link: /docs/ai/neo/get-started/ + link: /docs/ai/get-started/ sections: - type: flat heading: Overview description_md: | - Pulumi is built to be driven by AI agents, including the coding agents your team already uses. Because Pulumi infrastructure is real code with a verifiable plan for every change, agents like Claude Code, Codex, Cursor, and GitHub Copilot can write, preview, and deploy it directly. The [Pulumi CLI](/docs/ai/cli-for-agents/) is designed for them: run any command with `npx pulumi`, perform one-shot resource operations with [`pulumi do`](/docs/iac/cli/direct-resource-operations/), and parse structured `--json` output. [Pulumi Agent Skills](/docs/ai/skills/) teach agents proven Pulumi workflows, the [Pulumi MCP server](/docs/ai/mcp-server/) offers the same reach over [MCP](/what-is/mcp-for-infrastructure-as-code/), and [agent accounts](/docs/administration/concepts/agent-accounts/) remove signup friction entirely. + Pulumi is built to be driven by AI agents, including the coding agents your team already uses. Because Pulumi infrastructure is real code with a verifiable plan for every change, agents like Claude Code, Codex, Cursor, and GitHub Copilot can write, preview, and deploy it directly. The [Pulumi CLI](/docs/ai/concepts/cli-for-agents/) is designed for them: run any command with `npx pulumi`, perform one-shot resource operations with [`pulumi do`](/docs/iac/cli/direct-resource-operations/), and parse structured `--json` output. [Pulumi Agent Skills](/docs/ai/concepts/agent-skills/) teach agents proven Pulumi workflows, the [Pulumi MCP server](/docs/ai/guides/set-up-mcp-server/) offers the same reach over [MCP](/what-is/mcp-for-infrastructure-as-code/), and [agent accounts](/docs/administration/concepts/agent-accounts/) remove signup friction entirely. - [Pulumi Neo](/docs/ai/neo/) is Pulumi's own infrastructure agent, built on the same foundations and adding organizational context, policy guardrails, human-in-the-loop approvals, and scheduled autonomous work. Use your favorite agent, use Neo, or use both together: Neo for long-running, governed infrastructure tasks, and your coding agent for interactive development. + [Pulumi Neo](/docs/ai/concepts/neo/) is Pulumi's own infrastructure agent, built on the same foundations and adding organizational context, policy guardrails, human-in-the-loop approvals, and scheduled autonomous work. Use your favorite agent, use Neo, or use both together: Neo for long-running, governed infrastructure tasks, and your coding agent for interactive development. - type: button-cards - heading: Bring your own agent - cards: - - icon: lightbulb - heading: Agent Skills - link: /docs/ai/skills/ - description: Teach Claude Code, Codex, Cursor, Copilot, and other agents Pulumi workflows. - - icon: terminal - heading: Pulumi CLI - link: /docs/ai/cli-for-agents/ - description: An agent-friendly CLI, from npx pulumi and pulumi do to structured JSON output. - - icon: plug - heading: MCP server - link: /docs/ai/mcp-server/ - description: Give any MCP-capable agent access to your Pulumi Cloud resources and the Registry. - - icon: rocket-launch - heading: Agent Accounts - link: /docs/administration/concepts/agent-accounts/ - description: Ephemeral Pulumi Cloud accounts provisioned automatically for AI agents. - -- type: button-cards - heading: Use Pulumi Neo + heading: Explore Infrastructure AI cards: - icon: rocket-launch + heading: Get started + link: /docs/ai/get-started/ + description: Connect the coding agent you already use to Pulumi, or enable Pulumi Neo for your organization and run your first task. + - icon: lightbulb + heading: Concepts + link: /docs/ai/concepts/ + description: How Agent Skills and the agent-friendly Pulumi CLI work, and how Neo handles tasks, permissions, pull requests, and automations. + - icon: pulumi-neo heading: Pulumi Neo - link: /docs/ai/neo/ + link: /docs/ai/concepts/neo/ description: Pulumi's purpose-built infrastructure agent. Investigates your live infrastructure, reviews and proposes changes to your IaC code, and takes on recurring maintenance. + - icon: wrench + heading: Guides + link: /docs/ai/guides/ + description: Step-by-step tasks, such as connecting Claude Code, Cursor, and other agents to the Pulumi MCP server. + - icon: plug + heading: Integrations + link: /docs/ai/integrations/ + description: Connect Neo to external MCP servers, cloud CLIs, and Slack. + - icon: books + heading: Reference + link: /docs/ai/reference/ + description: The tools and prompts the Pulumi MCP server exposes, and the pulumi neo CLI command. - type: flat heading: Have questions? diff --git a/content/docs/ai/concepts/_index.md b/content/docs/ai/concepts/_index.md new file mode 100644 index 000000000000..4829b35f87ce --- /dev/null +++ b/content/docs/ai/concepts/_index.md @@ -0,0 +1,36 @@ +--- +title: Concepts +title_tag: Infrastructure AI concepts +h1: Concepts +meta_desc: How AI agents work with Pulumi, including Agent Skills, the Pulumi CLI for agents, and Pulumi Neo's tasks, permissions, automations, and settings. +menu: + ai: + name: Concepts + parent: ai-home + identifier: ai-concepts + weight: 10 +--- + +These pages explain how AI agents work with Pulumi. To set something up, see [Guides](/docs/ai/guides/). To try it end to end, start with [Get started](/docs/ai/get-started/). + +## Agents and Pulumi + +- [Agent Skills](/docs/ai/concepts/agent-skills/): Packaged Pulumi workflows that teach coding agents how to work with Pulumi. +- [CLI for agents](/docs/ai/concepts/cli-for-agents/): How the Pulumi CLI is built for agents, from `npx pulumi` to structured `--json` output. + +## Pulumi Neo + +- [Pulumi Neo](/docs/ai/concepts/neo/): What Neo does, where you can use it, and how much autonomy you give it. + - [Tasks](/docs/ai/concepts/neo/tasks/): The unit of work in Neo, including Plan Mode, task modes, and approvals. + - [Permissions model](/docs/ai/concepts/neo/permissions/): Which identity Neo acts as on each surface, and how permission and approval modes constrain it. + - [Automations](/docs/ai/concepts/neo/automations/): Scheduled Neo tasks that deliver their results as pull requests. + - [Neo in the CLI](/docs/ai/concepts/neo/neo-in-the-cli/): Interactive Neo sessions in your terminal with your local project and credentials. + - [Neo in your editor](/docs/ai/concepts/neo/neo-in-your-editor/): Neo inside Zed, JetBrains IDEs, VS Code, and Cursor through the Agent Client Protocol. + - [Pull requests](/docs/ai/concepts/neo/pull-requests/): How Neo opens and updates pull requests through your existing review process. + - [Code reviews](/docs/ai/concepts/neo/code-reviews/): How Neo reviews pull requests against what Pulumi Cloud knows about your infrastructure. + - [Previews](/docs/ai/concepts/neo/previews/): How Neo runs `pulumi preview` to validate changes before opening a pull request. + - [Instructions](/docs/ai/concepts/neo/instructions/): Organization-wide custom instructions and per-repository `AGENTS.md` instructions. + - [Slash commands](/docs/ai/concepts/neo/slash-commands/): Built-in and custom shortcuts for proven prompts. + - [Model providers](/docs/ai/concepts/neo/model-providers/): Running Neo with your own model provider credentials. + - [Settings](/docs/ai/concepts/neo/settings/): Access controls, the default task mode, and notifications. + - [Usage limits](/docs/ai/concepts/neo/usage-limits/): Spend limits for your organization and its members. diff --git a/content/docs/ai/skills/index.md b/content/docs/ai/concepts/agent-skills.md similarity index 97% rename from content/docs/ai/skills/index.md rename to content/docs/ai/concepts/agent-skills.md index 36787dbb9f7b..8e832e96144f 100644 --- a/content/docs/ai/skills/index.md +++ b/content/docs/ai/concepts/agent-skills.md @@ -6,10 +6,12 @@ meta_desc: Learn how Pulumi Agent Skills teach Claude Code, Cursor, GitHub Copil menu: ai: name: Agent Skills - parent: ai-home - weight: 5 + parent: ai-concepts + identifier: ai-concepts-agent-skills + weight: 10 aliases: - /docs/ai/agent-skills/ +- /docs/ai/skills/ --- Pulumi Agent Skills are knowledge packages that teach AI coding assistants domain-specific Pulumi workflows. These skills help with infrastructure migrations, secret management, and code translation, teaching assistants how to work with Pulumi the way an experienced practitioner would. @@ -232,6 +234,6 @@ See the [CONTRIBUTING.md](https://github.com/pulumi/agent-skills/blob/main/CONTR ## See also -- [Pulumi MCP server](/docs/ai/mcp-server/) - give your agent live access to your Pulumi Cloud resources and the Registry +- [Pulumi MCP server](/docs/ai/guides/set-up-mcp-server/) - give your agent live access to your Pulumi Cloud resources and the Registry - [Agent accounts](/docs/administration/concepts/agent-accounts/) - ephemeral Pulumi Cloud accounts provisioned automatically for agents - [What is agentic infrastructure?](/what-is/what-is-agentic-infrastructure/) - the broader picture of AI agents operating infrastructure diff --git a/content/docs/ai/cli-for-agents/index.md b/content/docs/ai/concepts/cli-for-agents.md similarity index 85% rename from content/docs/ai/cli-for-agents/index.md rename to content/docs/ai/concepts/cli-for-agents.md index bb0722aa030d..0fa4c2529ff5 100644 --- a/content/docs/ai/cli-for-agents/index.md +++ b/content/docs/ai/concepts/cli-for-agents.md @@ -6,13 +6,16 @@ h1: The Pulumi CLI for agents menu: ai: name: CLI for agents - parent: ai-home - weight: 9 + parent: ai-concepts + identifier: ai-concepts-cli-for-agents + weight: 20 +aliases: +- /docs/ai/cli-for-agents/ --- The [Pulumi CLI](/docs/iac/cli/) is built to be driven by AI agents. Because Pulumi infrastructure is real code with a verifiable plan for every change, agents like Claude Code, Codex, Cursor, and GitHub Copilot can write, preview, and deploy it directly, with no bespoke integration required. This page collects the CLI features that make that possible. -The same features power [Pulumi Agent Skills](/docs/ai/skills/) and the [Pulumi MCP server](/docs/ai/mcp-server/), but they work with any agent that can run a shell command, so you are never locked into a particular tool. +The same features power [Pulumi Agent Skills](/docs/ai/concepts/agent-skills/) and the [Pulumi MCP server](/docs/ai/guides/set-up-mcp-server/), but they work with any agent that can run a shell command, so you are never locked into a particular tool. ## No install step: `npx pulumi` @@ -64,7 +67,7 @@ An agent that runs the CLI still needs somewhere to store state. [Agent accounts ## Next steps -- [Agent Skills](/docs/ai/skills/) — teach your agent proven Pulumi workflows it can apply on top of the CLI. -- [Pulumi MCP server](/docs/ai/mcp-server/) — give an MCP-capable agent the same reach over the [Model Context Protocol](/what-is/mcp-for-infrastructure-as-code/). +- [Agent Skills](/docs/ai/concepts/agent-skills/) — teach your agent proven Pulumi workflows it can apply on top of the CLI. +- [Pulumi MCP server](/docs/ai/guides/set-up-mcp-server/) — give an MCP-capable agent the same reach over the [Model Context Protocol](/what-is/mcp-for-infrastructure-as-code/). - [Agent accounts](/docs/administration/concepts/agent-accounts/) — ephemeral Pulumi Cloud accounts provisioned automatically for agents. - [Pulumi CLI reference](/docs/iac/cli/) — the full command set behind everything above. diff --git a/content/docs/ai/neo/_index.md b/content/docs/ai/concepts/neo/_index.md similarity index 69% rename from content/docs/ai/neo/_index.md rename to content/docs/ai/concepts/neo/_index.md index 50c3038581e1..7e056daa3fbc 100644 --- a/content/docs/ai/neo/_index.md +++ b/content/docs/ai/concepts/neo/_index.md @@ -7,12 +7,13 @@ aliases: - /docs/pulumi-cloud/neo/ - /docs/iac/neo/ - /docs/neo/ +- /docs/ai/neo/ menu: ai: name: Pulumi Neo - parent: ai-home - identifier: ai-neo - weight: 1 + parent: ai-concepts + identifier: ai-concepts-neo + weight: 50 --- Pulumi Neo is Pulumi's own infrastructure agent, powered by Anthropic's Claude @@ -29,28 +30,28 @@ open a pull request against your IaC code. - **Answers questions about your infrastructure.** Ask which resources are running an outdated provider, why a stack failed, or what a change will do, - and Neo searches your real state to answer. [Tasks](/docs/ai/neo/tasks/) + and Neo searches your real state to answer. [Tasks](/docs/ai/concepts/neo/tasks/) covers how it investigates. - **Proposes changes to your code.** When a task calls for changing infrastructure, Neo changes the IaC code rather than clicking in a console. The usual way it hands that back is a - [pull request](/docs/ai/neo/pull-requests/) describing the problem, the + [pull request](/docs/ai/concepts/neo/pull-requests/) describing the problem, the resources affected, and a preview summary, so your branch protection rules and reviewers still gate what ships. - **Runs previews before anything lands.** Neo can - [run `pulumi preview`](/docs/ai/neo/running-previews/) to validate a change, + [run `pulumi preview`](/docs/ai/concepts/neo/previews/) to validate a change, surface policy violations, and show the resource diff. - **Reviews your pull requests.** Neo - [comments on PRs](/docs/ai/neo/code-reviews/) using what Pulumi Cloud knows + [comments on PRs](/docs/ai/concepts/neo/code-reviews/) using what Pulumi Cloud knows about your running infrastructure, flagging issues inline. It never blocks the merge. - **Takes on recurring maintenance.** Turn any task into - [an automation](/docs/ai/neo/automations/) that runs on a schedule: provider + [an automation](/docs/ai/concepts/neo/automations/) that runs on a schedule: provider freshness checks, encryption and backup audits, activity digests. Some automations report what they found; others open a pull request when there's work to do. - **Applies Pulumi best practices.** Neo ships with the - [Pulumi Agent Skills](/docs/ai/skills/) catalog built in, so it already knows + [Pulumi Agent Skills](/docs/ai/concepts/agent-skills/) catalog built in, so it already knows proven workflows for components, ESC, migrations, and provider upgrades. ## Where to use Neo @@ -59,33 +60,33 @@ Neo is one agent reachable from several places. Your permissions, approval controls, and integrations carry over whichever surface you start from. - **Pulumi Cloud console.** The Neo section in Pulumi Cloud is the main home for - tasks, automations, and settings. [Get started](/docs/ai/neo/get-started/). -- **Your terminal.** Run [`pulumi neo`](/docs/ai/neo/pulumi-cli/) for an + tasks, automations, and settings. [Get started](/docs/ai/get-started/neo/). +- **Your terminal.** Run [`pulumi neo`](/docs/ai/concepts/neo/neo-in-the-cli/) for an interactive session that inherits your local setup: the CLIs you've authenticated, your environment variables and kubeconfigs, and the project you're editing. -- **Your editor.** Use [Neo in your editor's agent panel](/docs/ai/neo/editors/) +- **Your editor.** Use [Neo in your editor's agent panel](/docs/ai/concepts/neo/neo-in-your-editor/) in Zed, JetBrains IDEs, VS Code, and Cursor through the Agent Client Protocol, working on the project you have open. -- **Slack.** Mention [`@Neo`](/docs/ai/neo/integrations/slack/) in any channel +- **Slack.** Mention [`@Neo`](/docs/ai/integrations/slack/) in any channel and it replies in the thread, so you can check stack state or investigate a failure without leaving the conversation. - **Pull requests.** Neo reviews PRs automatically, and you can mention `@pulumi-neo` in a PR description, a review comment, or an issue to ask for - something specific. See [code reviews](/docs/ai/neo/code-reviews/). + something specific. See [code reviews](/docs/ai/concepts/neo/code-reviews/). - **From another AI agent.** Claude Code, Codex, Cursor, and other agents can hand long-running infrastructure work to Neo through the - [Pulumi MCP server](/docs/ai/mcp-server/) or the - [Neo handoff skill](/docs/ai/skills/), then keep working while Neo runs. + [Pulumi MCP server](/docs/ai/guides/set-up-mcp-server/) or the + [Neo handoff skill](/docs/ai/concepts/agent-skills/), then keep working while Neo runs. -Neo also reaches outward: [integrations](/docs/ai/neo/integrations/mcp/) connect +Neo also reaches outward: [integrations](/docs/ai/integrations/external-mcp-servers/) connect it to services like Datadog, PagerDuty, Linear, and Atlassian so it can pull in the context a task needs. ## How much autonomy you give it -[Plan Mode](/docs/ai/neo/tasks/#plan-mode) makes Neo agree on a plan with you -before it acts, [task modes](/docs/ai/neo/tasks/#task-modes) control which steps +[Plan Mode](/docs/ai/concepts/neo/tasks/#plan-mode) makes Neo agree on a plan with you +before it acts, [task modes](/docs/ai/concepts/neo/tasks/#task-modes) control which steps need your approval, and -[read-only mode](/docs/ai/neo/get-started/#read-only-mode) removes its ability +[read-only mode](/docs/ai/get-started/neo/#read-only-mode) removes its ability to change anything at all. Neo never has more access than you do, only less. diff --git a/content/docs/ai/neo/automations/_index.md b/content/docs/ai/concepts/neo/automations.md similarity index 67% rename from content/docs/ai/neo/automations/_index.md rename to content/docs/ai/concepts/neo/automations.md index a6dd74996156..378ff88dbc7b 100644 --- a/content/docs/ai/neo/automations/_index.md +++ b/content/docs/ai/concepts/neo/automations.md @@ -5,16 +5,17 @@ h1: Automations meta_desc: Schedule Neo tasks to run on a recurring basis with auto-approval and read-only defaults; results delivered as pull requests for review. aliases: - /docs/ai/automations/ +- /docs/ai/neo/automations/ menu: ai: name: Automations + parent: ai-concepts-neo identifier: ai-automations - parent: ai-neo - weight: 25 + weight: 20 pulumi_cloud_feature: neo-scheduled-tasks --- -Automations turn any Neo task into recurring work. Define a prompt, set a cadence, and Neo runs the task at that interval. When a run produces changes, Neo opens a [pull request](/docs/ai/neo/pull-requests/) that goes through your normal review process. +Automations turn any Neo task into recurring work. Define a prompt, set a cadence, and Neo runs the task at that interval. When a run produces changes, Neo opens a [pull request](/docs/ai/concepts/neo/pull-requests/) that goes through your normal review process. ## What you can do with an automation @@ -22,7 +23,7 @@ Provider freshness checks, encryption audits, backup audits, and activity digest ## Defaults that fit recurring work -Scheduled tasks default to two settings. Approval mode is [**auto**](/docs/ai/neo/tasks/#task-modes), so the task proceeds without waiting for human confirmation at each step. Permission mode is [**read-only**](/docs/ai/neo/permissions/#permission-mode-and-approval-mode), so the task can read state and propose changes through pull requests, but it can't write directly to your infrastructure. Settings apply in this order: +Scheduled tasks default to two settings. Approval mode is [**auto**](/docs/ai/concepts/neo/tasks/#task-modes), so the task proceeds without waiting for human confirmation at each step. Permission mode is [**read-only**](/docs/ai/concepts/neo/permissions/#permission-mode-and-approval-mode), so the task can read state and propose changes through pull requests, but it can't write directly to your infrastructure. Settings apply in this order: 1. The per-automation setting, if set 1. The org-level default @@ -36,7 +37,7 @@ You can edit or delete an automation from the **Automations** tab. Deleting an a ## How automations interact with the rest of Neo -Automations inherit the rest of Neo's context model. [Custom Instructions](/docs/ai/neo/settings/#custom-instructions) at the organization and project level apply to scheduled tasks just as they do to ad-hoc ones. [MCP integrations](/docs/ai/neo/integrations/mcp/) use the credentials of whoever configured the integration (the OAuth identity for OAuth-based integrations, the API token or key for token-based ones). [CLI integrations](/docs/ai/neo/integrations/cli/) use the credentials configured during setup. +Automations inherit the rest of Neo's context model. [Custom Instructions](/docs/ai/concepts/neo/instructions/#custom-instructions) at the organization and project level apply to scheduled tasks just as they do to ad-hoc ones. [MCP integrations](/docs/ai/integrations/external-mcp-servers/) use the credentials of whoever configured the integration (the OAuth identity for OAuth-based integrations, the API token or key for token-based ones). [CLI integrations](/docs/ai/integrations/cli-integrations/) use the credentials configured during setup. ## How permissions work diff --git a/content/docs/ai/neo/code-reviews/_index.md b/content/docs/ai/concepts/neo/code-reviews.md similarity index 87% rename from content/docs/ai/neo/code-reviews/_index.md rename to content/docs/ai/concepts/neo/code-reviews.md index da20c8702bd8..c854a9ee93f7 100644 --- a/content/docs/ai/neo/code-reviews/_index.md +++ b/content/docs/ai/concepts/neo/code-reviews.md @@ -8,12 +8,13 @@ aliases: - /docs/iac/neo/code-reviews/ - /docs/ai/code-reviews/ - /docs/ai/integrations/github/ +- /docs/ai/neo/code-reviews/ menu: ai: name: Code reviews - parent: ai-neo - weight: 35 + parent: ai-concepts-neo identifier: ai-code-reviews + weight: 40 pulumi_cloud_feature: neo-code-reviews --- @@ -35,18 +36,18 @@ Neo matches your GitHub identity to your Pulumi user. If you signed in to Pulumi ## Availability -Neo code reviews run on GitHub.com. They are not available on Azure DevOps, GitLab, or Bitbucket, where pull request comments come from the [version control integration](/docs/integrations/version-control/) rather than from Neo. GitHub Enterprise Server is not supported. Code reviews are enabled by default for organizations with [Pulumi Neo](/docs/ai/neo/get-started/#enabling-and-disabling-neo) turned on. If Neo already posts preview summaries on your pull requests, Neo code reviews replace them. +Neo code reviews run on GitHub.com. They are not available on Azure DevOps, GitLab, or Bitbucket, where pull request comments come from the [version control integration](/docs/integrations/version-control/) rather than from Neo. GitHub Enterprise Server is not supported. Code reviews are enabled by default for organizations with [Pulumi Neo](/docs/ai/get-started/neo/#enabling-and-disabling-neo) turned on. If Neo already posts preview summaries on your pull requests, Neo code reviews replace them. ## Setup -1. Enable [Pulumi Neo](/docs/ai/neo/get-started/#enabling-and-disabling-neo) for your organization. +1. Enable [Pulumi Neo](/docs/ai/get-started/neo/#enabling-and-disabling-neo) for your organization. 1. Install the [Pulumi GitHub App](/docs/integrations/version-control/github-app/) on the repositories you want Neo to analyze. 1. Confirm code reviews are enabled under **Settings** > **Neo settings** > **Code reviews**. They're on by default. 1. Grant Pulumi access to your GitHub account by completing the [individual OAuth flow](/docs/integrations/version-control/github-app/#individual-user-setup) under **Settings** > **Version control**. ## Permissions -Neo code reviews run with the same governance as any other [Neo task](/docs/ai/neo/tasks/), including the [role-based access control](/docs/administration/concepts/rbac/), guardrails, and audit logging your organization has configured. To turn them off, disable code reviews under **Settings** > **Neo settings** > **Code reviews**. +Neo code reviews run with the same governance as any other [Neo task](/docs/ai/concepts/neo/tasks/), including the [role-based access control](/docs/administration/concepts/rbac/), guardrails, and audit logging your organization has configured. To turn them off, disable code reviews under **Settings** > **Neo settings** > **Code reviews**. ## Troubleshooting diff --git a/content/docs/ai/neo/settings/custom-instructions.png b/content/docs/ai/concepts/neo/instructions/custom-instructions.png similarity index 100% rename from content/docs/ai/neo/settings/custom-instructions.png rename to content/docs/ai/concepts/neo/instructions/custom-instructions.png diff --git a/content/docs/ai/concepts/neo/instructions/index.md b/content/docs/ai/concepts/neo/instructions/index.md new file mode 100644 index 000000000000..9b7cb2a51ff9 --- /dev/null +++ b/content/docs/ai/concepts/neo/instructions/index.md @@ -0,0 +1,130 @@ +--- +title: Instructions +title_tag: Custom and repository instructions for Pulumi Neo +h1: Custom and repository instructions +meta_desc: Teach Pulumi Neo your organization's standards with custom instructions, and your project's conventions with AGENTS.md repository instructions. +menu: + ai: + name: Instructions + parent: ai-concepts-neo + identifier: ai-instructions + weight: 50 +--- + +Neo follows two kinds of standing instructions, so you don't have to repeat context in every task: custom instructions that apply across your organization, and repository instructions that apply when Neo works in a particular codebase. + +## Custom instructions + +Custom Instructions teach Neo your organization's standards, preferences, and requirements so they're applied automatically to every task. Instead of repeating context in each task, you define it once from a central location. + +### What to include + +Custom Instructions can define many things, including: + +- **Naming conventions**: How resources, stacks, and projects should be named +- **Compliance requirements**: Required tags, labels, or configurations +- **Technology preferences**: Preferred languages, frameworks, or cloud services +- **Cost guidelines**: Budget considerations or cost optimization preferences +- **Automatic actions**: Behaviors Neo should apply automatically, like including cost estimates + +### Example + +```text +All AWS resources must follow these standards: +- Naming convention: {service}-{environment}-{region} +- Required tags: environment and owner +- Use encryption at rest for all storage resources +- Always include estimated monthly costs in pull requests when proposing new infrastructure +``` + +When you ask Neo to create resources, it automatically applies your organization's standards without you needing to repeat them in every conversation. + +### Configuring custom instructions + +1. Navigate to Neo Settings in Pulumi Cloud +1. Select the "Organization instructions" tab +1. Enter your organization's standards and preferences +1. Save changes + +![Custom Instructions configuration](custom-instructions.png) + +### Custom instructions best practices + +- Keep instructions concise and focused on standards that apply across all tasks +- Update instructions as your team's practices evolve +- Test instructions in individual prompts before rolling out broadly + +### Bootstrapping repository instructions + +Neo reads `AGENTS.md` files when it enters a repository, but it needs to clone the repository first. To ensure Neo picks up your repository instructions early in every task, add a bootstrapping instruction to your Custom Instructions: + +```text +When working on a task, immediately clone the associated repository +(and any additional repositories involved) and look for an AGENTS.md +file. Follow any setup instructions it contains before proceeding +with the task. +``` + +This ensures that environment setup, git hooks, and coding standards defined in `AGENTS.md` are applied before Neo starts working. + +## Configuration precedence + +Neo applies configuration in layers, with later layers taking priority: + +1. **Custom Instructions** set organization-wide defaults that apply to every task +1. **Repository instructions** (`AGENTS.md`) add project-specific conventions when Neo enters a repository +1. **Conversation instructions** override both when you give Neo direct guidance in a task + +This layering means you can set broad standards in Custom Instructions, refine them per-repository in `AGENTS.md`, and override anything for a specific task in the conversation. + +## Repository instructions + +While Custom Instructions apply to all tasks across your organization, you can also define project-specific instructions that Neo follows when working in a particular repository. This is done through an `AGENTS.md` file placed in your repository. + +### How it works + +When Neo enters a repository, it reads the `AGENTS.md` file and follows the instructions it contains. This makes project-specific conventions explicit and consistent across all tasks in that codebase. + +Common uses for `AGENTS.md` include: + +- **Build and test commands**: How to install dependencies, run tests, and lint +- **Environment setup**: Required tool versions, environment variables, and runtime configuration +- **Git hooks**: Hook paths and setup commands that must run before committing +- **Coding standards**: Language preferences, naming conventions, and style requirements + +Use `AGENTS.md` to capture conventions that aren't enforced by linters or formatters: coding standards, naming conventions, how to run tests, or any other guidance your team needs. + +### Example + +```markdown +# Project Instructions + +## Environment setup +- Run `git config core.hooksPath .githooks` to enable git hooks +- Tool requirements: Node.js 20+, Python 3.11+ + +## Build commands +- Install dependencies: `npm install` +- Run tests: `npm test` +- Lint code: `npm run lint` + +## Git hooks +Pre-commit and pre-push hooks are located in `.githooks/`. +Always run `git config core.hooksPath .githooks` before committing. + +## Coding standards +- Use TypeScript for all new files +- Prefer async/await over callbacks +- All exported functions must have JSDoc comments +``` + +### Subdirectory support + +You can place `AGENTS.md` files in subdirectories for more specific instructions. When Neo works in a subdirectory, it reads the nearest `AGENTS.md` file, with subdirectory files taking precedence over parent files. This lets you define general project-wide conventions at the root while providing specialized guidance for specific areas of your codebase. + +### Repository instructions best practices + +- Start simple with a few key conventions, then expand as needed +- Focus on conventions that can't be enforced by automated tools +- Keep instructions actionable and specific +- Review and update as your project's practices evolve diff --git a/content/docs/ai/neo/model-providers/_index.md b/content/docs/ai/concepts/neo/model-providers.md similarity index 95% rename from content/docs/ai/neo/model-providers/_index.md rename to content/docs/ai/concepts/neo/model-providers.md index f6e2a1bd2aba..52935f5149d2 100644 --- a/content/docs/ai/neo/model-providers/_index.md +++ b/content/docs/ai/concepts/neo/model-providers.md @@ -6,9 +6,11 @@ meta_desc: Run Pulumi Neo with Anthropic's Claude models through your own Anthro menu: ai: name: Model providers (BYOK) - parent: ai-neo - weight: 52 + parent: ai-concepts-neo identifier: ai-neo-model-providers + weight: 60 +aliases: +- /docs/ai/neo/model-providers/ --- {{< pulumi-cloud "neo-byok" >}} @@ -87,6 +89,6 @@ Your model provider bills you for requests served through BYOK. Pulumi does not ## Next steps -- [Start a Neo task](/docs/ai/neo/tasks/). -- [Configure Neo settings](/docs/ai/neo/settings/). -- [Manage Neo usage limits](/docs/ai/neo/usage-limits/). +- [Start a Neo task](/docs/ai/concepts/neo/tasks/). +- [Configure Neo settings](/docs/ai/concepts/neo/settings/). +- [Manage Neo usage limits](/docs/ai/concepts/neo/usage-limits/). diff --git a/content/docs/ai/neo/pulumi-cli/_index.md b/content/docs/ai/concepts/neo/neo-in-the-cli.md similarity index 71% rename from content/docs/ai/neo/pulumi-cli/_index.md rename to content/docs/ai/concepts/neo/neo-in-the-cli.md index 2965bab78bd3..c097efaa5683 100644 --- a/content/docs/ai/neo/pulumi-cli/_index.md +++ b/content/docs/ai/concepts/neo/neo-in-the-cli.md @@ -5,15 +5,16 @@ h1: Neo in the Pulumi CLI meta_desc: Run pulumi neo to start an interactive Neo session in your terminal with access to your local project, credentials, and stacks. aliases: - /docs/ai/pulumi-cli/ +- /docs/ai/neo/pulumi-cli/ menu: ai: name: Neo in the CLI + parent: ai-concepts-neo identifier: ai-pulumi-cli - parent: ai-neo - weight: 15 + weight: 25 --- -`pulumi neo` is Neo in your terminal. Run the command from your project directory to start an interactive session. Prefer working in your IDE? Neo can also run [directly in your editor](/docs/ai/neo/editors/). +`pulumi neo` is Neo in your terminal. Run the command from your project directory to start an interactive session. Prefer working in your IDE? Neo can also run [directly in your editor](/docs/ai/concepts/neo/neo-in-your-editor/). ## What local execution unlocks @@ -25,13 +26,13 @@ You can ask Neo to investigate a failed preview, make changes to your program an The controls you have in Pulumi Cloud apply in the terminal: -- **[Approval modes](/docs/ai/neo/tasks/#task-modes)** (manual, balanced, auto) govern whether Neo asks before using tools. `manual` is the same mode the console calls **Review**. -- **[Permission modes](/docs/ai/neo/permissions/#permission-mode-and-approval-mode)** (default, read-only) govern what Neo can change -- **[Plan mode](/docs/ai/neo/tasks/#plan-mode)** lets Neo research and plan before executing (toggle with **Shift+Tab** before sending your first message) +- **[Approval modes](/docs/ai/concepts/neo/tasks/#task-modes)** (manual, balanced, auto) govern whether Neo asks before using tools. `manual` is the same mode the console calls **Review**. +- **[Permission modes](/docs/ai/concepts/neo/permissions/#permission-mode-and-approval-mode)** (default, read-only) govern what Neo can change +- **[Plan mode](/docs/ai/concepts/neo/tasks/#plan-mode)** lets Neo research and plan before executing (toggle with **Shift+Tab** before sending your first message) ## Integrations -[Integrations](/docs/ai/neo/integrations/) carry over from Pulumi Cloud. GitHub, Slack, and the rest of the [integration catalog](/docs/ai/neo/integrations/mcp/) work the same way from the terminal. +[Integrations](/docs/ai/integrations/) carry over from Pulumi Cloud. GitHub, Slack, and the rest of the [integration catalog](/docs/ai/integrations/external-mcp-servers/) work the same way from the terminal. ## Agent handoff diff --git a/content/docs/ai/neo/editors/_index.md b/content/docs/ai/concepts/neo/neo-in-your-editor.md similarity index 81% rename from content/docs/ai/neo/editors/_index.md rename to content/docs/ai/concepts/neo/neo-in-your-editor.md index ed05fddc37b4..9a8dced5ca87 100644 --- a/content/docs/ai/neo/editors/_index.md +++ b/content/docs/ai/concepts/neo/neo-in-your-editor.md @@ -6,16 +6,18 @@ meta_desc: Use Pulumi Neo directly inside Zed, JetBrains IDEs, VS Code, and Curs menu: ai: name: Neo in your editor (ACP) + parent: ai-concepts-neo identifier: ai-editors - parent: ai-neo - weight: 16 + weight: 30 +aliases: +- /docs/ai/neo/editors/ --- Neo can run directly inside your editor's agent panel. You chat with Neo, review its plans, and watch its edits in the same window as your code, with no separate terminal session or browser tab. Editors connect to Neo through the [Agent Client Protocol (ACP)](https://agentclientprotocol.com), the same open standard they use to host agents like Claude Code and Gemini CLI. Zed and JetBrains IDEs support ACP natively; VS Code and Cursor support it through an extension. -Like [Neo in the CLI](/docs/ai/neo/pulumi-cli/), an editor session runs locally and inherits your setup: your `pulumi login`, the CLIs you've authenticated, your environment variables and kubeconfigs, and the project you have open. Neo edits your local files directly, so its changes show up in your working tree as it makes them. +Like [Neo in the CLI](/docs/ai/concepts/neo/neo-in-the-cli/), an editor session runs locally and inherits your setup: your `pulumi login`, the CLIs you've authenticated, your environment variables and kubeconfigs, and the project you have open. Neo edits your local files directly, so its changes show up in your working tree as it makes them. ## Prerequisites @@ -72,8 +74,8 @@ Open the **ACP Client** panel from the Activity Bar and select **Pulumi Neo** to The controls you have elsewhere apply in your editor, exposed as session options in the agent UI: -- **[Permission modes](/docs/ai/neo/permissions/#permission-mode-and-approval-mode)** (default, read-only) govern what Neo can change -- **[Plan mode](/docs/ai/neo/tasks/#plan-mode)** lets Neo research and agree on a plan with you before executing +- **[Permission modes](/docs/ai/concepts/neo/permissions/#permission-mode-and-approval-mode)** (default, read-only) govern what Neo can change +- **[Plan mode](/docs/ai/concepts/neo/tasks/#plan-mode)** lets Neo research and agree on a plan with you before executing Tool call approvals surface in the editor's agent panel, so you review Neo's actions the same way you review those of any other agent you run there. diff --git a/content/docs/ai/neo/permissions/_index.md b/content/docs/ai/concepts/neo/permissions.md similarity index 70% rename from content/docs/ai/neo/permissions/_index.md rename to content/docs/ai/concepts/neo/permissions.md index d9c0874de15d..6490e4b98a56 100644 --- a/content/docs/ai/neo/permissions/_index.md +++ b/content/docs/ai/concepts/neo/permissions.md @@ -6,9 +6,11 @@ meta_desc: What Pulumi Neo can do, which identity it acts as on each surface, ho menu: ai: name: Permissions model - parent: ai-neo + parent: ai-concepts-neo identifier: ai-permissions - weight: 12 + weight: 15 +aliases: +- /docs/ai/neo/permissions/ --- This page is the canonical reference for Neo's permissions model: what Neo can do, which identity it acts as on each surface, what constrains it, and how to scope it down. If you are a security reviewer or platform admin working out what Neo can do, as whom, and how to constrain it, start here. @@ -19,7 +21,7 @@ Neo acts on behalf of the user invoking it, and Neo can only do what that user c - Neo operates within the acting user's [role-based access control (RBAC)](/docs/administration/concepts/rbac/) entitlements and cannot perform actions that user couldn't perform. - No privilege escalation: Neo never gets more access than the user has, only the same or less. -- Tasks are private to the user who created them. That user can [share a task](/docs/ai/neo/tasks/#ownership-and-sharing) with the rest of the organization as a read-only link: viewers see the conversation but cannot act through it, and any stack or resource it links to still enforces the viewer's own RBAC. +- Tasks are private to the user who created them. That user can [share a task](/docs/ai/concepts/neo/tasks/#ownership-and-sharing) with the rest of the organization as a read-only link: viewers see the conversation but cannot act through it, and any stack or resource it links to still enforces the viewer's own RBAC. The rest of this page describes which user Neo acts as on each surface, the ceiling that user's RBAC sets, and the controls that narrow it further. @@ -34,11 +36,11 @@ Neo is one agent reachable from the surfaces below. Whichever surface starts a t | Surface | Runs as | Notes | | :--- | :--- | :--- | | Pulumi Cloud console | The signed-in user | The main home for tasks, automations, and settings. | -| [`pulumi neo`](/docs/ai/neo/pulumi-cli/) (CLI) | Your Pulumi user, via `pulumi login` | Also inherits your local setup: authenticated CLIs, environment variables, and kubeconfigs. | -| [Slack](/docs/ai/neo/integrations/slack/) | The Pulumi user linked to your Slack identity | Requires connecting your Slack identity in Neo settings first. | -| PR mentions / [code reviews](/docs/ai/neo/code-reviews/) | The Pulumi user matched to your VCS identity | Neo matches your GitHub identity to your Pulumi user. | -| [Scheduled automations](/docs/ai/neo/automations/) | The user who scheduled the automation | RBAC is evaluated at execution time — if that user's permissions change, the new permissions apply. | -| API / [MCP](/docs/ai/neo/integrations/mcp/)-created tasks | The Pulumi user whose token created the task | The task runs with that user's RBAC, exactly as if they had started it in the console. | +| [`pulumi neo`](/docs/ai/concepts/neo/neo-in-the-cli/) (CLI) | Your Pulumi user, via `pulumi login` | Also inherits your local setup: authenticated CLIs, environment variables, and kubeconfigs. | +| [Slack](/docs/ai/integrations/slack/) | The Pulumi user linked to your Slack identity | Requires connecting your Slack identity in Neo settings first. | +| PR mentions / [code reviews](/docs/ai/concepts/neo/code-reviews/) | The Pulumi user matched to your VCS identity | Neo matches your GitHub identity to your Pulumi user. | +| [Scheduled automations](/docs/ai/concepts/neo/automations/) | The user who scheduled the automation | RBAC is evaluated at execution time — if that user's permissions change, the new permissions apply. | +| API / [MCP](/docs/ai/integrations/external-mcp-servers/)-created tasks | The Pulumi user whose token created the task | The task runs with that user's RBAC, exactly as if they had started it in the console. | These identities govern what Neo does in Pulumi Cloud. Writes to your version control provider are a separate matter: Neo authenticates as the shared app installation for its VCS interactions no matter which surface started the task (see [VCS identity per provider](#vcs-identity-per-provider)). @@ -50,7 +52,7 @@ Neo's access ceiling is the acting user's RBAC. Within that ceiling, Neo reads b | Area | What Neo can read | How Neo changes it | | :--- | :--- | :--- | -| IaC stacks and state | Stack state, resources, and outputs for stacks the user can read | Proposes IaC code changes via [pull requests](/docs/ai/neo/pull-requests/) and runs `pulumi preview` / `pulumi up` (gated by [approval mode](#permission-mode-and-approval-mode)). It does not edit state directly. | +| IaC stacks and state | Stack state, resources, and outputs for stacks the user can read | Proposes IaC code changes via [pull requests](/docs/ai/concepts/neo/pull-requests/) and runs `pulumi preview` / `pulumi up` (gated by [approval mode](#permission-mode-and-approval-mode)). It does not edit state directly. | | Environments and secrets ([ESC](/docs/esc/)) | Any environment the user can open — including decrypting secrets and minting dynamic cloud credentials | Through ESC code changes where the environment is managed in IaC; otherwise Neo edits the environment definition directly. Environments with [update approvals](/docs/esc/concepts/approvals/) force those edits into a draft that a reviewer must approve. | | Deployment settings | Settings the user can read | Through code and pull requests where the settings are managed in IaC; otherwise Neo edits them directly through the API. | | Policy packs | Packs and results the user can read | No direct management of policy packs. | @@ -64,7 +66,7 @@ Neo inherits the acting user's ESC access. If the user can [open](/docs/administ This has two consequences worth stating plainly: - **"Read-only" is scoped to Pulumi Cloud, not to your cloud accounts.** Read-only mode blocks writes in Pulumi Cloud and instructs Neo not to make modifications, but it does not technically prevent Neo from opening ESC environments or reaching the cloud accounts those environments unlock. Treat read-only as "no Pulumi Cloud mutations," not "no side effects anywhere." -- **Handling of secret values.** ESC secrets carry a weaker guarantee than [MCP integration credentials](/docs/ai/neo/integrations/mcp/), which are never exposed to the language model at all: an ESC-sourced secret value *can* reach the model if a task reads it directly. Three things limit that exposure. Neo is instructed never to run `pulumi env open` or `pulumi env get --show-secrets`, and where possible it moves secret values without reading them into context — for example, redirecting a cloud CLI's output straight to a file. Pulumi then scans the events a task produces for credential patterns and replaces what it detects with `[REDACTED]` before storing them, so detected values stay out of task history, shared task views, and Slack and pull request output. Treat that scan as defense in depth rather than a guarantee: it matches known credential shapes, not every string a secret value could take. Neo's models run through Amazon Bedrock, which does not retain prompts or completions, and an idle task's runtime session is torn down — the next turn rebuilds context from the stored, redacted history. +- **Handling of secret values.** ESC secrets carry a weaker guarantee than [MCP integration credentials](/docs/ai/integrations/external-mcp-servers/), which are never exposed to the language model at all: an ESC-sourced secret value *can* reach the model if a task reads it directly. Three things limit that exposure. Neo is instructed never to run `pulumi env open` or `pulumi env get --show-secrets`, and where possible it moves secret values without reading them into context — for example, redirecting a cloud CLI's output straight to a file. Pulumi then scans the events a task produces for credential patterns and replaces what it detects with `[REDACTED]` before storing them, so detected values stay out of task history, shared task views, and Slack and pull request output. Treat that scan as defense in depth rather than a guarantee: it matches known credential shapes, not every string a secret value could take. Neo's models run through Amazon Bedrock, which does not retain prompts or completions, and an idle task's runtime session is torn down — the next turn rebuilds context from the stored, redacted history. To constrain what Neo can reach, scope the acting user's RBAC and the ESC environments they can open. Prefer read-only cloud roles in ESC environments and broaden them deliberately. For the environments that unlock the most, [ESC open approvals](/docs/esc/concepts/approvals/) put a reviewer in front of every attempt to open them — including Neo's, since Neo opens them as you. @@ -87,7 +89,7 @@ Approval-mode gates: In the `pulumi neo` CLI and the API, the strictest approval mode is named **`manual`**, which is the same mode the console calls **Review**. The permission-mode values (`default`, `read-only`) are the same in both places. {{% /notes %}} -[Plan Mode](/docs/ai/neo/tasks/#plan-mode) is a separate, pre-execution control: it makes Neo research and agree on a plan with you before it acts, and it composes with any permission or approval mode. +[Plan Mode](/docs/ai/concepts/neo/tasks/#plan-mode) is a separate, pre-execution control: it makes Neo research and agree on a plan with you before it acts, and it composes with any permission or approval mode. ## What triggers an approval prompt @@ -104,18 +106,18 @@ Every lever that shapes what a Neo task can do, and who sets it: | Control | Values | Configured by | Where | | :--- | :--- | :--- | :--- | | Permission mode | `default` / `read-only` | User, per task | Task creation; `--permission-mode` in the CLI | -| Approval (task) mode | Review-`manual` / Balanced / Auto | User per task; org admin sets the default | Task UI; `--approval-mode` in the CLI; org default in [Settings](/docs/ai/neo/settings/#task-modes) | +| Approval (task) mode | Review-`manual` / Balanced / Auto | User per task; org admin sets the default | Task UI; `--approval-mode` in the CLI; org default in [Settings](/docs/ai/concepts/neo/settings/#task-modes) | | Plan Mode | On / off | User, per task | Task UI; **Shift+Tab** in the CLI | -| Per-automation overrides | Permission and approval mode | User who owns the automation | [Automations](/docs/ai/neo/automations/) | +| Per-automation overrides | Permission and approval mode | User who owns the automation | [Automations](/docs/ai/concepts/neo/automations/) | | Disable integrations for a task | On / off | User, per task | `--disable-integrations` in the CLI | -| Neo on/off switch and per-feature toggles | On / off | Org admin | [Settings > Neo access](/docs/ai/neo/settings/#neo-access) | -| Integration enablement and credentials | Per integration | Org admin | [Integrations](/docs/ai/neo/integrations/) | +| Neo on/off switch and per-feature toggles | On / off | Org admin | [Settings > Neo access](/docs/ai/concepts/neo/settings/#neo-access) | +| Integration enablement and credentials | Per integration | Org admin | [Integrations](/docs/ai/integrations/) | For scheduled automations, settings resolve in this order: the per-automation setting, then the org-level default, then the built-in fallback (auto approval and read-only permissions). Org-level defaults for permission and approval mode set the starting point for new tasks; a user can override them per task. -[CLI integrations](/docs/ai/neo/integrations/cli/) are a distinct, admin-controlled capability: an organization admin points a CLI at an ESC environment, and every task in the organization is then offered that integration unless the user turns it off for the task. Being offered an integration is not the same as being able to use it. Neo invokes the CLI with `pulumi env run`, as the acting user, so the integration only works for users who can open the backing environment — for anyone else, the call fails with a permission error rather than handing over the environment's credentials. Connecting an integration doesn't widen anyone's access; it makes an environment the user could already open convenient for Neo to reach. Scope each integration's ESC environment to what Neo needs — prefer a read-only cloud role and broaden it deliberately. +[CLI integrations](/docs/ai/integrations/cli-integrations/) are a distinct, admin-controlled capability: an organization admin points a CLI at an ESC environment, and every task in the organization is then offered that integration unless the user turns it off for the task. Being offered an integration is not the same as being able to use it. Neo invokes the CLI with `pulumi env run`, as the acting user, so the integration only works for users who can open the backing environment — for anyone else, the call fails with a permission error rather than handing over the environment's credentials. Connecting an integration doesn't widen anyone's access; it makes an environment the user could already open convenient for Neo to reach. Scope each integration's ESC environment to what Neo needs — prefer a read-only cloud role and broaden it deliberately. ## VCS identity per provider @@ -123,11 +125,11 @@ Neo's version control writes do not run as you. Neo authenticates as the shared | Provider | Neo writes as | Individual access | Notes | | :--- | :--- | :--- | :--- | -| GitHub.com | The shared Pulumi GitHub App for all VCS interactions (opening PRs, pushing commits, PR comments, checks); your connected GitHub account for creating repositories | **Required** to create repositories and to trigger [Neo code reviews](/docs/ai/neo/code-reviews/); optional otherwise | When a task needs individual access you don't have connected, Neo posts a nudge prompting you to grant it. | +| GitHub.com | The shared Pulumi GitHub App for all VCS interactions (opening PRs, pushing commits, PR comments, checks); your connected GitHub account for creating repositories | **Required** to create repositories and to trigger [Neo code reviews](/docs/ai/concepts/neo/code-reviews/); optional otherwise | When a task needs individual access you don't have connected, Neo posts a nudge prompting you to grant it. | | GitHub Enterprise Server | The shared app installation by default; your connected account when individual user authentication is enabled | Enabled per integration by an admin, then connected per user | Enterprise edition. Scheduled Neo tasks and API-created operations always use the shared installation. | -| Azure DevOps | The org integration for repository reads and writes; individual access lets Neo create repositories | Optional | Neo does not comment on Azure DevOps pull requests. [Neo code reviews](/docs/ai/neo/code-reviews/) are GitHub-only, and the integration's pull request comments come from Pulumi Deployments, not Neo. | -| GitLab | The org integration for repository reads and writes; individual access lets Neo create repositories | Optional | Neo does not comment on GitLab merge requests. [Neo code reviews](/docs/ai/neo/code-reviews/) are GitHub-only, and the integration's merge request comments come from Pulumi Deployments, not Neo. | -| Bitbucket | The org integration for repository reads and writes; individual access lets Neo create repositories | Optional | Neo does not comment on Bitbucket pull requests. [Neo code reviews](/docs/ai/neo/code-reviews/) are GitHub-only, and the integration's pull request comments come from Pulumi Deployments, not Neo. | +| Azure DevOps | The org integration for repository reads and writes; individual access lets Neo create repositories | Optional | Neo does not comment on Azure DevOps pull requests. [Neo code reviews](/docs/ai/concepts/neo/code-reviews/) are GitHub-only, and the integration's pull request comments come from Pulumi Deployments, not Neo. | +| GitLab | The org integration for repository reads and writes; individual access lets Neo create repositories | Optional | Neo does not comment on GitLab merge requests. [Neo code reviews](/docs/ai/concepts/neo/code-reviews/) are GitHub-only, and the integration's merge request comments come from Pulumi Deployments, not Neo. | +| Bitbucket | The org integration for repository reads and writes; individual access lets Neo create repositories | Optional | Neo does not comment on Bitbucket pull requests. [Neo code reviews](/docs/ai/concepts/neo/code-reviews/) are GitHub-only, and the integration's pull request comments come from Pulumi Deployments, not Neo. | | [Custom VCS](/docs/integrations/version-control/custom-vcs/) | The credentials from the integration's ESC environment — a shared identity belonging to whoever configured the integration | N/A | Neo can clone and push (Git and Mercurial) but cannot open pull requests or create repositories on Custom VCS servers. | ## Learn more @@ -136,7 +138,7 @@ Neo's version control writes do not run as you. Neo authenticates as the shared - [Least-privilege access](/docs/administration/guides/least-privilege/) — scoping down what a user, and so Neo, can do - [Pulumi ESC](/docs/esc/) — environments, secrets, and dynamic credentials - [ESC approvals](/docs/esc/concepts/approvals/) — review gates on opening and updating an environment -- [Tasks](/docs/ai/neo/tasks/) — Plan Mode and approval modes in depth -- [Automations](/docs/ai/neo/automations/) — scheduled tasks and their defaults -- [Integrations](/docs/ai/neo/integrations/) — MCP and CLI integration credentials +- [Tasks](/docs/ai/concepts/neo/tasks/) — Plan Mode and approval modes in depth +- [Automations](/docs/ai/concepts/neo/automations/) — scheduled tasks and their defaults +- [Integrations](/docs/ai/integrations/) — MCP and CLI integration credentials - [Version control](/docs/integrations/version-control/) — per-provider VCS setup diff --git a/content/docs/ai/neo/running-previews/_index.md b/content/docs/ai/concepts/neo/previews/index.md similarity index 98% rename from content/docs/ai/neo/running-previews/_index.md rename to content/docs/ai/concepts/neo/previews/index.md index a6b138883c38..28cfea527334 100644 --- a/content/docs/ai/neo/running-previews/_index.md +++ b/content/docs/ai/concepts/neo/previews/index.md @@ -7,12 +7,13 @@ aliases: - /docs/pulumi-cloud/neo/running-previews/ - /docs/iac/neo/running-previews/ - /docs/ai/running-previews/ +- /docs/ai/neo/running-previews/ menu: ai: name: Previews - parent: ai-neo - weight: 40 + parent: ai-concepts-neo identifier: ai-running-previews + weight: 45 --- Neo can run [preview](/docs/iac/cli/commands/pulumi_preview/) directly from Pulumi Cloud to validate proposed infrastructure changes before creating pull requests. This capability provides confidence that suggested modifications do not result in unexpected resource changes and comply with [policies](/docs/discovery-governance/concepts/policy-as-code/). diff --git a/content/docs/ai/neo/running-previews/preview-output.png b/content/docs/ai/concepts/neo/previews/preview-output.png similarity index 100% rename from content/docs/ai/neo/running-previews/preview-output.png rename to content/docs/ai/concepts/neo/previews/preview-output.png diff --git a/content/docs/ai/neo/running-previews/preview-prompt.png b/content/docs/ai/concepts/neo/previews/preview-prompt.png similarity index 100% rename from content/docs/ai/neo/running-previews/preview-prompt.png rename to content/docs/ai/concepts/neo/previews/preview-prompt.png diff --git a/content/docs/ai/neo/pull-requests/_index.md b/content/docs/ai/concepts/neo/pull-requests/index.md similarity index 96% rename from content/docs/ai/neo/pull-requests/_index.md rename to content/docs/ai/concepts/neo/pull-requests/index.md index aae950b44710..f8feb1999ec0 100644 --- a/content/docs/ai/neo/pull-requests/_index.md +++ b/content/docs/ai/concepts/neo/pull-requests/index.md @@ -7,12 +7,13 @@ aliases: - /docs/pulumi-cloud/neo/pull-requests/ - /docs/iac/neo/pull-requests/ - /docs/ai/pull-requests/ +- /docs/ai/neo/pull-requests/ menu: ai: name: Pull Requests - parent: ai-neo - weight: 30 + parent: ai-concepts-neo identifier: ai-pull-requests + weight: 35 --- Pull requests are the bridge between Neo's AI capabilities and your production infrastructure. Every change Neo proposes goes through a PR, ensuring: @@ -22,7 +23,7 @@ Pull requests are the bridge between Neo's AI capabilities and your production i - Team collaboration and knowledge sharing - Audit trail and rollback capability -On GitHub, Neo also analyzes pull requests that your team opens and leaves its feedback right in the PR. See [Neo code reviews](/docs/ai/neo/code-reviews/). +On GitHub, Neo also analyzes pull requests that your team opens and leaves its feedback right in the PR. See [Neo code reviews](/docs/ai/concepts/neo/code-reviews/). ## Prerequisites diff --git a/content/docs/ai/neo/pull-requests/pr-example.png b/content/docs/ai/concepts/neo/pull-requests/pr-example.png similarity index 100% rename from content/docs/ai/neo/pull-requests/pr-example.png rename to content/docs/ai/concepts/neo/pull-requests/pr-example.png diff --git a/content/docs/ai/concepts/neo/settings/index.md b/content/docs/ai/concepts/neo/settings/index.md new file mode 100644 index 000000000000..a18edec75acd --- /dev/null +++ b/content/docs/ai/concepts/neo/settings/index.md @@ -0,0 +1,142 @@ +--- +title: Settings +title_tag: Neo Settings +h1: Neo Settings +meta_desc: Configure Neo access controls, model providers, integrations, the default task mode, and notification preferences. +aliases: +- /docs/ai/settings/ +- /docs/ai/neo/settings/ +menu: + ai: + name: Settings + parent: ai-concepts-neo + identifier: ai-settings + weight: 65 +--- + + + +Neo can be configured at the organization, repository, and user level. Organization-level settings control default behaviors and capabilities for your team, repository-level instructions let you define project-specific conventions that Neo follows automatically, and user-level settings let each person tailor their own experience. + +## Neo access + +Neo and all of its features are enabled by default. You can turn Neo off entirely, or keep it on while disabling individual features. + +### Enable Neo for organization + +The "Enable Neo for organization" toggle is the master switch. Turning it off disables Neo everywhere, including the Neo agent, natural-language resource search, AI explanations served to the Pulumi CLI, and Neo code reviews. + +1. Navigate to Neo Settings from the Pulumi left navigation +1. Select the "General" tab +1. Toggle "Enable Neo for organization" on or off + +### Per-feature controls + +If you'd rather keep Neo on but disable specific capabilities, use the per-feature controls. Each one is enabled by default and can be turned off independently: + +- **Enable Neo agent**: The Neo agent that plans and executes infrastructure tasks +- **Enable Neo CLI explanations**: AI explanations served to the Pulumi CLI +- **Enable natural-language resource search**: Searching your resources with natural-language queries + +To disable [Neo code reviews](/docs/ai/concepts/neo/code-reviews/), select the "Code reviews" tab in Neo Settings and turn off "Enable code reviews". + +![Neo access settings](toggle-neo-access.png) + +{{% notes type="info" %}} +If Neo was previously disabled, it will need to be enabled as outlined above. +{{% /notes %}} + +To cap what your organization spends on Neo, see [Usage limits](/docs/ai/concepts/neo/usage-limits/). + +## Model providers + +{{< pulumi-cloud "neo-byok" />}} + +Use the **Model provider** tab in Neo Settings to run Neo tasks with your own model provider credentials. Neo currently supports Anthropic's Claude models. You can access these models through Anthropic, Azure Foundry, or a custom Anthropic-compatible endpoint. + +See [Bring your own model provider](/docs/ai/concepts/neo/model-providers/) for setup steps, billing behavior, and instructions to switch providers. + +## Instructions and slash commands + +The **Organization instructions** tab and the slash commands section of the **General** tab configure the standing guidance Neo follows. See [Custom and repository instructions](/docs/ai/concepts/neo/instructions/) and [Slash commands](/docs/ai/concepts/neo/slash-commands/). + +## Integrations + +Neo can connect to third-party services like issue trackers, observability platforms, and incident response tools, giving tasks the ability to query external tools alongside your infrastructure. Integrations are configured in the **Integrations** tab of Neo Settings, where administrators can enable services and provide credentials. + +See [Integrations](/docs/ai/integrations/) for the full list of available integrations, setup instructions, and credential storage details. + +## Task modes + +Task modes are presets that control what actions Neo can take automatically. Each mode represents a predefined configuration of allowed commands. New tasks start with a default mode, which users can adjust or override during the task. + +### Available modes + +Organization administrators can set the default task mode. The available modes determine how much autonomy Neo has during execution: + +- **Review mode** (default): Neo requires approval before running `pulumi preview`, running `pulumi up`, and opening a pull request +- **Balanced mode**: Neo requires approval only before running `pulumi up` +- **Auto mode**: Neo will not request any approvals + +### Configuring default task mode + +1. Navigate to Neo Settings in Pulumi Cloud +1. Select the "General" tab +1. Locate the "Task mode" section +1. Select the default mode from the dropdown +1. Save changes + +![Task mode configuration](task-mode.png) + +### Task mode best practices + +- Start with the most restrictive mode -- it's best for most organizations +- Remember, users can override the default for individual tasks when needed + +{{% notes type="info" %}} +Task modes control approvals during execution. [Plan Mode](/docs/ai/concepts/neo/tasks/#plan-mode) is a separate, opt-in feature that controls what happens before execution. You can use Plan Mode with any task mode. +{{% /notes %}} + +## Notifications + +Notifications are user-level settings: each person configures their own preferences from their account settings, independent of any organization. They alert you when Neo needs your attention on a task while the Pulumi Cloud tab is in the background. Browser and audio notifications are both off by default. + +{{% notes type="info" %}} +The "Neo settings" panel only appears for users whose organization has Neo enabled. +{{% /notes %}} + +To configure notifications: + +1. Navigate to your account settings in Pulumi Cloud +1. Locate the "Neo settings" panel +1. Turn browser notifications and audio notifications on or off independently + +Notifications fire when Neo completes a response or requests your approval before continuing. To avoid interrupting you while you're actively watching a task, Neo suppresses both notification types whenever the Pulumi Cloud tab has focus. + +### Browser notifications + +When enabled, Neo sends native browser notifications that appear in your operating system's notification area, including when the Pulumi Cloud tab is in the background or your browser is minimized. Clicking a notification brings the browser to the foreground and opens the relevant task. + +Enabling this setting prompts your browser for notification permission. If you decline the prompt, or if you have previously blocked notifications for Pulumi Cloud, the toggle reverts to off and an "Enable notifications in your browser settings" message appears. To re-enable after a block, grant the permission in your browser settings and then turn the toggle on again. + +Browser notifications also require your operating system to allow notifications for your browser. If you've enabled the toggle and granted browser permission but don't see notifications, check your OS notification settings and confirm they are enabled for your browser. + +### Audio notifications + +When enabled, Neo plays a short two-note chime when a task needs your attention. diff --git a/content/docs/ai/neo/settings/task-mode.png b/content/docs/ai/concepts/neo/settings/task-mode.png similarity index 100% rename from content/docs/ai/neo/settings/task-mode.png rename to content/docs/ai/concepts/neo/settings/task-mode.png diff --git a/content/docs/ai/neo/settings/toggle-neo-access.png b/content/docs/ai/concepts/neo/settings/toggle-neo-access.png similarity index 100% rename from content/docs/ai/neo/settings/toggle-neo-access.png rename to content/docs/ai/concepts/neo/settings/toggle-neo-access.png diff --git a/content/docs/ai/concepts/neo/slash-commands/index.md b/content/docs/ai/concepts/neo/slash-commands/index.md new file mode 100644 index 000000000000..afe987f983cf --- /dev/null +++ b/content/docs/ai/concepts/neo/slash-commands/index.md @@ -0,0 +1,50 @@ +--- +title: Slash commands +title_tag: Slash commands in Pulumi Neo +h1: Slash commands +meta_desc: Use built-in Neo slash commands and create custom commands that capture your team's proven prompts. +menu: + ai: + name: Slash commands + parent: ai-concepts-neo + identifier: ai-slash-commands + weight: 55 +--- + +Slash Commands capture proven prompts as shortcuts that anyone on your team can use. When you type `/` in a Neo conversation, you'll see available commands. Selecting a command sends the full prompt to Neo. + +## Built-in commands + +Neo includes several built-in commands for common infrastructure tasks: + +| Command | Description | +|---------|-------------| +| `/get-started` | Learn what Neo can do and how to structure effective requests | +| `/policy-issues-report` | Lists your most severe policy violations | +| `/component-version-report` | Lists components that are outdated in your private registry | +| `/provider-version-report` | Lists providers that are outdated | + +## Creating custom commands + +You can create organization-specific commands to capture your team's proven prompts: + +1. Navigate to Neo Settings in Pulumi Cloud +1. Select the "General" tab +1. Scroll to the "Slash commands" section +1. Click "Add custom slash command" +1. Enter a name and description +1. Define the prompt +1. Save the command + +![Slash Commands configuration](slash-commands.png) + +Once saved, the command is immediately available to all team members. + +## Viewing slash command instructions + +When you have selected a slash command in a new or existing Neo task, click on the highlighted command name to view the actual prompt. + +## Slash command best practices + +- Create commands for frequently-used prompts that have proven effective +- Use clear, descriptive names that indicate what the command does diff --git a/content/docs/ai/neo/settings/slash-commands.png b/content/docs/ai/concepts/neo/slash-commands/slash-commands.png similarity index 100% rename from content/docs/ai/neo/settings/slash-commands.png rename to content/docs/ai/concepts/neo/slash-commands/slash-commands.png diff --git a/content/docs/ai/neo/tasks/_index.md b/content/docs/ai/concepts/neo/tasks.md similarity index 91% rename from content/docs/ai/neo/tasks/_index.md rename to content/docs/ai/concepts/neo/tasks.md index 1c6e7f57161d..d0850ec34459 100644 --- a/content/docs/ai/neo/tasks/_index.md +++ b/content/docs/ai/concepts/neo/tasks.md @@ -7,12 +7,13 @@ aliases: - /docs/pulumi-cloud/neo/tasks/ - /docs/iac/neo/tasks/ - /docs/ai/tasks/ +- /docs/ai/neo/tasks/ menu: ai: name: Tasks - parent: ai-neo - weight: 20 + parent: ai-concepts-neo identifier: ai-tasks + weight: 10 --- Tasks are Neo's primary unit of work. Each task is a conversation where you describe what you want to accomplish, and Neo handles the infrastructure changes. @@ -64,15 +65,15 @@ Task modes are independent of Plan Mode. Task modes control what approvals Neo r Depending on the task mode, Neo seeks approval before taking certain actions like running `pulumi up` or opening a PR. -At any time, you can ask Neo to run a [pulumi preview](/docs/iac/cli/commands/pulumi_preview/). If Neo proposes code changes as part of a task, it will also request to run a preview to validate the changes. [Learn more](/docs/ai/neo/running-previews/) about Neo and previews. +At any time, you can ask Neo to run a [pulumi preview](/docs/iac/cli/commands/pulumi_preview/). If Neo proposes code changes as part of a task, it will also request to run a preview to validate the changes. [Learn more](/docs/ai/concepts/neo/previews/) about Neo and previews. ## Pull requests -If a task results in code modifications, Neo will offer to open a [pull request](/docs/ai/neo/pull-requests/) once you are satisfied with the implementation. PRs can also be modified after they have been opened. +If a task results in code modifications, Neo will offer to open a [pull request](/docs/ai/concepts/neo/pull-requests/) once you are satisfied with the implementation. PRs can also be modified after they have been opened. ## Integrations -If your organization has [integrations](/docs/ai/neo/integrations/) enabled, Neo can read from external services like issue trackers, observability platforms, and runbooks during tasks. +If your organization has [integrations](/docs/ai/integrations/) enabled, Neo can read from external services like issue trackers, observability platforms, and runbooks during tasks. ## Context, sharing, and history diff --git a/content/docs/ai/neo/usage-limits/_index.md b/content/docs/ai/concepts/neo/usage-limits.md similarity index 89% rename from content/docs/ai/neo/usage-limits/_index.md rename to content/docs/ai/concepts/neo/usage-limits.md index 7fba870d2b31..75abceaaa651 100644 --- a/content/docs/ai/neo/usage-limits/_index.md +++ b/content/docs/ai/concepts/neo/usage-limits.md @@ -5,17 +5,18 @@ h1: Neo usage limits meta_desc: "Set dollar spend limits on Pulumi Neo for your organization and members, with email alerts as usage approaches the limit." aliases: - /docs/ai/usage-limits/ +- /docs/ai/neo/usage-limits/ menu: ai: name: Usage limits - parent: ai-neo - weight: 55 + parent: ai-concepts-neo identifier: ai-usage-limits + weight: 70 --- A Neo usage limit caps what your organization spends on [Neo](/docs/ai/) in a monthly billing period. When usage reaches the limit, Neo pauses until the next period resets. You set a limit for the whole organization, and optionally a separate limit for individual members. -Requests served through [bring your own key (BYOK)](/docs/ai/neo/model-providers/) do not count toward these limits and can continue after a limit is reached. Set budgets and rate limits with your model provider to control BYOK spend. +Requests served through [bring your own key (BYOK)](/docs/ai/concepts/neo/model-providers/) do not count toward these limits and can continue after a limit is reached. Set budgets and rate limits with your model provider to control BYOK spend. ## Who can set limits @@ -71,5 +72,5 @@ Neo usage limits are available to organizations on a paid plan. The **Manage tok ## Next steps -- [Neo settings](/docs/ai/neo/settings/) — configure Neo for your organization +- [Neo settings](/docs/ai/concepts/neo/settings/) — configure Neo for your organization - [Billing managers](/docs/administration/concepts/billing-managers/) — grant billing access without full admin rights diff --git a/content/docs/ai/get-started/_index.md b/content/docs/ai/get-started/_index.md new file mode 100644 index 000000000000..a4413984c4b4 --- /dev/null +++ b/content/docs/ai/get-started/_index.md @@ -0,0 +1,28 @@ +--- +title: Get started +title_tag: Get started with Infrastructure AI +h1: Get started with Infrastructure AI +meta_desc: Start using AI agents with Pulumi, either by connecting the coding agent you already use or by enabling Pulumi Neo for your organization. +menu: + ai: + name: Get started + parent: ai-home + identifier: ai-get-started + weight: 1 +--- + +Pulumi works with the AI agent your team already uses, and with Pulumi Neo, Pulumi's own infrastructure agent. Many teams use both. Start with whichever path fits how you work. + +## Use your own agent + +Coding agents such as Claude Code, Codex, Cursor, and GitHub Copilot can write, preview, and deploy Pulumi programs directly. + +1. Install [Pulumi Agent Skills](/docs/ai/concepts/agent-skills/) so your agent follows proven Pulumi workflows. +1. [Set up the Pulumi MCP server](/docs/ai/guides/set-up-mcp-server/) to give your agent access to your stacks, resources, and the Pulumi Registry. +1. Read how the [Pulumi CLI works for agents](/docs/ai/concepts/cli-for-agents/), including `npx pulumi`, `pulumi do`, and structured `--json` output. + +## Use Pulumi Neo + +Neo is Pulumi's infrastructure agent. It works with your organization's context, policy guardrails, and approvals, and it can run long or scheduled tasks on its own. + +- [Get started with Pulumi Neo](/docs/ai/get-started/neo/): Enable Neo for your organization and run your first task. diff --git a/content/docs/ai/neo/get-started/_index.md b/content/docs/ai/get-started/neo.md similarity index 85% rename from content/docs/ai/neo/get-started/_index.md rename to content/docs/ai/get-started/neo.md index f814ab2dc0d9..4bbc330b0268 100644 --- a/content/docs/ai/neo/get-started/_index.md +++ b/content/docs/ai/get-started/neo.md @@ -6,13 +6,13 @@ meta_desc: Learn how to set up Pulumi Neo for your organization and run your fir aliases: - /docs/pulumi-cloud/neo/get-started/ - /docs/iac/neo/get-started/ -- /docs/ai/get-started/ +- /docs/ai/neo/get-started/ menu: ai: - name: Get started with Neo - parent: ai-neo + name: Pulumi Neo + parent: ai-get-started + identifier: ai-get-started-neo weight: 10 - identifier: ai-get-started --- ## Enabling and Disabling Neo @@ -33,13 +33,13 @@ To set up a VCS integration, see the [version control docs](/docs/integrations/v ## Neo's permission model -Neo operates within the conversing user's [RBAC entitlements](/docs/administration/concepts/rbac/) and cannot perform actions that the user couldn't perform themselves — there's no privilege escalation, and tasks are private to the user who created them unless they [share one](/docs/ai/neo/tasks/#ownership-and-sharing). For the full picture of which identity Neo acts as on each surface, how permission and approval modes constrain it, and how to scope its access, see [Neo's permissions model](/docs/ai/neo/permissions/). +Neo operates within the conversing user's [RBAC entitlements](/docs/administration/concepts/rbac/) and cannot perform actions that the user couldn't perform themselves — there's no privilege escalation, and tasks are private to the user who created them unless they [share one](/docs/ai/concepts/neo/tasks/#ownership-and-sharing). For the full picture of which identity Neo acts as on each surface, how permission and approval modes constrain it, and how to scope its access, see [Neo's permissions model](/docs/ai/concepts/neo/permissions/). ### Read-only mode When you create a task, you can run Neo with your full permissions ("Use my permissions", the default) or in read-only mode. Read-only mode takes your existing permissions and removes the ability to trigger writes in Pulumi Cloud: Neo can still read state, run previews, write and refactor code, and open pull requests, but it can't trigger deployments or other Pulumi Cloud write operations directly. Neo never gets more access than you have, only less. -Read-only is scoped to Pulumi Cloud. It does not, on its own, prevent Neo from opening [ESC](/docs/esc/) environments you can open or reaching the cloud accounts those environments unlock — see [ESC, secrets, and downstream cloud access](/docs/ai/neo/permissions/#esc-secrets-and-downstream-cloud-access). +Read-only is scoped to Pulumi Cloud. It does not, on its own, prevent Neo from opening [ESC](/docs/esc/) environments you can open or reaching the cloud accounts those environments unlock — see [ESC, secrets, and downstream cloud access](/docs/ai/concepts/neo/permissions/#esc-secrets-and-downstream-cloud-access). ## Quick Start Guide @@ -56,7 +56,7 @@ Neo is included on the Essentials, Pro, and Enterprise editions and is on by def Each conversation with Neo is called a "task" - a contained unit of work where Neo helps you accomplish a specific infrastructure goal. -Let's run a simple infrastructure [task](/docs/ai/neo/tasks/) to see Neo in action +Let's run a simple infrastructure [task](/docs/ai/concepts/neo/tasks/) to see Neo in action 1. Start with a read-only analysis task by prompting Neo: @@ -79,11 +79,11 @@ Let's run a simple infrastructure [task](/docs/ai/neo/tasks/) to see Neo in acti - Ask for confirmation before making changes - Generate the necessary code modifications - - Request approval before opening a [pull request](/docs/ai/neo/pull-requests/) - - Create a [PR](/docs/ai/neo/pull-requests/) with clear documentation of the changes + - Request approval before opening a [pull request](/docs/ai/concepts/neo/pull-requests/) + - Create a [PR](/docs/ai/concepts/neo/pull-requests/) with clear documentation of the changes ## Considerations and Limitations -- Changes go through code, deployments, and APIs - Where your Pulumi Cloud configuration (deployment settings, stack configuration, environment definitions) is managed in IaC, Neo changes it through code and pull requests. Where it isn't, Neo can edit it directly through the Pulumi Cloud APIs. Neo can also run deployments (`pulumi up`) and, where it has access, cloud CLI operations, so its effects reach beyond code. See [Neo's permissions model](/docs/ai/neo/permissions/) for the full picture. +- Changes go through code, deployments, and APIs - Where your Pulumi Cloud configuration (deployment settings, stack configuration, environment definitions) is managed in IaC, Neo changes it through code and pull requests. Where it isn't, Neo can edit it directly through the Pulumi Cloud APIs. Neo can also run deployments (`pulumi up`) and, where it has access, cloud CLI operations, so its effects reach beyond code. See [Neo's permissions model](/docs/ai/concepts/neo/permissions/) for the full picture. - Creating repositories requires individual access - Neo creates repositories as your own connected version control account, not as the shared Pulumi app, so you must [grant individual access](/docs/integrations/version-control/github-app/#individual-user-setup) to your provider first. Custom VCS servers do not support repository creation at all. - Cannot Create New Projects - Neo cannot initialize new Pulumi projects. It can only work within existing projects that are already set up. diff --git a/content/docs/ai/guides/_index.md b/content/docs/ai/guides/_index.md new file mode 100644 index 000000000000..9412ee2ad620 --- /dev/null +++ b/content/docs/ai/guides/_index.md @@ -0,0 +1,16 @@ +--- +title: Guides +title_tag: Infrastructure AI guides +h1: Guides +meta_desc: Task-oriented guides for using AI agents with Pulumi, including connecting your agent to the Pulumi MCP server. +menu: + ai: + name: Guides + parent: ai-home + identifier: ai-guides + weight: 25 +--- + +These guides walk through common tasks for using AI agents with Pulumi. + +- [Set up the MCP server](/docs/ai/guides/set-up-mcp-server/): Connect Claude Code, Cursor, Windsurf, and other agents to Pulumi Cloud and the Pulumi Registry. diff --git a/content/docs/ai/mcp-server/index.md b/content/docs/ai/guides/set-up-mcp-server.md similarity index 76% rename from content/docs/ai/mcp-server/index.md rename to content/docs/ai/guides/set-up-mcp-server.md index bfc71fada90d..4c56aeb1fb1f 100644 --- a/content/docs/ai/mcp-server/index.md +++ b/content/docs/ai/guides/set-up-mcp-server.md @@ -5,22 +5,35 @@ title: MCP server h1: Pulumi Model Context Protocol server menu: ai: - name: MCP server - parent: ai-home - weight: 8 + name: Set up the MCP server + parent: ai-guides + identifier: ai-guides-mcp-server + weight: 10 aliases: - /docs/iac/using-pulumi/mcp-server/ - /docs/iac/guides/mcp-server.md - /docs/iac/using-pulumi/mcp-server/index/ - /docs/iac/guides/ai-integration/mcp-server/ +- /docs/ai/mcp-server/ --- -The Pulumi [Model Context Protocol (MCP)](https://modelcontextprotocol.io) server gives the AI agent you already use access to Pulumi. Through it, an agent can list your stacks, search your resources, check policy violations, look up resource schemas in the Pulumi Registry, and hand tasks to [Pulumi Neo](/docs/ai/neo/). For background on MCP in infrastructure work, see [MCP for infrastructure as code](/what-is/mcp-for-infrastructure-as-code/). + + +The Pulumi [Model Context Protocol (MCP)](https://modelcontextprotocol.io) server gives the AI agent you already use access to Pulumi. Through it, an agent can list your stacks, search your resources, check policy violations, look up resource schemas in the Pulumi Registry, and hand tasks to [Pulumi Neo](/docs/ai/concepts/neo/). For background on MCP in infrastructure work, see [MCP for infrastructure as code](/what-is/mcp-for-infrastructure-as-code/). Pulumi hosts the server at `https://mcp.ai.pulumi.com/mcp`, so there is nothing to install or run locally. > [!INFO] -> This page is about connecting your own AI agent to Pulumi. For the opposite direction, connecting Neo to other services' MCP servers (Jira, Datadog, and others), see [External MCP servers](/docs/ai/neo/integrations/mcp/). +> This page is about connecting your own AI agent to Pulumi. For the opposite direction, connecting Neo to other services' MCP servers (Jira, Datadog, and others), see [External MCP servers](/docs/ai/integrations/external-mcp-servers/). ## Configuration @@ -147,60 +160,15 @@ Most of the server's tools only read data, and the server itself never runs `pul | Registry tools, `deploy-to-aws`, and all prompts | Any Pulumi account | None. They return schemas and instructions that your agent's own model works with. | | `get-stacks`, `get-users`, `get-policy-violations` | Any Pulumi Cloud organization | None | | `resource-search` | [Resource search](/docs/discovery-governance/concepts/discovery/querying-resources/), available in {{< pulumi-cloud-editions "resource-search" >}} | Included in your edition | -| `neo-bridge` | [Pulumi Neo](/docs/ai/neo/), available in {{< pulumi-cloud-editions "neo-integrations" >}} | Neo usage is billed to your organization | +| `neo-bridge` | [Pulumi Neo](/docs/ai/concepts/neo/), available in {{< pulumi-cloud-editions "neo-integrations" >}} | Neo usage is billed to your organization | -`neo-bridge` is the tool that can cost money. Each task it starts, and each message or approval it sends, runs Neo in Pulumi Cloud, which counts against your organization's Neo usage as it would in the Pulumi Cloud console. Approving a Neo request can also let Neo change infrastructure or open pull requests. Admins can cap that spend with [Neo usage limits](/docs/ai/neo/usage-limits/); see [pricing](/pricing/) for rates. +`neo-bridge` is the tool that can cost money. Each task it starts, and each message or approval it sends, runs Neo in Pulumi Cloud, which counts against your organization's Neo usage as it would in the Pulumi Cloud console. Approving a Neo request can also let Neo change infrastructure or open pull requests. Admins can cap that spend with [Neo usage limits](/docs/ai/concepts/neo/usage-limits/); see [pricing](/pricing/) for rates. To keep an agent from starting Neo work, deny `neo-bridge` in your agent's tool permissions. Restricting the token's role isn't enough on its own to prevent Neo tasks. In Claude Code, add `mcp__pulumi__neo-bridge` to `permissions.deny` in `settings.json`; in Cursor, turn the tool off under **Tools & MCP**. -## Tools - -You don't call these tools directly: describe what you want and your agent picks the tool. The names matter when your agent asks you to approve a tool call and when you allow or deny tools in its settings. - -### Pulumi Cloud - -| Tool | Description | -|---|---| -| `get-stacks` | List the stacks in your organization. | -| `resource-search` | Search resources across all stacks using [resource search queries](/docs/discovery-governance/concepts/discovery/querying-resources/), such as `package:aws` or `-.tags:` (resources without tags). | -| `get-policy-violations` | List [policy as code](/docs/discovery-governance/concepts/policy-as-code/) violations for your stacks. | -| `get-users` | List the members of your organization and their roles. | - -### Neo - -| Tool | Description | -|---|---| -| `neo-bridge` | Start a Neo task, send it follow-up messages, and approve or reject its requests. Returns a link to the task in the Pulumi Cloud console. | -| `neo-get-tasks` | List your organization's Neo tasks and their status. | -| `neo-continue-task` | Check the status of an existing task and read its latest events. | -| `neo-reset-conversation` | Clear the server's tracked state for a task, or for all tasks. | - -### Pulumi Registry - -| Tool | Description | -|---|---| -| `list-resources` | List the resource types in a provider or module. | -| `list-functions` | List the functions in a provider or module. | -| `get-resource` | Get a resource's properties and documentation. | -| `get-function` | Get a function's inputs, outputs, and documentation. | -| `get-type` | Get the JSON schema for a type reference. | - -### Code generation - -| Tool | Description | -|---|---| -| `deploy-to-aws` | Return step-by-step instructions the agent follows to analyze your application and write Pulumi code that deploys it to AWS. | - -## Prompts - -Prompts are reusable instructions your agent can load, usually from a slash-command or prompt menu: +## Tools and prompts -- `deploy-to-aws`: deploy application code to AWS by generating a Pulumi program. -- `convert-terraform-to-typescript`: convert Terraform HCL to a Pulumi TypeScript program. -- `cdk-migration-plan`: plan a migration from the AWS CDK to Pulumi. -- `cdk-migration-automated`: migrate a CDK app to Pulumi with automated conversion. -- `cdk-migration-manual`: migrate a CDK app to Pulumi by hand. -- `cdk-migration-troubleshoot`: troubleshoot a CDK-to-Pulumi migration. +The server exposes tools for Pulumi Cloud, Neo, the Pulumi Registry, and code generation, plus reusable prompts for deployment and migration work. You don't call the tools directly: describe what you want and your agent picks the tool. For the full list, see [MCP server tools and prompts](/docs/ai/reference/mcp-server-tools/). ## Example requests @@ -222,12 +190,12 @@ Prompts are reusable instructions your agent can load, usually from a slash-comm **A tool reports "Quota limit exceeded" or "Forbidden".** A quota error usually means the feature isn't available in your organization's edition; see [Costs and edition requirements](#costs-and-edition-requirements). "Forbidden" means the token's role lacks permission; see [Choose a token](#choose-a-token). -**Neo tasks don't start.** Check that Neo is enabled for your organization and that it hasn't reached its [usage limit](/docs/ai/neo/usage-limits/). +**Neo tasks don't start.** Check that Neo is enabled for your organization and that it hasn't reached its [usage limit](/docs/ai/concepts/neo/usage-limits/). ## Next steps -- [Pulumi Agent Skills](/docs/ai/skills/): teach your agent proven Pulumi workflows. -- [Pulumi Neo](/docs/ai/neo/): Pulumi's infrastructure agent. +- [Pulumi Agent Skills](/docs/ai/concepts/agent-skills/): teach your agent proven Pulumi workflows. +- [Pulumi Neo](/docs/ai/concepts/neo/): Pulumi's infrastructure agent. - [Agent accounts](/docs/administration/concepts/agent-accounts/): Pulumi Cloud accounts that agents provision for themselves. - [Access tokens](/docs/administration/concepts/access-tokens/): personal, organization, and team tokens. - [What is agentic infrastructure?](/what-is/what-is-agentic-infrastructure/) diff --git a/content/docs/ai/neo/integrations/_index.md b/content/docs/ai/integrations/_index.md similarity index 60% rename from content/docs/ai/neo/integrations/_index.md rename to content/docs/ai/integrations/_index.md index 227305622849..179a3a41dd7c 100644 --- a/content/docs/ai/neo/integrations/_index.md +++ b/content/docs/ai/integrations/_index.md @@ -4,29 +4,29 @@ title_tag: Neo Integrations h1: Neo Integrations meta_desc: Neo integrations connect the agent to MCP context sources, cloud CLIs, GitHub, and Slack. aliases: -- /docs/ai/integrations/ +- /docs/ai/neo/integrations/ menu: ai: name: Integrations - parent: ai-neo - weight: 45 + parent: ai-home identifier: ai-integrations + weight: 28 --- Neo on its own knows about your infrastructure footprint: your code, your stacks, your state. Most of what your team actually does happens elsewhere, in the systems you use to plan, communicate, and operate. Integrations bridge that gap in two ways: by connecting Neo to those external systems, and by letting you reach Neo from where you already work. -[MCP integrations](/docs/ai/neo/integrations/mcp/) and [CLI integrations](/docs/ai/neo/integrations/cli/) handle the first part. MCP brings context in from issue trackers, observability platforms, runbook wikis, and on-call tools. CLI integrations cover what MCP doesn't reach, calling out to cloud-provider CLIs against credentials managed in [Pulumi ESC](/docs/esc/). [GitHub](/docs/ai/neo/code-reviews/) and [Slack](/docs/ai/neo/integrations/slack/) handle the second: mention Neo from a PR thread or a Slack channel to start a task without switching to the Pulumi Cloud console. +[MCP integrations](/docs/ai/integrations/external-mcp-servers/) and [CLI integrations](/docs/ai/integrations/cli-integrations/) handle the first part. MCP brings context in from issue trackers, observability platforms, runbook wikis, and on-call tools. CLI integrations cover what MCP doesn't reach, calling out to cloud-provider CLIs against credentials managed in [Pulumi ESC](/docs/esc/). [GitHub](/docs/ai/concepts/neo/code-reviews/) and [Slack](/docs/ai/integrations/slack/) handle the second: mention Neo from a PR thread or a Slack channel to start a task without switching to the Pulumi Cloud console. All integrations are configured at the organization level by an administrator. Once enabled, they're available to every Neo task in the organization. diff --git a/content/docs/ai/neo/integrations/cli/_index.md b/content/docs/ai/integrations/cli-integrations.md similarity index 98% rename from content/docs/ai/neo/integrations/cli/_index.md rename to content/docs/ai/integrations/cli-integrations.md index 6961e47511ea..618d5a87c5b2 100644 --- a/content/docs/ai/neo/integrations/cli/_index.md +++ b/content/docs/ai/integrations/cli-integrations.md @@ -5,6 +5,7 @@ h1: CLI Integrations meta_desc: Give Neo scoped access to cloud CLIs (aws, gcloud, az, kubectl) using credentials managed by Pulumi ESC. aliases: - /docs/ai/integrations/cli/ +- /docs/ai/neo/integrations/cli/ menu: ai: name: CLI Integrations @@ -71,7 +72,7 @@ The [Kubernetes Cluster Access](/docs/esc/guides/integrate-with/kubernetes-clust ## Setting up a CLI integration -CLI integrations are configured by an organization administrator and are offered to every Neo task in the organization once enabled. Using one still takes the acting user's own access: Neo invokes the CLI with `pulumi env run`, as that user, so an integration works only for users who can open the backing ESC environment. Connecting an integration doesn't grant anyone access they didn't already have — see [Neo's permissions model](/docs/ai/neo/permissions/). +CLI integrations are configured by an organization administrator and are offered to every Neo task in the organization once enabled. Using one still takes the acting user's own access: Neo invokes the CLI with `pulumi env run`, as that user, so an integration works only for users who can open the backing ESC environment. Connecting an integration doesn't grant anyone access they didn't already have — see [Neo's permissions model](/docs/ai/concepts/neo/permissions/). ### 1. Create the ESC environment diff --git a/content/docs/ai/neo/integrations/mcp/_index.md b/content/docs/ai/integrations/external-mcp-servers.md similarity index 97% rename from content/docs/ai/neo/integrations/mcp/_index.md rename to content/docs/ai/integrations/external-mcp-servers.md index 8831601b68ad..6925497214e6 100644 --- a/content/docs/ai/neo/integrations/mcp/_index.md +++ b/content/docs/ai/integrations/external-mcp-servers.md @@ -5,6 +5,7 @@ h1: External MCP Servers meta_desc: Connect Neo to external services through Model Context Protocol servers, bringing issue tracker, observability, and runbook context into Neo tasks. aliases: - /docs/ai/integrations/mcp/ +- /docs/ai/neo/integrations/mcp/ menu: ai: name: External MCP servers @@ -13,10 +14,10 @@ menu: identifier: ai-integrations-mcp --- -MCP integrations connect Neo to external services that expose a [Model Context Protocol](https://modelcontextprotocol.io/) server — the same open standard covered in [MCP for infrastructure as code](/what-is/mcp-for-infrastructure-as-code/). Once connected, Neo can use those services as tools during a [task](/docs/ai/neo/tasks/), with credentials managed centrally in Pulumi Cloud. +MCP integrations connect Neo to external services that expose a [Model Context Protocol](https://modelcontextprotocol.io/) server — the same open standard covered in [MCP for infrastructure as code](/what-is/mcp-for-infrastructure-as-code/). Once connected, Neo can use those services as tools during a [task](/docs/ai/concepts/neo/tasks/), with credentials managed centrally in Pulumi Cloud. > [!INFO] -> This page is about connecting Neo to other services' MCP servers. To connect your own AI agent (Claude Code, Cursor, and others) to Pulumi, see the [Pulumi MCP server](/docs/ai/mcp-server/). +> This page is about connecting Neo to other services' MCP servers. To connect your own AI agent (Claude Code, Cursor, and others) to Pulumi, see the [Pulumi MCP server](/docs/ai/guides/set-up-mcp-server/). MCP integrations are configured at the organization level by an administrator. Once enabled, they are available to all Neo tasks in the organization. diff --git a/content/docs/ai/neo/integrations/slack/_index.md b/content/docs/ai/integrations/slack/index.md similarity index 88% rename from content/docs/ai/neo/integrations/slack/_index.md rename to content/docs/ai/integrations/slack/index.md index 0eb38c5e27b9..12eb5e2995f4 100644 --- a/content/docs/ai/neo/integrations/slack/_index.md +++ b/content/docs/ai/integrations/slack/index.md @@ -4,7 +4,7 @@ title_tag: Neo Slack Integration h1: Slack Integration meta_desc: Mention @Neo in Slack channels to bring Neo into your team conversations. aliases: -- /docs/ai/integrations/slack/ +- /docs/ai/neo/integrations/slack/ menu: ai: name: Slack @@ -14,7 +14,7 @@ menu: pulumi_cloud_feature: neo-slack --- -Mention `@Neo` in any channel where Neo has been added to start a Neo [task](/docs/ai/neo/tasks/) without leaving Slack. The response lands in the same thread, and follow-up messages continue the conversation, so the full exchange stays where the discussion is already happening. +Mention `@Neo` in any channel where Neo has been added to start a Neo [task](/docs/ai/concepts/neo/tasks/) without leaving Slack. The response lands in the same thread, and follow-up messages continue the conversation, so the full exchange stays where the discussion is already happening. ## What you can do with `@Neo` diff --git a/content/docs/ai/neo/integrations/slack/neo-slack-conversation.png b/content/docs/ai/integrations/slack/neo-slack-conversation.png similarity index 100% rename from content/docs/ai/neo/integrations/slack/neo-slack-conversation.png rename to content/docs/ai/integrations/slack/neo-slack-conversation.png diff --git a/content/docs/ai/neo/settings/_index.md b/content/docs/ai/neo/settings/_index.md deleted file mode 100644 index 550dcf5c5074..000000000000 --- a/content/docs/ai/neo/settings/_index.md +++ /dev/null @@ -1,275 +0,0 @@ ---- -title: Settings -title_tag: Neo Settings -h1: Neo Settings -meta_desc: Configure Neo instructions, model providers, integrations, access controls, task modes, and notification preferences. -aliases: -- /docs/ai/settings/ -menu: - ai: - name: Settings - parent: ai-neo - weight: 50 - identifier: ai-settings ---- - -Neo can be configured at the organization, repository, and user level. Organization-level settings control default behaviors and capabilities for your team, repository-level instructions let you define project-specific conventions that Neo follows automatically, and user-level settings let each person tailor their own experience. - -## Neo access - -Neo and all of its features are enabled by default. You can turn Neo off entirely, or keep it on while disabling individual features. - -### Enable Neo for organization - -The "Enable Neo for organization" toggle is the master switch. Turning it off disables Neo everywhere, including the Neo agent, natural-language resource search, AI explanations served to the Pulumi CLI, and Neo code reviews. - -1. Navigate to Neo Settings from the Pulumi left navigation -1. Select the "General" tab -1. Toggle "Enable Neo for organization" on or off - -### Per-feature controls - -If you'd rather keep Neo on but disable specific capabilities, use the per-feature controls. Each one is enabled by default and can be turned off independently: - -- **Enable Neo agent**: The Neo agent that plans and executes infrastructure tasks -- **Enable Neo CLI explanations**: AI explanations served to the Pulumi CLI -- **Enable natural-language resource search**: Searching your resources with natural-language queries - -To disable [Neo code reviews](/docs/ai/neo/code-reviews/), select the "Code reviews" tab in Neo Settings and turn off "Enable code reviews". - -![Neo access settings](toggle-neo-access.png) - -{{% notes type="info" %}} -If Neo was previously disabled, it will need to be enabled as outlined above. -{{% /notes %}} - -To cap what your organization spends on Neo, see [Usage limits](/docs/ai/neo/usage-limits/). - -## Model providers - -{{< pulumi-cloud "neo-byok" />}} - -Use the **Model provider** tab in Neo Settings to run Neo tasks with your own model provider credentials. Neo currently supports Anthropic's Claude models. You can access these models through Anthropic, Azure Foundry, or a custom Anthropic-compatible endpoint. - -See [Bring your own model provider](/docs/ai/neo/model-providers/) for setup steps, billing behavior, and instructions to switch providers. - -## Custom instructions - -Custom Instructions teach Neo your organization's standards, preferences, and requirements so they're applied automatically to every task. Instead of repeating context in each task, you define it once from a central location. - -### What to include - -Custom Instructions can define many things, including: - -- **Naming conventions**: How resources, stacks, and projects should be named -- **Compliance requirements**: Required tags, labels, or configurations -- **Technology preferences**: Preferred languages, frameworks, or cloud services -- **Cost guidelines**: Budget considerations or cost optimization preferences -- **Automatic actions**: Behaviors Neo should apply automatically, like including cost estimates - -### Example - -```text -All AWS resources must follow these standards: -- Naming convention: {service}-{environment}-{region} -- Required tags: environment and owner -- Use encryption at rest for all storage resources -- Always include estimated monthly costs in pull requests when proposing new infrastructure -``` - -When you ask Neo to create resources, it automatically applies your organization's standards without you needing to repeat them in every conversation. - -### Configuring custom instructions - -1. Navigate to Neo Settings in Pulumi Cloud -1. Select the "Organization instructions" tab -1. Enter your organization's standards and preferences -1. Save changes - -![Custom Instructions configuration](custom-instructions.png) - -### Custom instructions best practices - -- Keep instructions concise and focused on standards that apply across all tasks -- Update instructions as your team's practices evolve -- Test instructions in individual prompts before rolling out broadly - -### Bootstrapping repository instructions - -Neo reads `AGENTS.md` files when it enters a repository, but it needs to clone the repository first. To ensure Neo picks up your repository instructions early in every task, add a bootstrapping instruction to your Custom Instructions: - -```text -When working on a task, immediately clone the associated repository -(and any additional repositories involved) and look for an AGENTS.md -file. Follow any setup instructions it contains before proceeding -with the task. -``` - -This ensures that environment setup, git hooks, and coding standards defined in `AGENTS.md` are applied before Neo starts working. - -## Configuration precedence - -Neo applies configuration in layers, with later layers taking priority: - -1. **Custom Instructions** set organization-wide defaults that apply to every task -1. **Repository instructions** (`AGENTS.md`) add project-specific conventions when Neo enters a repository -1. **Conversation instructions** override both when you give Neo direct guidance in a task - -This layering means you can set broad standards in Custom Instructions, refine them per-repository in `AGENTS.md`, and override anything for a specific task in the conversation. - -## Repository instructions - -While Custom Instructions apply to all tasks across your organization, you can also define project-specific instructions that Neo follows when working in a particular repository. This is done through an `AGENTS.md` file placed in your repository. - -### How it works - -When Neo enters a repository, it reads the `AGENTS.md` file and follows the instructions it contains. This makes project-specific conventions explicit and consistent across all tasks in that codebase. - -Common uses for `AGENTS.md` include: - -- **Build and test commands**: How to install dependencies, run tests, and lint -- **Environment setup**: Required tool versions, environment variables, and runtime configuration -- **Git hooks**: Hook paths and setup commands that must run before committing -- **Coding standards**: Language preferences, naming conventions, and style requirements - -Use `AGENTS.md` to capture conventions that aren't enforced by linters or formatters: coding standards, naming conventions, how to run tests, or any other guidance your team needs. - -### Example - -```markdown -# Project Instructions - -## Environment setup -- Run `git config core.hooksPath .githooks` to enable git hooks -- Tool requirements: Node.js 20+, Python 3.11+ - -## Build commands -- Install dependencies: `npm install` -- Run tests: `npm test` -- Lint code: `npm run lint` - -## Git hooks -Pre-commit and pre-push hooks are located in `.githooks/`. -Always run `git config core.hooksPath .githooks` before committing. - -## Coding standards -- Use TypeScript for all new files -- Prefer async/await over callbacks -- All exported functions must have JSDoc comments -``` - -### Subdirectory support - -You can place `AGENTS.md` files in subdirectories for more specific instructions. When Neo works in a subdirectory, it reads the nearest `AGENTS.md` file, with subdirectory files taking precedence over parent files. This lets you define general project-wide conventions at the root while providing specialized guidance for specific areas of your codebase. - -### Repository instructions best practices - -- Start simple with a few key conventions, then expand as needed -- Focus on conventions that can't be enforced by automated tools -- Keep instructions actionable and specific -- Review and update as your project's practices evolve - -## Integrations - -Neo can connect to third-party services like issue trackers, observability platforms, and incident response tools, giving tasks the ability to query external tools alongside your infrastructure. Integrations are configured in the **Integrations** tab of Neo Settings, where administrators can enable services and provide credentials. - -See [Integrations](/docs/ai/neo/integrations/) for the full list of available integrations, setup instructions, and credential storage details. - -## Slash commands - -Slash Commands capture proven prompts as shortcuts that anyone on your team can use. When you type `/` in a Neo conversation, you'll see available commands. Selecting a command sends the full prompt to Neo. - -### Built-in commands - -Neo includes several built-in commands for common infrastructure tasks: - -| Command | Description | -|---------|-------------| -| `/get-started` | Learn what Neo can do and how to structure effective requests | -| `/policy-issues-report` | Lists your most severe policy violations | -| `/component-version-report` | Lists components that are outdated in your private registry | -| `/provider-version-report` | Lists providers that are outdated | - -### Creating custom commands - -You can create organization-specific commands to capture your team's proven prompts: - -1. Navigate to Neo Settings in Pulumi Cloud -1. Select the "General" tab -1. Scroll to the "Slash commands" section -1. Click "Add custom slash command" -1. Enter a name and description -1. Define the prompt -1. Save the command - -![Slash Commands configuration](slash-commands.png) - -Once saved, the command is immediately available to all team members. - -### Viewing slash command instructions - -When you have selected a slash command in a new or existing Neo task, click on the highlighted command name to view the actual prompt. - -### Slash command best practices - -- Create commands for frequently-used prompts that have proven effective -- Use clear, descriptive names that indicate what the command does - -## Task modes - -Task modes are presets that control what actions Neo can take automatically. Each mode represents a predefined configuration of allowed commands. New tasks start with a default mode, which users can adjust or override during the task. - -### Available modes - -Organization administrators can set the default task mode. The available modes determine how much autonomy Neo has during execution: - -- **Review mode** (default): Neo requires approval before running `pulumi preview`, running `pulumi up`, and opening a pull request -- **Balanced mode**: Neo requires approval only before running `pulumi up` -- **Auto mode**: Neo will not request any approvals - -### Configuring default task mode - -1. Navigate to Neo Settings in Pulumi Cloud -1. Select the "General" tab -1. Locate the "Task mode" section -1. Select the default mode from the dropdown -1. Save changes - -![Task mode configuration](task-mode.png) - -### Task mode best practices - -- Start with the most restrictive mode -- it's best for most organizations -- Remember, users can override the default for individual tasks when needed - -{{% notes type="info" %}} -Task modes control approvals during execution. [Plan Mode](/docs/ai/neo/tasks/#plan-mode) is a separate, opt-in feature that controls what happens before execution. You can use Plan Mode with any task mode. -{{% /notes %}} - -## Notifications - -Notifications are user-level settings: each person configures their own preferences from their account settings, independent of any organization. They alert you when Neo needs your attention on a task while the Pulumi Cloud tab is in the background. Browser and audio notifications are both off by default. - -{{% notes type="info" %}} -The "Neo settings" panel only appears for users whose organization has Neo enabled. -{{% /notes %}} - -To configure notifications: - -1. Navigate to your account settings in Pulumi Cloud -1. Locate the "Neo settings" panel -1. Turn browser notifications and audio notifications on or off independently - -Notifications fire when Neo completes a response or requests your approval before continuing. To avoid interrupting you while you're actively watching a task, Neo suppresses both notification types whenever the Pulumi Cloud tab has focus. - -### Browser notifications - -When enabled, Neo sends native browser notifications that appear in your operating system's notification area, including when the Pulumi Cloud tab is in the background or your browser is minimized. Clicking a notification brings the browser to the foreground and opens the relevant task. - -Enabling this setting prompts your browser for notification permission. If you decline the prompt, or if you have previously blocked notifications for Pulumi Cloud, the toggle reverts to off and an "Enable notifications in your browser settings" message appears. To re-enable after a block, grant the permission in your browser settings and then turn the toggle on again. - -Browser notifications also require your operating system to allow notifications for your browser. If you've enabled the toggle and granted browser permission but don't see notifications, check your OS notification settings and confirm they are enabled for your browser. - -### Audio notifications - -When enabled, Neo plays a short two-note chime when a task needs your attention. diff --git a/content/docs/ai/reference/_index.md b/content/docs/ai/reference/_index.md new file mode 100644 index 000000000000..fb340014a934 --- /dev/null +++ b/content/docs/ai/reference/_index.md @@ -0,0 +1,15 @@ +--- +title: Reference +title_tag: Infrastructure AI reference +h1: Reference +meta_desc: Reference for Infrastructure AI, including the tools and prompts the Pulumi MCP server exposes and the pulumi neo CLI command. +menu: + ai: + name: Reference + parent: ai-home + identifier: ai-reference + weight: 50 +--- + +- [MCP server tools](/docs/ai/reference/mcp-server-tools/): The tools and prompts the Pulumi MCP server exposes to your agent. +- [`pulumi neo` CLI command](/docs/iac/cli/commands/pulumi_neo/): Start an interactive Neo session from your terminal. diff --git a/content/docs/ai/reference/mcp-server-tools.md b/content/docs/ai/reference/mcp-server-tools.md new file mode 100644 index 000000000000..7c3b1a6091e7 --- /dev/null +++ b/content/docs/ai/reference/mcp-server-tools.md @@ -0,0 +1,63 @@ +--- +title: MCP server tools +title_tag: Pulumi MCP server tools and prompts +h1: Pulumi MCP server tools and prompts +meta_desc: Reference for the tools and prompts the Pulumi MCP server exposes to AI agents, covering Pulumi Cloud, Neo, the Pulumi Registry, and code generation. +menu: + ai: + name: MCP server tools + parent: ai-reference + identifier: ai-reference-mcp-server-tools + weight: 10 +--- + +The [Pulumi MCP server](/docs/ai/guides/set-up-mcp-server/) exposes the following tools and prompts to your agent. For what each tool needs from your organization and what it can cost, see [Costs and edition requirements](/docs/ai/guides/set-up-mcp-server/#costs-and-edition-requirements). + +## Tools + +You don't call these tools directly: describe what you want and your agent picks the tool. The names matter when your agent asks you to approve a tool call and when you allow or deny tools in its settings. + +### Pulumi Cloud + +| Tool | Description | +|---|---| +| `get-stacks` | List the stacks in your organization. | +| `resource-search` | Search resources across all stacks using [resource search queries](/docs/discovery-governance/concepts/discovery/querying-resources/), such as `package:aws` or `-.tags:` (resources without tags). | +| `get-policy-violations` | List [policy as code](/docs/discovery-governance/concepts/policy-as-code/) violations for your stacks. | +| `get-users` | List the members of your organization and their roles. | + +### Neo + +| Tool | Description | +|---|---| +| `neo-bridge` | Start a Neo task, send it follow-up messages, and approve or reject its requests. Returns a link to the task in the Pulumi Cloud console. | +| `neo-get-tasks` | List your organization's Neo tasks and their status. | +| `neo-continue-task` | Check the status of an existing task and read its latest events. | +| `neo-reset-conversation` | Clear the server's tracked state for a task, or for all tasks. | + +### Pulumi Registry + +| Tool | Description | +|---|---| +| `list-resources` | List the resource types in a provider or module. | +| `list-functions` | List the functions in a provider or module. | +| `get-resource` | Get a resource's properties and documentation. | +| `get-function` | Get a function's inputs, outputs, and documentation. | +| `get-type` | Get the JSON schema for a type reference. | + +### Code generation + +| Tool | Description | +|---|---| +| `deploy-to-aws` | Return step-by-step instructions the agent follows to analyze your application and write Pulumi code that deploys it to AWS. | + +## Prompts + +Prompts are reusable instructions your agent can load, usually from a slash-command or prompt menu: + +- `deploy-to-aws`: deploy application code to AWS by generating a Pulumi program. +- `convert-terraform-to-typescript`: convert Terraform HCL to a Pulumi TypeScript program. +- `cdk-migration-plan`: plan a migration from the AWS CDK to Pulumi. +- `cdk-migration-automated`: migrate a CDK app to Pulumi with automated conversion. +- `cdk-migration-manual`: migrate a CDK app to Pulumi by hand. +- `cdk-migration-troubleshoot`: troubleshoot a CDK-to-Pulumi migration. From 624f166d88417d45d2c6037f38bb8f00ddcd8218 Mon Sep 17 00:00:00 2001 From: Josh Kodroff Date: Mon, 12 Oct 2026 19:44:52 -0400 Subject: [PATCH 2/4] Update links to the restructured Infrastructure AI docs Refs #22252 Co-Authored-By: Claude Opus 5.5 --- .../docs/administration/concepts/agent-accounts.md | 4 ++-- .../docs/administration/concepts/billing-managers.md | 2 +- .../administration/get-started/choose-edition.md | 2 +- .../administration/self-hosting/components/api.md | 2 +- .../concepts/discovery/querying-resources.md | 2 +- .../concepts/discovery/visual-import.md | 2 +- .../get-started/explore-resources.md | 2 +- .../docs/discovery-governance/guides/context-api.md | 2 +- content/docs/get-started/_index.md | 2 +- .../cli/direct-resource-operations/get-started.md | 2 +- content/docs/iac/comparisons/spacelift.md | 2 +- content/docs/iac/comparisons/tacos.md | 4 ++-- content/docs/iac/comparisons/terraform-cloud.md | 6 +++--- content/docs/iac/concepts/converters.md | 2 +- .../docs/iac/operations/stack-management/drift.md | 4 ++-- content/docs/install/_index.md | 2 +- content/docs/integrations/terraform/convert-hcl.md | 10 +++++----- .../version-control/azure-devops-integration.md | 2 +- .../docs/integrations/version-control/bitbucket.md | 2 +- .../docs/integrations/version-control/github-app.md | 4 ++-- content/docs/integrations/version-control/gitlab.md | 2 +- content/docs/support/faq/pulumi-cloud.md | 2 +- content/product/neo.md | 4 ++-- content/releases/agentic-infrastructure-era.md | 2 +- .../changelog/2026-06-22-neo-code-reviews.md | 2 +- .../changelog/2026-07-14-neo-usage-limits.md | 2 +- .../releases/terraform-state-backend-modules-hcl.md | 2 +- content/state-of-agentic-infrastructure/_index.md | 4 ++-- content/what-is/mcp-for-infrastructure-as-code.md | 12 ++++++------ content/what-is/what-is-agentic-infrastructure.md | 10 +++++----- content/what-is/what-is-ai-infrastructure.md | 2 +- .../what-is-an-internal-developer-platform.md | 2 +- data/glossary.toml | 4 ++-- layouts/agent-start/list.html | 2 +- layouts/index.llms.txt | 4 ++-- scripts/redirects/general-broken-links-redirects.txt | 2 +- 36 files changed, 59 insertions(+), 59 deletions(-) diff --git a/content/docs/administration/concepts/agent-accounts.md b/content/docs/administration/concepts/agent-accounts.md index 6f04e8a01504..0588176e4a9f 100644 --- a/content/docs/administration/concepts/agent-accounts.md +++ b/content/docs/administration/concepts/agent-accounts.md @@ -75,7 +75,7 @@ In these cases, the CLI uses the existing credentials. If multiple agents run on ## See also - [Pulumi Cloud accounts](/docs/administration/concepts/accounts/) -- [Pulumi Agent Skills](/docs/ai/skills/) -- [Pulumi MCP server](/docs/ai/mcp-server/) +- [Pulumi Agent Skills](/docs/ai/concepts/agent-skills/) +- [Pulumi MCP server](/docs/ai/guides/set-up-mcp-server/) - [The agentic infrastructure era](/blog/the-agentic-infrastructure-era/) (blog post) - [Direct resource operations](/docs/iac/cli/direct-resource-operations/) diff --git a/content/docs/administration/concepts/billing-managers.md b/content/docs/administration/concepts/billing-managers.md index b82400a667cb..3965bc8586d8 100644 --- a/content/docs/administration/concepts/billing-managers.md +++ b/content/docs/administration/concepts/billing-managers.md @@ -58,7 +58,7 @@ Billing Managers can be removed by any organization admin at any time. The steps ## Billing Manager Permissions -A Billing Manager has the ability to access and update billing information, and to view organization metrics, such as resource count and member count (but not member names). This includes setting [Neo usage limits](/docs/ai/neo/usage-limits/) to cap what the organization spends on Pulumi Neo. +A Billing Manager has the ability to access and update billing information, and to view organization metrics, such as resource count and member count (but not member names). This includes setting [Neo usage limits](/docs/ai/concepts/neo/usage-limits/) to cap what the organization spends on Pulumi Neo. | Resource | Permissions | | --- | --- | diff --git a/content/docs/administration/get-started/choose-edition.md b/content/docs/administration/get-started/choose-edition.md index 7a7eaa9783f5..516dbeaa79f5 100644 --- a/content/docs/administration/get-started/choose-edition.md +++ b/content/docs/administration/get-started/choose-edition.md @@ -77,7 +77,7 @@ Pay monthly with a credit card. This option provides flexibility and is ideal fo Annual commitment pricing is available on Pro and Enterprise only. Pay upfront with invoicing for a committed amount of usage. [Contact us](/contact/) to discuss commitment pricing. {{% notes type="info" %}} -Both billing options include detailed usage insights through the Billing & usage page in your organization settings. Track IaC resources, deployment minutes, ESC secrets, and download usage history. You can also set [Neo usage limits](/docs/ai/neo/usage-limits/) to cap spend on Pulumi Neo. Only organization administrators and designated [billing administrators](/docs/administration/concepts/billing-managers/) can access these pages. You'll also receive monthly usage reports via email. +Both billing options include detailed usage insights through the Billing & usage page in your organization settings. Track IaC resources, deployment minutes, ESC secrets, and download usage history. You can also set [Neo usage limits](/docs/ai/concepts/neo/usage-limits/) to cap spend on Pulumi Neo. Only organization administrators and designated [billing administrators](/docs/administration/concepts/billing-managers/) can access these pages. You'll also receive monthly usage reports via email. {{% /notes %}} ## Getting started with your chosen model diff --git a/content/docs/administration/self-hosting/components/api.md b/content/docs/administration/self-hosting/components/api.md index 34baf9663284..e579880386fc 100644 --- a/content/docs/administration/self-hosting/components/api.md +++ b/content/docs/administration/self-hosting/components/api.md @@ -249,7 +249,7 @@ If a feature needs to reach a service on the same host or private network as you | Scope | Outbound requests it covers | |---------------|------------------------------------------------------------------------------------------------------------------------------| | `ESC` | Pulumi ESC providers and rotators that call a URL you configure: Vault, Infisical, Terraform state, GitHub login, and external providers and rotators. | -| `AGENTS_BYOK` | Pulumi Neo requests to a [custom model provider](/docs/ai/neo/model-providers/). | +| `AGENTS_BYOK` | Pulumi Neo requests to a [custom model provider](/docs/ai/concepts/neo/model-providers/). | | `OIDC_ISSUER` | Registering an OIDC issuer and fetching its signing keys. | | `VCS` | Refreshing a member's GitHub Enterprise Server token when [individual user authentication](/docs/integrations/version-control/github-app/#individual-user-authentication-for-github-enterprise-server) is enabled. | | `WEBHOOKS` | Webhook delivery. | diff --git a/content/docs/discovery-governance/concepts/discovery/querying-resources.md b/content/docs/discovery-governance/concepts/discovery/querying-resources.md index 20fb77e88be9..54b2e6ef9057 100644 --- a/content/docs/discovery-governance/concepts/discovery/querying-resources.md +++ b/content/docs/discovery-governance/concepts/discovery/querying-resources.md @@ -27,7 +27,7 @@ A resource can come from more than one source: a stack might manage a bucket tha ## Ways to query - **Search queries**: Search by name, type, stack, project, or resource property, combine terms with logical operators, and group the results, for example by cloud account and region. For the syntax, see [Search resources](/docs/discovery-governance/guides/search-resources/). -- **Natural language**: Ask a question in plain language, such as "How many VPCs do I have?", and Pulumi Cloud writes the search query for you. You can also ask [Pulumi Neo](/docs/ai/neo/) questions about your resources. +- **Natural language**: Ask a question in plain language, such as "How many VPCs do I have?", and Pulumi Cloud writes the search query for you. You can also ask [Pulumi Neo](/docs/ai/concepts/neo/) questions about your resources. - **Export and API**: Download the results as CSV, or query resources from your own tools with the [Pulumi Cloud REST API](/docs/reference/cloud-rest-api/resource-search/). See [Export resource data](/docs/discovery-governance/guides/export-resource-data/). - **Relationship queries**: To follow dependencies between resources, stacks, and their consumers, use the [Context API](/docs/discovery-governance/concepts/context-api/). diff --git a/content/docs/discovery-governance/concepts/discovery/visual-import.md b/content/docs/discovery-governance/concepts/discovery/visual-import.md index 177054bb9bfd..8b1afd254d6f 100644 --- a/content/docs/discovery-governance/concepts/discovery/visual-import.md +++ b/content/docs/discovery-governance/concepts/discovery/visual-import.md @@ -19,7 +19,7 @@ Visual Import builds on the inventory that Discovery keeps for your [cloud accou 1. **You select unmanaged resources.** Visual Import lists only resources that Discovery has found and that no Pulumi stack manages. 1. **Visual Import adds related resources.** Discovery records the relationships between resources, so Visual Import can suggest the resources your selection depends on and the resources that depend on it. Importing related resources together keeps a service's infrastructure in one program. -1. **Visual Import generates code.** It writes a program in the language you choose: TypeScript, Python, Go, C#, Java, or YAML. You can have [Pulumi Neo](/docs/ai/neo/) refine the generated code, for example to use more meaningful names or to reference related resources instead of hard-coding their IDs. +1. **Visual Import generates code.** It writes a program in the language you choose: TypeScript, Python, Go, C#, Java, or YAML. You can have [Pulumi Neo](/docs/ai/concepts/neo/) refine the generated code, for example to use more meaningful names or to reference related resources instead of hard-coding their IDs. 1. **You run the program.** You add the code to a new or existing stack and run `pulumi up`. ## How resources become managed diff --git a/content/docs/discovery-governance/get-started/explore-resources.md b/content/docs/discovery-governance/get-started/explore-resources.md index 378ee8a296b2..e9dc44c63ad6 100644 --- a/content/docs/discovery-governance/get-started/explore-resources.md +++ b/content/docs/discovery-governance/get-started/explore-resources.md @@ -59,6 +59,6 @@ AI Assist is also useful during a security review. **"show me all s3 public buck type:"aws:s3/bucket:Bucket" .acl:public-read ``` -AI Assist's queries are a starting point: review them, and refine the query if it doesn't quite match what you meant. To ask broader questions about your infrastructure, you can also use [Pulumi Neo](/docs/ai/neo/). +AI Assist's queries are a starting point: review them, and refine the query if it doesn't quite match what you meant. To ask broader questions about your infrastructure, you can also use [Pulumi Neo](/docs/ai/concepts/neo/). {{< get-started-stepper >}} diff --git a/content/docs/discovery-governance/guides/context-api.md b/content/docs/discovery-governance/guides/context-api.md index fa415b1bb001..95712b47061f 100644 --- a/content/docs/discovery-governance/guides/context-api.md +++ b/content/docs/discovery-governance/guides/context-api.md @@ -31,7 +31,7 @@ Pulumi Cloud [role-based access control (RBAC)](/docs/administration/concepts/rb ## Ask questions through an AI agent -You can use [Pulumi Neo](/docs/ai/neo/), Claude Code, Cursor, Codex, or another agent that can run authenticated Pulumi CLI commands. Neo uses the Context API out of the box. To equip another agent, give it this command to fetch the current Markdown primer: +You can use [Pulumi Neo](/docs/ai/concepts/neo/), Claude Code, Cursor, Codex, or another agent that can run authenticated Pulumi CLI commands. Neo uses the Context API out of the box. To equip another agent, give it this command to fetch the current Markdown primer: ```bash pulumi api GetGraphQuerySchema diff --git a/content/docs/get-started/_index.md b/content/docs/get-started/_index.md index 0bbe12fc1d7c..7af1534bfb7d 100644 --- a/content/docs/get-started/_index.md +++ b/content/docs/get-started/_index.md @@ -71,7 +71,7 @@ Paste this prompt into your coding agent of choice to install Pulumi, configure Fetch https://www.pulumi.com/onboard.md and follow its instructions to get me started with Pulumi. {{< /copy-prompt >}} -To go further with agents, see [Agent Skills](/docs/ai/skills/), the [Pulumi MCP server](/docs/ai/mcp-server/), and [Pulumi Neo](/docs/ai/neo/), Pulumi's purpose-built infrastructure agent. +To go further with agents, see [Agent Skills](/docs/ai/concepts/agent-skills/), the [Pulumi MCP server](/docs/ai/guides/set-up-mcp-server/), and [Pulumi Neo](/docs/ai/concepts/neo/), Pulumi's purpose-built infrastructure agent. ## Learn more diff --git a/content/docs/iac/cli/direct-resource-operations/get-started.md b/content/docs/iac/cli/direct-resource-operations/get-started.md index cdc2a9ff3f62..7dfc07d78927 100644 --- a/content/docs/iac/cli/direct-resource-operations/get-started.md +++ b/content/docs/iac/cli/direct-resource-operations/get-started.md @@ -174,7 +174,7 @@ bucket-9f7f27f $ pulumi do aws:s3:Bucket delete bucket-9f7f27f --stateless --yes ``` -Keeping this same command shape and output format across all Pulumi providers makes `pulumi do` work especially well for coding agents, too. See [Pulumi CLI for agents](/docs/ai/cli-for-agents/) to learn more. +Keeping this same command shape and output format across all Pulumi providers makes `pulumi do` work especially well for coding agents, too. See [Pulumi CLI for agents](/docs/ai/concepts/cli-for-agents/) to learn more. ## Next steps diff --git a/content/docs/iac/comparisons/spacelift.md b/content/docs/iac/comparisons/spacelift.md index e4151cec141b..80b95f6b6927 100644 --- a/content/docs/iac/comparisons/spacelift.md +++ b/content/docs/iac/comparisons/spacelift.md @@ -90,7 +90,7 @@ Pulumi's [Automation API](/docs/iac/concepts/automation-api/) lets a host applic ### AI and agents -Both platforms have moved into AI-assisted infrastructure from different starting points. Spacelift's [Intelligence](https://spacelift.io/platform/intelligence) layer comprises an assistant that answers questions about your estate; [Intent](https://docs.spacelift.io/concepts/intelligence/intent), which provisions from natural language by calling cloud provider APIs directly, bypassing Terraform/OpenTofu entirely; and a hosted [MCP server](https://docs.spacelift.io/integrations/api-development-with-mcp) that applies Spacelift's policies and access controls to AI coding tools like Claude Code and Codex. Pulumi comes at it from the authoring side: because infrastructure lives in general-purpose languages, the coding agents your team already uses can read and change it directly through [Agent Skills](/docs/ai/skills/) and the [Pulumi MCP server](/docs/ai/mcp-server/), and [Pulumi Neo](/product/neo/) is a purpose-built infrastructure agent for deeper, governed automation. Use your own agent, use Neo, or use both. Either way, both keep humans and policy in the loop, and the split mirrors the rest of this comparison: Spacelift governs AI-driven changes to the tools it orchestrates, while Pulumi brings AI to authoring and managing infrastructure as code. +Both platforms have moved into AI-assisted infrastructure from different starting points. Spacelift's [Intelligence](https://spacelift.io/platform/intelligence) layer comprises an assistant that answers questions about your estate; [Intent](https://docs.spacelift.io/concepts/intelligence/intent), which provisions from natural language by calling cloud provider APIs directly, bypassing Terraform/OpenTofu entirely; and a hosted [MCP server](https://docs.spacelift.io/integrations/api-development-with-mcp) that applies Spacelift's policies and access controls to AI coding tools like Claude Code and Codex. Pulumi comes at it from the authoring side: because infrastructure lives in general-purpose languages, the coding agents your team already uses can read and change it directly through [Agent Skills](/docs/ai/concepts/agent-skills/) and the [Pulumi MCP server](/docs/ai/guides/set-up-mcp-server/), and [Pulumi Neo](/product/neo/) is a purpose-built infrastructure agent for deeper, governed automation. Use your own agent, use Neo, or use both. Either way, both keep humans and policy in the loop, and the split mirrors the rest of this comparison: Spacelift governs AI-driven changes to the tools it orchestrates, while Pulumi brings AI to authoring and managing infrastructure as code. ### Using Pulumi and Spacelift together diff --git a/content/docs/iac/comparisons/tacos.md b/content/docs/iac/comparisons/tacos.md index 80edc0a219b0..3991a5e7f070 100644 --- a/content/docs/iac/comparisons/tacos.md +++ b/content/docs/iac/comparisons/tacos.md @@ -48,7 +48,7 @@ The tools don't all cover the same ground. [HCP Terraform](https://www.hashicorp | Policy as code | [Pulumi Policies](/docs/discovery-governance/concepts/policy-as-code/) in Python, TypeScript, or Open Policy Agent Rego; open source, with [compliance packs](/docs/discovery-governance/guides/pre-built-policy-packs/) in Pulumi Cloud | Policy enforcement with Open Policy Agent Rego, or Sentinel on HCP Terraform | | Secrets management | [First-class encrypted secrets](/docs/iac/concepts/secrets/) plus [Pulumi ESC](/docs/esc/) for centralized secrets and configuration | Encrypted variables, with integrations for external secret stores | | Access control | [Pulumi Cloud](/docs/iac/concepts/pulumi-cloud/) teams, role-based access control, SSO/SAML, and audit logs | Per-scope RBAC and SSO/SAML, varying by vendor and tier | -| AI and agents | [Pulumi Neo](/product/neo/), the [Pulumi MCP server](/docs/ai/mcp-server/), and [Agent Skills](/docs/ai/skills/); author with any coding agent | Emerging and vendor-specific, such as [Spacelift Intelligence and Intent](https://spacelift.io/platform/intelligence) | +| AI and agents | [Pulumi Neo](/product/neo/), the [Pulumi MCP server](/docs/ai/guides/set-up-mcp-server/), and [Agent Skills](/docs/ai/concepts/agent-skills/); author with any coding agent | Emerging and vendor-specific, such as [Spacelift Intelligence and Intent](https://spacelift.io/platform/intelligence) | | Open source | Yes — CLI, SDKs, and providers under [Apache 2.0](https://github.com/pulumi/pulumi/blob/master/LICENSE) | Mixed — Atlantis is open source; HCP Terraform, Spacelift, env0, and Scalr are commercial | | Commercial option | [Pulumi Cloud](/docs/iac/concepts/pulumi-cloud/) | Commercial across the category, aside from self-hosted Atlantis | @@ -74,7 +74,7 @@ Teams reach for a TACOS because they already have Terraform and need to operate ### AI and agents -AI is arriving across the category. Spacelift has added [Intelligence and Intent](https://spacelift.io/platform/intelligence) for natural-language provisioning and a hosted [MCP server](https://docs.spacelift.io/integrations/api-development-with-mcp), and other vendors are moving the same way. Pulumi approaches it from the authoring side: because infrastructure is code in general-purpose languages, the coding agents your team already uses — Claude Code, Cursor, Codex — can work with it through [Agent Skills](/docs/ai/skills/) and the [Pulumi MCP server](/docs/ai/mcp-server/), and [Pulumi Neo](/product/neo/) is a purpose-built infrastructure agent for deeper, governed automation. Use your own agent, use Neo, or use both. +AI is arriving across the category. Spacelift has added [Intelligence and Intent](https://spacelift.io/platform/intelligence) for natural-language provisioning and a hosted [MCP server](https://docs.spacelift.io/integrations/api-development-with-mcp), and other vendors are moving the same way. Pulumi approaches it from the authoring side: because infrastructure is code in general-purpose languages, the coding agents your team already uses — Claude Code, Cursor, Codex — can work with it through [Agent Skills](/docs/ai/concepts/agent-skills/) and the [Pulumi MCP server](/docs/ai/guides/set-up-mcp-server/), and [Pulumi Neo](/product/neo/) is a purpose-built infrastructure agent for deeper, governed automation. Use your own agent, use Neo, or use both. ## When to use Pulumi or a TACOS diff --git a/content/docs/iac/comparisons/terraform-cloud.md b/content/docs/iac/comparisons/terraform-cloud.md index bb5e45486373..14ba8e74465b 100644 --- a/content/docs/iac/comparisons/terraform-cloud.md +++ b/content/docs/iac/comparisons/terraform-cloud.md @@ -45,7 +45,7 @@ HCP Terraform is priced by Resources Under Management (RUM), the number of resou | Resource inventory | [Pulumi Discovery](/docs/discovery-governance/) inventories cloud resources across accounts and providers, including resources not managed by any infrastructure as code tool | Explorer reports on workspaces, modules, providers, and Terraform versions across the organization | | Access control and audit | [Role-based access control](/docs/administration/concepts/rbac/), SAML SSO, SCIM, and [audit logs](/docs/administration/concepts/audit-logs/) | Team-based permissions, SSO, and audit trails | | Programmatic API | REST API, plus the [Automation API](/docs/iac/concepts/automation-api/), an SDK for driving Pulumi operations from application code | REST API, with the `go-tfe` client and the `tfe` Terraform provider | -| AI assistance | [Pulumi Neo](/docs/ai/), [Agent Skills](/docs/ai/skills/), and the [Pulumi MCP server](/docs/ai/mcp-server/) | HashiCorp publishes a Terraform MCP server for AI assistants | +| AI assistance | [Pulumi Neo](/docs/ai/), [Agent Skills](/docs/ai/concepts/agent-skills/), and the [Pulumi MCP server](/docs/ai/guides/set-up-mcp-server/) | HashiCorp publishes a Terraform MCP server for AI assistants | | Self-hosted option | [Self-hosted Pulumi Cloud](/docs/administration/self-hosting/) | Terraform Enterprise | | Pricing model | Editions with a monthly base price and Pulumi Credits consumed across IaC resources, Deployments, ESC, and Neo; see [pricing](/pricing/) | Resources Under Management (RUM), with a Free tier up to 500 managed resources | @@ -65,7 +65,7 @@ Pulumi Cloud can manage Terraform and OpenTofu configurations without converting * Access is governed by the same [RBAC](/docs/administration/concepts/rbac/) as other Pulumi Cloud stacks. * Backend configuration and OIDC credentials can come from [Pulumi ESC](/docs/esc/), and root module outputs are exposed as stack outputs for other stacks to consume. * [Preventative policies](/docs/discovery-governance/concepts/policy-as-code/) run against the Terraform plan on remotely executed stacks and can block a non-compliant apply. -* Terraform-managed resources appear in [Pulumi Discovery](/docs/discovery-governance/) alongside Pulumi-managed ones, and [Neo](/docs/ai/neo/code-reviews/) can review Terraform and OpenTofu pull requests. +* Terraform-managed resources appear in [Pulumi Discovery](/docs/discovery-governance/) alongside Pulumi-managed ones, and [Neo](/docs/ai/concepts/neo/code-reviews/) can review Terraform and OpenTofu pull requests. Pulumi programs in any language can also [consume Terraform modules](/docs/integrations/terraform/modules/) with `pulumi package add hcl module [version]`, resolving from the Terraform Registry, a private registry, or a local path. @@ -152,7 +152,7 @@ You can move state without changing code by using [Pulumi Cloud as a Terraform b ### Does Pulumi work with AI coding agents? -Yes. Coding agents such as Claude Code, Codex, Cursor, and GitHub Copilot can write Pulumi programs, and [Agent Skills](/docs/ai/skills/) and the [Pulumi MCP server](/docs/ai/mcp-server/) give them Pulumi-specific context. [Pulumi Neo](/docs/ai/) is Pulumi's infrastructure agent; it runs inside Pulumi Cloud and can run previews, investigate failed updates, and review Terraform and OpenTofu pull requests. Most teams get the most out of using Neo alongside the coding agent they already use. +Yes. Coding agents such as Claude Code, Codex, Cursor, and GitHub Copilot can write Pulumi programs, and [Agent Skills](/docs/ai/concepts/agent-skills/) and the [Pulumi MCP server](/docs/ai/guides/set-up-mcp-server/) give them Pulumi-specific context. [Pulumi Neo](/docs/ai/) is Pulumi's infrastructure agent; it runs inside Pulumi Cloud and can run previews, investigate failed updates, and review Terraform and OpenTofu pull requests. Most teams get the most out of using Neo alongside the coding agent they already use. ## Next steps diff --git a/content/docs/iac/concepts/converters.md b/content/docs/iac/concepts/converters.md index 49ab98ef1c0f..196003185140 100644 --- a/content/docs/iac/concepts/converters.md +++ b/content/docs/iac/concepts/converters.md @@ -13,7 +13,7 @@ menu: Converters are [plugins](/docs/iac/concepts/plugins/) that deterministically translate infrastructure as code written in other tools into Pulumi programs in any [supported Pulumi language](/docs/iac/languages-sdks/). {{% notes type="info" %}} -For most conversions, using an LLM is the recommended first option. [Pulumi Neo](/docs/ai/), part of Pulumi Cloud, can convert your infrastructure code using AI. For Terraform specifically, Neo has a [specialized migration skill](/docs/ai/skills/). +For most conversions, using an LLM is the recommended first option. [Pulumi Neo](/docs/ai/), part of Pulumi Cloud, can convert your infrastructure code using AI. For Terraform specifically, Neo has a [specialized migration skill](/docs/ai/concepts/agent-skills/). {{% /notes %}} ## Supported converters diff --git a/content/docs/iac/operations/stack-management/drift.md b/content/docs/iac/operations/stack-management/drift.md index 11325d9de057..1e9af13087b1 100644 --- a/content/docs/iac/operations/stack-management/drift.md +++ b/content/docs/iac/operations/stack-management/drift.md @@ -103,7 +103,7 @@ The third step is the one most often skipped. Without it, the next refresh will The code-edit step is the slowest part of adoption: it's tedious to translate a diff full of provider properties back into your program, and it's where most "I'll do it later" abandonments happen. [Pulumi Neo](/docs/ai/) is built for this: hand it the stack and the drift, and it will run the refresh, read the resulting diff, edit the program so it matches, run a clean preview, and open a pull request for you to review. -A task description as direct as *"Adopt the drift on the `production` stack into the program"* is enough to get Neo started. By default Neo runs in [Review mode](/docs/ai/neo/tasks/#task-modes), so the `pulumi up` and the PR both require your approval before they happen: you stay the decision-maker on what gets merged. For large or unfamiliar codebases, enable [Plan Mode](/docs/ai/neo/tasks/#plan-mode) so Neo investigates the program and proposes its approach before making any changes. +A task description as direct as *"Adopt the drift on the `production` stack into the program"* is enough to get Neo started. By default Neo runs in [Review mode](/docs/ai/concepts/neo/tasks/#task-modes), so the `pulumi up` and the PR both require your approval before they happen: you stay the decision-maker on what gets merged. For large or unfamiliar codebases, enable [Plan Mode](/docs/ai/concepts/neo/tasks/#plan-mode) so Neo investigates the program and proposes its approach before making any changes. Neo doesn't change the mechanics of adoption: the program still has to be updated to match reality, and the PR still has to be reviewed. What changes is the cost of getting there: Neo absorbs the tedium that makes adoption the slower of the two reconciliation paths. @@ -172,7 +172,7 @@ For most teams, scheduled detection plus human-driven remediation is the safer d - [`pulumi refresh`](/docs/iac/cli/commands/pulumi_refresh/) and [`pulumi up`](/docs/iac/cli/commands/pulumi_up/) CLI references. - [Pulumi Cloud drift detection](/docs/deployments/concepts/drift/) — managed scheduling, the Drift tab, and auto-remediation. -- [Pulumi Neo tasks](/docs/ai/neo/tasks/) — let Neo handle the code-edit step of adoption. +- [Pulumi Neo tasks](/docs/ai/concepts/neo/tasks/) — let Neo handle the code-edit step of adoption. - [Pulumi Kubernetes Operator](https://github.com/pulumi/pulumi-kubernetes-operator) — continuous reconciliation for Kubernetes-hosted stacks. - [Targeted updates](/docs/iac/operations/stack-management/targeted-updates/) — partial updates are a common source of drift between code and infrastructure. - [Update plans](/docs/iac/operations/stack-management/update-plans/) — preview-and-approve workflow that pairs well with adoption. diff --git a/content/docs/install/_index.md b/content/docs/install/_index.md index dd00ba195bfd..77e56ee8a75d 100644 --- a/content/docs/install/_index.md +++ b/content/docs/install/_index.md @@ -663,7 +663,7 @@ npx skills add pulumi/agent-skills/migration --skill '*' npx skills add pulumi/agent-skills/delegation --skill '*' ``` -You can also connect your assistant to the [Pulumi MCP server](/docs/ai/mcp-server/) for live access to your Pulumi Cloud stacks, resources, and the Pulumi Registry. +You can also connect your assistant to the [Pulumi MCP server](/docs/ai/guides/set-up-mcp-server/) for live access to your Pulumi Cloud stacks, resources, and the Pulumi Registry. ## Uninstalling Pulumi diff --git a/content/docs/integrations/terraform/convert-hcl.md b/content/docs/integrations/terraform/convert-hcl.md index aa14a94fb7c9..5bccd00164d8 100644 --- a/content/docs/integrations/terraform/convert-hcl.md +++ b/content/docs/integrations/terraform/convert-hcl.md @@ -1227,15 +1227,15 @@ Don't skip this step when you're converting production infrastructure: a preview ## AI-assisted conversion with the Pulumi MCP server -For most conversions, use a coding agent rather than `pulumi convert`. The converter is deterministic, so it handles what it recognizes and leaves a TODO for the rest, including heavy `for_each` and `dynamic` blocks and module indirection, and its output keeps the structure of the HCL rather than the idioms of the language you're moving to. An agent such as [Pulumi Neo](/docs/ai/neo/), Claude Code, Cursor, or Codex converts those constructs, writes idiomatic code, and can run `pulumi preview` and iterate until it reports no changes. Neo already knows this workflow end to end, including migrating your Terraform state; see [Migrating from Terraform](/docs/iac/guides/migration/migrating-to-pulumi/from-terraform/) for that path. +For most conversions, use a coding agent rather than `pulumi convert`. The converter is deterministic, so it handles what it recognizes and leaves a TODO for the rest, including heavy `for_each` and `dynamic` blocks and module indirection, and its output keeps the structure of the HCL rather than the idioms of the language you're moving to. An agent such as [Pulumi Neo](/docs/ai/concepts/neo/), Claude Code, Cursor, or Codex converts those constructs, writes idiomatic code, and can run `pulumi preview` and iterate until it reports no changes. Neo already knows this workflow end to end, including migrating your Terraform state; see [Migrating from Terraform](/docs/iac/guides/migration/migrating-to-pulumi/from-terraform/) for that path. -Whichever agent you use, the [Pulumi MCP (Model Context Protocol) server](/docs/ai/mcp-server/) gives it access to the Pulumi Registry, your stacks, and a `convert-terraform-to-typescript` prompt. +Whichever agent you use, the [Pulumi MCP (Model Context Protocol) server](/docs/ai/guides/set-up-mcp-server/) gives it access to the Pulumi Registry, your stacks, and a `convert-terraform-to-typescript` prompt. ### Using the Pulumi MCP server -The [Pulumi MCP server](/docs/ai/mcp-server/) works with any agent that speaks MCP, including [Claude Code](https://www.anthropic.com/claude-code), Cursor, Windsurf, and Kiro. It ships a `convert-terraform-to-typescript` prompt that converts Terraform HCL to Pulumi TypeScript, so the agent has a Pulumi-authored starting point rather than whatever it would improvise. +The [Pulumi MCP server](/docs/ai/guides/set-up-mcp-server/) works with any agent that speaks MCP, including [Claude Code](https://www.anthropic.com/claude-code), Cursor, Windsurf, and Kiro. It ships a `convert-terraform-to-typescript` prompt that converts Terraform HCL to Pulumi TypeScript, so the agent has a Pulumi-authored starting point rather than whatever it would improvise. -Beyond conversion, the server exposes tools for listing your stacks, searching your deployed resources, reading Registry schemas, checking policy findings, and handing longer jobs to [Pulumi Neo](/docs/ai/neo/). The [MCP server docs](/docs/ai/mcp-server/) list every tool and prompt. +Beyond conversion, the server exposes tools for listing your stacks, searching your deployed resources, reading Registry schemas, checking policy findings, and handing longer jobs to [Pulumi Neo](/docs/ai/concepts/neo/). The [MCP server docs](/docs/ai/guides/set-up-mcp-server/) list every tool and prompt. To set it up and use it: @@ -1245,7 +1245,7 @@ To set it up and use it: $ claude mcp add --transport http pulumi https://mcp.ai.pulumi.com/mcp ``` - Other agents configure it differently — see [Configuration](/docs/ai/mcp-server/#configuration) in the MCP server docs. + Other agents configure it differently — see [Configuration](/docs/ai/guides/set-up-mcp-server/#configuration) in the MCP server docs. 1. **Gather your Terraform code.** Collect the configuration files you want converted (`.tf`, `terraform.tfvars`, and any module sources they reference). diff --git a/content/docs/integrations/version-control/azure-devops-integration.md b/content/docs/integrations/version-control/azure-devops-integration.md index f3390ddfa151..e2a140c4e38a 100644 --- a/content/docs/integrations/version-control/azure-devops-integration.md +++ b/content/docs/integrations/version-control/azure-devops-integration.md @@ -108,7 +108,7 @@ For [review stacks](#review-stacks), comments show the review stack status and o Draft pull requests do not trigger deployments, so no preview runs and no comment is posted until the pull request is published. Azure DevOps is the exception here: [GitLab](/docs/integrations/version-control/gitlab/) and [Bitbucket](/docs/integrations/version-control/bitbucket/) treat drafts like any other request, and [GitHub](/docs/integrations/version-control/github-app/) makes draft comments a setting you can turn off. -These comments come from Pulumi Deployments. [Neo code reviews](/docs/ai/neo/code-reviews/), which analyze a pull request and leave inline feedback, are available on GitHub only — Neo does not comment on Azure DevOps pull requests. +These comments come from Pulumi Deployments. [Neo code reviews](/docs/ai/concepts/neo/code-reviews/), which analyze a pull request and leave inline feedback, are available on GitHub only — Neo does not comment on Azure DevOps pull requests. ### Commit status checks diff --git a/content/docs/integrations/version-control/bitbucket.md b/content/docs/integrations/version-control/bitbucket.md index 76247f63259f..9ddfccbf8e32 100644 --- a/content/docs/integrations/version-control/bitbucket.md +++ b/content/docs/integrations/version-control/bitbucket.md @@ -79,7 +79,7 @@ Comments are idempotent: updates to the same stack edit the existing comment rat For [review stacks](#review-stacks), comments show the review stack status and outputs instead of a standard preview summary. -These comments come from Pulumi Deployments. [Neo code reviews](/docs/ai/neo/code-reviews/), which analyze a pull request and leave inline feedback, are available on GitHub only — Neo does not comment on Bitbucket pull requests. +These comments come from Pulumi Deployments. [Neo code reviews](/docs/ai/concepts/neo/code-reviews/), which analyze a pull request and leave inline feedback, are available on GitHub only — Neo does not comment on Bitbucket pull requests. ### Commit status checks diff --git a/content/docs/integrations/version-control/github-app.md b/content/docs/integrations/version-control/github-app.md index 9c31c1fc51c0..49adab287fd0 100644 --- a/content/docs/integrations/version-control/github-app.md +++ b/content/docs/integrations/version-control/github-app.md @@ -139,7 +139,7 @@ If authorization fails with an error mentioning the redirect URI, the callback U Separately from the org-level GitHub app, individual users can complete an OAuth flow under **Settings** > **Version control** to grant Pulumi access to their personal GitHub account. The integration card shows your status: "Individual access is authorized for this account" once you've connected, or "Individual access is recommended for this account" with an **Add Individual Account** button if you haven't. -Individual access lets Pulumi create repositories on your behalf — for example, cloning project templates into a new repository or letting [Neo](/docs/ai/) create a repository for you. It does not create webhooks. The org-level GitHub app continues to handle pull request comments, checks, and push-to-deploy regardless of whether you grant individual access. Triggering a [Neo code review](/docs/ai/neo/code-reviews/) requires individual access, because Neo runs the review on your behalf rather than as the shared app installation; for other Neo tasks it is optional. This option is not available for GitHub Enterprise Server. See [individual user authentication](#individual-user-authentication-for-github-enterprise-server) instead. +Individual access lets Pulumi create repositories on your behalf — for example, cloning project templates into a new repository or letting [Neo](/docs/ai/) create a repository for you. It does not create webhooks. The org-level GitHub app continues to handle pull request comments, checks, and push-to-deploy regardless of whether you grant individual access. Triggering a [Neo code review](/docs/ai/concepts/neo/code-reviews/) requires individual access, because Neo runs the review on your behalf rather than as the shared app installation; for other Neo tasks it is optional. This option is not available for GitHub Enterprise Server. See [individual user authentication](#individual-user-authentication-for-github-enterprise-server) instead. {{% notes type="info" %}} To remove your individual identity, select your identity on the integration card and choose **Remove Identity**. @@ -157,7 +157,7 @@ After installing the app, you can configure pull request behavior. Toggle these Changes save automatically. Detailed diff requires pull request comments to be enabled. Draft pull request comments is specific to the GitHub app. -[Neo code reviews](/docs/ai/neo/code-reviews/) are configured separately, under **Settings** > **Neo settings** > **Code reviews**, not in the integration settings above. +[Neo code reviews](/docs/ai/concepts/neo/code-reviews/) are configured separately, under **Settings** > **Neo settings** > **Code reviews**, not in the integration settings above. To remove an integration, see [Uninstallation](#uninstallation). diff --git a/content/docs/integrations/version-control/gitlab.md b/content/docs/integrations/version-control/gitlab.md index efe77feb5ad5..ef140f59efc9 100644 --- a/content/docs/integrations/version-control/gitlab.md +++ b/content/docs/integrations/version-control/gitlab.md @@ -78,7 +78,7 @@ Comments are idempotent: updates to the same stack edit the existing comment rat For [review stacks](#review-stacks), comments show the review stack status and outputs instead of a standard preview summary. -These comments come from Pulumi Deployments. [Neo code reviews](/docs/ai/neo/code-reviews/), which analyze a pull request and leave inline feedback, are available on GitHub only — Neo does not comment on GitLab merge requests. +These comments come from Pulumi Deployments. [Neo code reviews](/docs/ai/concepts/neo/code-reviews/), which analyze a pull request and leave inline feedback, are available on GitHub only — Neo does not comment on GitLab merge requests. ### Commit status checks diff --git a/content/docs/support/faq/pulumi-cloud.md b/content/docs/support/faq/pulumi-cloud.md index 570e6ea9fbab..4d26d236ea1b 100644 --- a/content/docs/support/faq/pulumi-cloud.md +++ b/content/docs/support/faq/pulumi-cloud.md @@ -162,7 +162,7 @@ Enterprise, [contact sales](/contact/?form=sales) for a contract. These legacy plans are separate from the current Pro edition. They are retired and don't include newer capabilities such as [Pulumi Deployments](/docs/deployments/), -[Pulumi Discovery](/docs/discovery-governance/concepts/discovery/), and [Pulumi Neo](/docs/ai/neo/). [Contact us](/contact/?form=sales) to move to a +[Pulumi Discovery](/docs/discovery-governance/concepts/discovery/), and [Pulumi Neo](/docs/ai/concepts/neo/). [Contact us](/contact/?form=sales) to move to a current edition. If now isn't the right time for your team, we're happy to honor your existing terms. diff --git a/content/product/neo.md b/content/product/neo.md index 60db4e3671e6..b4881ad45f96 100644 --- a/content/product/neo.md +++ b/content/product/neo.md @@ -32,7 +32,7 @@ sections: description: | **Enterprise-grade AI for cloud automation.** - Pulumi's code-first platform already works great with the coding agents your team loves — Claude Code, Codex, Cursor, and more — and our [agent skills](/docs/ai/skills/) make them even better. Want the best infrastructure agent right out of the box? That's Neo: the industry's first AI agent built from the ground up to execute, govern, and optimize complex cloud automation at enterprise scale. Neo understands infrastructure dependencies, respects your policies, and works within your existing Pulumi governance. + Pulumi's code-first platform already works great with the coding agents your team loves — Claude Code, Codex, Cursor, and more — and our [agent skills](/docs/ai/concepts/agent-skills/) make them even better. Want the best infrastructure agent right out of the box? That's Neo: the industry's first AI agent built from the ground up to execute, govern, and optimize complex cloud automation at enterprise scale. Neo understands infrastructure dependencies, respects your policies, and works within your existing Pulumi governance. cards: - icon: code title: Faster provisioning @@ -114,6 +114,6 @@ sections: cta_primary_text: See Neo in Action cta_primary_link: https://www.youtube.com/watch?v=9GB9M2l1OgY cta_text: Read the Docs - cta_link: /docs/ai/neo/ + cta_link: /docs/ai/concepts/neo/ anchor: get-started --- diff --git a/content/releases/agentic-infrastructure-era.md b/content/releases/agentic-infrastructure-era.md index 8229700c7d6f..41bda0ddaad5 100644 --- a/content/releases/agentic-infrastructure-era.md +++ b/content/releases/agentic-infrastructure-era.md @@ -162,7 +162,7 @@ sections: description: | We've reviewed and refreshed all of our existing agent skills, and added a new über-skill designed to help agents decide how best to use Pulumi in different scenarios. It's handy for humans too. - link: /docs/ai/skills/ + link: /docs/ai/concepts/agent-skills/ - variant: text icon: brackets-curly diff --git a/content/releases/changelog/2026-06-22-neo-code-reviews.md b/content/releases/changelog/2026-06-22-neo-code-reviews.md index de9910ac1469..b5d03c3bd540 100644 --- a/content/releases/changelog/2026-06-22-neo-code-reviews.md +++ b/content/releases/changelog/2026-06-22-neo-code-reviews.md @@ -8,7 +8,7 @@ authors: - christian-nunciato --- -As of today, [Pulumi Neo code reviews](/docs/ai/neo/code-reviews/) are available in public preview. +As of today, [Pulumi Neo code reviews](/docs/ai/concepts/neo/code-reviews/) are available in public preview. Building on the [Pulumi GitHub app](/docs/integrations/version-control/github-app/), which already posts rich diffs as PR comments on pull requests, Neo code reviews help you understand not just what's changing, but also how those changes relate to, and potentially impact, the rest of your running infrastructure. diff --git a/content/releases/changelog/2026-07-14-neo-usage-limits.md b/content/releases/changelog/2026-07-14-neo-usage-limits.md index daffadb81a4f..353b418dbe73 100644 --- a/content/releases/changelog/2026-07-14-neo-usage-limits.md +++ b/content/releases/changelog/2026-07-14-neo-usage-limits.md @@ -12,4 +12,4 @@ Organizations with Neo enabled can set a single dollar limit for the entire orga ![The Manage token usage panel, where an admin sets the organization's monthly Neo limit and turns on email notifications](/releases/changelog/images/2026-07-14-neo-usage-limits.png) -Neo usage limits are available now for all organizations, and are configurable by organization admins and billing managers. Read the [announcement blog post](/blog/neo-usage-limits/) or the [usage limits documentation](/docs/ai/neo/usage-limits/) to learn more. +Neo usage limits are available now for all organizations, and are configurable by organization admins and billing managers. Read the [announcement blog post](/blog/neo-usage-limits/) or the [usage limits documentation](/docs/ai/concepts/neo/usage-limits/) to learn more. diff --git a/content/releases/terraform-state-backend-modules-hcl.md b/content/releases/terraform-state-backend-modules-hcl.md index 39501142b1e8..9112f132b4fb 100644 --- a/content/releases/terraform-state-backend-modules-hcl.md +++ b/content/releases/terraform-state-backend-modules-hcl.md @@ -74,7 +74,7 @@ sections: title: Neo code reviews description: | Pulumi Neo, our infrastructure agent, can review every pull request and tell you whether it's safe to merge. Fully compatible with Terraform and OpenTofu programs. - link: /docs/ai/neo/code-reviews/ + link: /docs/ai/concepts/neo/code-reviews/ - anchor: terraform-modules label: Terraform modules consumable across languages diff --git a/content/state-of-agentic-infrastructure/_index.md b/content/state-of-agentic-infrastructure/_index.md index 05ea5a94cf1f..66518a0e530e 100644 --- a/content/state-of-agentic-infrastructure/_index.md +++ b/content/state-of-agentic-infrastructure/_index.md @@ -326,11 +326,11 @@ cta: - title: Pulumi MCP server icon: plugs-connected desc: Connect Claude Code, Copilot, and your own agents to your infrastructure through the Model Context Protocol. - href: /docs/ai/neo/integrations/mcp/ + href: /docs/ai/integrations/external-mcp-servers/ cta: Read the docs - title: Pulumi Agent Skills icon: head-circuit desc: Knowledge packages that teach Claude Code, Cursor, and other agents to build and manage infrastructure. - href: /docs/ai/skills/ + href: /docs/ai/concepts/agent-skills/ cta: Explore skills --- diff --git a/content/what-is/mcp-for-infrastructure-as-code.md b/content/what-is/mcp-for-infrastructure-as-code.md index ba31d9c8c9fc..d4f395133070 100644 --- a/content/what-is/mcp-for-infrastructure-as-code.md +++ b/content/what-is/mcp-for-infrastructure-as-code.md @@ -62,7 +62,7 @@ Pulumi ships MCP support in two forms, a local server and a hosted one, so teams | Requires Pulumi CLI installed | Yes | No | | Typical fit | Local development, CI runners you already control | Editors and agents you don't want to provision a CLI on | -The local server's tool names are prefixed to keep them unambiguous inside a host that may be connected to multiple servers at once: `pulumi-registry-list-resources`, `pulumi-registry-list-functions`, `pulumi-registry-get-resource`, `pulumi-registry-get-function`, `pulumi-registry-get-type`, `pulumi-cli-preview`, `pulumi-cli-up`, `pulumi-cli-stack-output`, `pulumi-cli-refresh`, `pulumi-resource-search`, and `neo-task-launcher`, plus a `deploy-to-aws` prompt for a common starting workflow. The hosted server exposes an unprefixed set with the same intent, including `get-stacks` and `resource-search`. Full parameter-level documentation lives on the [Pulumi MCP server docs page](/docs/ai/mcp-server/). +The local server's tool names are prefixed to keep them unambiguous inside a host that may be connected to multiple servers at once: `pulumi-registry-list-resources`, `pulumi-registry-list-functions`, `pulumi-registry-get-resource`, `pulumi-registry-get-function`, `pulumi-registry-get-type`, `pulumi-cli-preview`, `pulumi-cli-up`, `pulumi-cli-stack-output`, `pulumi-cli-refresh`, `pulumi-resource-search`, and `neo-task-launcher`, plus a `deploy-to-aws` prompt for a common starting workflow. The hosted server exposes an unprefixed set with the same intent, including `get-stacks` and `resource-search`. Full parameter-level documentation lives on the [Pulumi MCP server docs page](/docs/ai/guides/set-up-mcp-server/). ### Pulumi's MCP server by the numbers @@ -75,7 +75,7 @@ The local server's tool names are prefixed to keep them unambiguous inside a hos | Tools exposed, hosted server | 14 tools, 6 prompts | 2026-09-12 | | Cloud providers reachable through Pulumi's IaC engine | [Hundreds](/registry/) | 2026-09-12 | -Download and pull counts come from the [npm registry](https://www.npmjs.com/package/@pulumi/mcp-server) and [Docker Hub](https://hub.docker.com/r/mcp/pulumi) on the dates shown; the tool and prompt counts are the sets enumerated on the [Pulumi MCP server docs page](/docs/ai/mcp-server/). Package-manager download counts include CI and automation traffic alongside interactive use, so treat them as a usage floor rather than a headcount of engineers. +Download and pull counts come from the [npm registry](https://www.npmjs.com/package/@pulumi/mcp-server) and [Docker Hub](https://hub.docker.com/r/mcp/pulumi) on the dates shown; the tool and prompt counts are the sets enumerated on the [Pulumi MCP server docs page](/docs/ai/guides/set-up-mcp-server/). Package-manager download counts include CI and automation traffic alongside interactive use, so treat them as a usage floor rather than a headcount of engineers. ## What can AI agents do with it? @@ -141,7 +141,7 @@ Richard Genthner, Chief Information Security Officer at Boost Insurance, frames ## How does Neo relate to MCP? -[Neo](/product/neo/) is Pulumi's infrastructure engineering agent, and MCP is one of the ways it connects to the rest of your toolchain, alongside its own direct integrations. Where the MCP server exposes granular tools, preview, deploy, search, that any MCP-compatible host can call one at a time, Neo is built specifically to plan and execute multi-step infrastructure work: migrating a Terraform codebase to Pulumi, proposing a fix when a deployment fails, or carrying out a policy change across many stacks, then opening a pull request for review. The `neo-task-launcher` tool in Pulumi's MCP server is the bridge, letting any MCP host hand a task to Neo rather than trying to orchestrate every step itself. For a deeper look at how MCP fits alongside Pulumi's other agent integrations, see [External MCP Servers](/docs/ai/neo/integrations/mcp/) and [CLI for AI Agents](/docs/ai/cli-for-agents/). +[Neo](/product/neo/) is Pulumi's infrastructure engineering agent, and MCP is one of the ways it connects to the rest of your toolchain, alongside its own direct integrations. Where the MCP server exposes granular tools, preview, deploy, search, that any MCP-compatible host can call one at a time, Neo is built specifically to plan and execute multi-step infrastructure work: migrating a Terraform codebase to Pulumi, proposing a fix when a deployment fails, or carrying out a policy change across many stacks, then opening a pull request for review. The `neo-task-launcher` tool in Pulumi's MCP server is the bridge, letting any MCP host hand a task to Neo rather than trying to orchestrate every step itself. For a deeper look at how MCP fits alongside Pulumi's other agent integrations, see [External MCP Servers](/docs/ai/integrations/external-mcp-servers/) and [CLI for AI Agents](/docs/ai/concepts/cli-for-agents/). ## Frequently asked questions @@ -183,10 +183,10 @@ Yes, through the local server's `pulumi-cli-up` tool. The hosted server doesn't ## Learn more -- [Pulumi MCP Server documentation](/docs/ai/mcp-server/) +- [Pulumi MCP Server documentation](/docs/ai/guides/set-up-mcp-server/) - [AI-Assisted IaC with Pulumi's MCP Server](/blog/mcp-server-ai-assistants/) - [Announcing Pulumi Remote MCP Server](/blog/remote-mcp-server/) -- [External MCP Servers for Neo](/docs/ai/neo/integrations/mcp/) -- [CLI for AI Agents](/docs/ai/cli-for-agents/) +- [External MCP Servers for Neo](/docs/ai/integrations/external-mcp-servers/) +- [CLI for AI Agents](/docs/ai/concepts/cli-for-agents/) - [What is Agentic Infrastructure?](/what-is/what-is-agentic-infrastructure/) - [What is an Internal Developer Platform?](/what-is/what-is-an-internal-developer-platform/) diff --git a/content/what-is/what-is-agentic-infrastructure.md b/content/what-is/what-is-agentic-infrastructure.md index aada46446262..e3a32993a45c 100644 --- a/content/what-is/what-is-agentic-infrastructure.md +++ b/content/what-is/what-is-agentic-infrastructure.md @@ -55,11 +55,11 @@ Any capable coding agent. Because Pulumi expresses infrastructure in general-pur **Your coding agent and Pulumi IaC.** The agent edits Pulumi code, runs `pulumi preview` to check the plan against its intent, and deploys. The verification loop works out of the box, with no special integration. The [Pulumi CLI](/docs/iac/cli/) is designed for exactly this: agents can run any command via `npx pulumi` without installation, perform one-shot resource operations with [`pulumi do`](/docs/iac/cli/direct-resource-operations/), get [ephemeral accounts provisioned automatically](/docs/administration/concepts/agent-accounts/), and parse structured `--json` output. -**Your coding agent, equipped.** [Pulumi Agent Skills](/docs/ai/skills/) teach agents proven Pulumi workflows (migrations, component authoring, secrets management), and the [Pulumi MCP server](/docs/ai/mcp-server/) gives them live access to your stacks, deployed resources, and the Pulumi Registry over [MCP](/what-is/mcp-for-infrastructure-as-code/). Same agent, meaningfully better results. +**Your coding agent, equipped.** [Pulumi Agent Skills](/docs/ai/concepts/agent-skills/) teach agents proven Pulumi workflows (migrations, component authoring, secrets management), and the [Pulumi MCP server](/docs/ai/guides/set-up-mcp-server/) gives them live access to your stacks, deployed resources, and the Pulumi Registry over [MCP](/what-is/mcp-for-infrastructure-as-code/). Same agent, meaningfully better results. **Pulumi Neo.** [Neo](/product/neo/) is Pulumi's purpose-built infrastructure agent. It ships with the Agent Skills catalog built in, and adds grounding in your organization's actual infrastructure state, policy guardrails, configurable human-in-the-loop approvals, and scheduled autonomous work. Neo has been shipping quickly: it now [comments inline on pull requests](/blog/neo-code-reviews/) using live infrastructure state (June 2026), works [directly against Terraform and HCL](/blog/bring-your-terraform-estate-into-the-agentic-era/) with Pulumi Cloud as the state backend (August 2026), and [traces attack paths](/blog/pulumi-neo-security/) across a cloud estate for security review (August 2026). The [Context API](/docs/discovery-governance/concepts/context-api/), released to public preview in August 2026, is the structured interface Neo uses to query that live state. -The options compose. Teams often use Neo for scheduled, longer-horizon infrastructure work and their everyday coding agent for interactive development, and work can [hand off from one agent to Neo](/docs/ai/skills/) mid-session. +The options compose. Teams often use Neo for scheduled, longer-horizon infrastructure work and their everyday coding agent for interactive development, and work can [hand off from one agent to Neo](/docs/ai/concepts/agent-skills/) mid-session. ## What does an AI infrastructure agent actually do? @@ -139,7 +139,7 @@ You have two entry points, and they compose: bring the coding agent you already **Step 1: Start with Pulumi IaC.** Agents work with Pulumi programs. If your team is already using Pulumi, agents can start operating your existing stacks immediately. If you are migrating from another tool, Pulumi provides [conversion documentation](/docs/iac/comparisons/terraform/) for common starting points. -**Step 2: Pick your agent, or use both.** To work with the agent you already use, install [Pulumi Agent Skills](/docs/ai/skills/) and connect the [Pulumi MCP server](/docs/ai/mcp-server/). To use Neo, navigate to the [Neo documentation](/docs/ai/) for activation steps. Either way, you can start with a single project or stack before expanding. +**Step 2: Pick your agent, or use both.** To work with the agent you already use, install [Pulumi Agent Skills](/docs/ai/concepts/agent-skills/) and connect the [Pulumi MCP server](/docs/ai/guides/set-up-mcp-server/). To use Neo, navigate to the [Neo documentation](/docs/ai/) for activation steps. Either way, you can start with a single project or stack before expanding. **Step 3: Start in Review mode.** Neo's default task mode requires human approval at every step. This is the right starting point: you learn how Neo reasons, build trust in its outputs, and establish your policy baseline before giving it more autonomy. @@ -173,7 +173,7 @@ Yes, when the governance layer is in place first. Pulumi Neo runs `pulumi previe ### Do you need Pulumi Neo to use AI agents with Pulumi? -No. Any coding agent can manage Pulumi infrastructure directly, and [Pulumi Agent Skills](/docs/ai/skills/) and the [Pulumi MCP server](/docs/ai/mcp-server/) make agents like Claude Code, Codex, and Cursor considerably better at it. Neo adds what a general-purpose agent doesn't have out of the box: grounding in your actual infrastructure state, built-in policy enforcement, and scheduled autonomous tasks. Many teams use both. +No. Any coding agent can manage Pulumi infrastructure directly, and [Pulumi Agent Skills](/docs/ai/concepts/agent-skills/) and the [Pulumi MCP server](/docs/ai/guides/set-up-mcp-server/) make agents like Claude Code, Codex, and Cursor considerably better at it. Neo adds what a general-purpose agent doesn't have out of the box: grounding in your actual infrastructure state, built-in policy enforcement, and scheduled autonomous tasks. Many teams use both. ### What is the difference between infrastructure for AI agents and infrastructure managed by AI agents? @@ -213,4 +213,4 @@ Joe Duffy's CascadiaJS 2026 keynote, "The Last Mile Is Code," covers the in-dist {{< youtube "SOMEfFNPsew?rel=0" >}} -[The Agentic Infrastructure Era](/blog/the-agentic-infrastructure-era/) is Duffy's companion essay on where infrastructure is headed. [Grounded AI: Why Neo Knows Your Infrastructure](/blog/grounded-ai-why-neo-knows-your-infrastructure/) explains the context lake approach that makes Neo reliable for production. The [Pulumi Neo product page](/product/neo/) covers capabilities and sign-up, and [10 things you can do with Neo](/blog/10-things-you-can-do-with-neo/) walks through concrete examples. To equip the coding agent you already use, see [Pulumi Agent Skills](/docs/ai/skills/) and the [Pulumi MCP server](/docs/ai/mcp-server/). For governance specifics, the [Pulumi Policies](/docs/discovery-governance/concepts/policy-as-code/) docs and the full [Neo documentation](/docs/ai/) are the authoritative references, and [Agent Sprawl Is Here](/blog/agent-sprawl-iac-platform-is-the-answer/) covers the seven things an IaC platform needs to supply to keep agents governed at scale. For the broader category this page sits inside, see [what AI infrastructure is](/what-is/what-is-ai-infrastructure/). +[The Agentic Infrastructure Era](/blog/the-agentic-infrastructure-era/) is Duffy's companion essay on where infrastructure is headed. [Grounded AI: Why Neo Knows Your Infrastructure](/blog/grounded-ai-why-neo-knows-your-infrastructure/) explains the context lake approach that makes Neo reliable for production. The [Pulumi Neo product page](/product/neo/) covers capabilities and sign-up, and [10 things you can do with Neo](/blog/10-things-you-can-do-with-neo/) walks through concrete examples. To equip the coding agent you already use, see [Pulumi Agent Skills](/docs/ai/concepts/agent-skills/) and the [Pulumi MCP server](/docs/ai/guides/set-up-mcp-server/). For governance specifics, the [Pulumi Policies](/docs/discovery-governance/concepts/policy-as-code/) docs and the full [Neo documentation](/docs/ai/) are the authoritative references, and [Agent Sprawl Is Here](/blog/agent-sprawl-iac-platform-is-the-answer/) covers the seven things an IaC platform needs to supply to keep agents governed at scale. For the broader category this page sits inside, see [what AI infrastructure is](/what-is/what-is-ai-infrastructure/). diff --git a/content/what-is/what-is-ai-infrastructure.md b/content/what-is/what-is-ai-infrastructure.md index 05995798c68b..e45560bb581d 100644 --- a/content/what-is/what-is-ai-infrastructure.md +++ b/content/what-is/what-is-ai-infrastructure.md @@ -96,7 +96,7 @@ AI agents operate AI infrastructure the same way engineers do: through a coding This is consistent with where platform teams see the category heading. Platform engineering analyst Luca Galante's ["10 Platform engineering predictions for 2026"](https://platformengineering.org/blog/10-platform-engineering-predictions-for-2026) argues that "by 2026, mature platforms will treat agents like any other user persona, complete with RBAC permissions, resource quotas, and governance policies." Agents are not a special case bolted onto infrastructure tooling. They are a user type the tooling needs to support with the same access controls it already applies to people. -Pulumi's [MCP server](/docs/ai/mcp-server/) and [Neo](/product/neo/) are built around that same principle: give an agent grounded access to real stack state, and route what it proposes through the same preview and policy path a human change would go through. For a deeper look at how the protocol itself works, see [what MCP means for infrastructure as code](/what-is/mcp-for-infrastructure-as-code/). For how agents actively managing infrastructure differs from infrastructure that merely supports agent workloads, see [what agentic infrastructure is](/what-is/what-is-agentic-infrastructure/). +Pulumi's [MCP server](/docs/ai/guides/set-up-mcp-server/) and [Neo](/product/neo/) are built around that same principle: give an agent grounded access to real stack state, and route what it proposes through the same preview and policy path a human change would go through. For a deeper look at how the protocol itself works, see [what MCP means for infrastructure as code](/what-is/mcp-for-infrastructure-as-code/). For how agents actively managing infrastructure differs from infrastructure that merely supports agent workloads, see [what agentic infrastructure is](/what-is/what-is-agentic-infrastructure/). ## How do teams govern AI infrastructure and AI-generated changes? diff --git a/content/what-is/what-is-an-internal-developer-platform.md b/content/what-is/what-is-an-internal-developer-platform.md index 1edcfdf0654a..7ac4470974e5 100644 --- a/content/what-is/what-is-an-internal-developer-platform.md +++ b/content/what-is/what-is-an-internal-developer-platform.md @@ -178,7 +178,7 @@ Pulumi typically serves as the provisioning and orchestration layer—defining g AI coding agents are becoming active participants in software delivery, and IDPs are where that plays out for infrastructure. A well-designed platform gives agents the same golden paths, guardrails, and service catalog that developers use—so an agent can propose and provision infrastructure within policy rather than inventing one-off configurations. -Code-first platforms have an edge here: agents reason far better about real programming languages than about bespoke DSLs or click-through UIs. Standards like the [Model Context Protocol (MCP)](/docs/ai/mcp-server/) and [Agent Skills](/docs/ai/skills/) let agents such as Claude Code, Cursor, and others discover and safely operate a platform's capabilities. The goal isn't to replace the platform team—it's to let both humans and agents travel the same paved roads. +Code-first platforms have an edge here: agents reason far better about real programming languages than about bespoke DSLs or click-through UIs. Standards like the [Model Context Protocol (MCP)](/docs/ai/guides/set-up-mcp-server/) and [Agent Skills](/docs/ai/concepts/agent-skills/) let agents such as Claude Code, Cursor, and others discover and safely operate a platform's capabilities. The goal isn't to replace the platform team—it's to let both humans and agents travel the same paved roads. ## Common pitfalls to avoid diff --git a/data/glossary.toml b/data/glossary.toml index 2b6686ab7796..d2088231a56b 100644 --- a/data/glossary.toml +++ b/data/glossary.toml @@ -109,7 +109,7 @@ link = "/docs/iac/concepts/how-pulumi-works/" [[entries]] term = "MCP Server" description = "Pulumi's Model Context Protocol server, which exposes Pulumi capabilities (registry lookups, deployments, [resource search](#resource-search), and more) to MCP-compatible AI clients such as Claude Desktop, Cursor, and [Pulumi Neo](#pulumi-neo)." -link = "/docs/ai/mcp-server/" +link = "/docs/ai/guides/set-up-mcp-server/" [[entries]] term = "Native language package" @@ -204,7 +204,7 @@ link = "/docs/ai/" [[entries]] term = "Pulumi Neo Task" description = "A single agent invocation in [Pulumi Neo](#pulumi-neo). A task captures the request, the agent's plan and tool calls, and the resulting changes, and can be reviewed and replayed from [Pulumi Cloud](#pulumi-cloud)." -link = "/docs/ai/neo/tasks/" +link = "/docs/ai/concepts/neo/tasks/" [[entries]] term = "Pulumi Registry" diff --git a/layouts/agent-start/list.html b/layouts/agent-start/list.html index 379ddd803a26..324d8bbbabe4 100644 --- a/layouts/agent-start/list.html +++ b/layouts/agent-start/list.html @@ -12,7 +12,7 @@

{{ .Title }}

{{ partial "agent-launchers.html" (dict "prompt" $prompt "track" "agent-start") }}

Rather do it by hand? Follow the Get Started guide.

-

To go further with agents, see Agent Skills, the Pulumi MCP server, and Pulumi Neo, our purpose-built infrastructure agent.

+

To go further with agents, see Agent Skills, the Pulumi MCP server, and Pulumi Neo, our purpose-built infrastructure agent.

{{ end }} diff --git a/layouts/index.llms.txt b/layouts/index.llms.txt index 22f1981d3090..b47db6b778a2 100644 --- a/layouts/index.llms.txt +++ b/layouts/index.llms.txt @@ -74,7 +74,7 @@ If you are an AI agent or programmatic consumer, start with these endpoints. Eac curl https://www.pulumi.com/registry/packages/aws.md curl https://www.pulumi.com/registry.md -- **Doing infrastructure work as an agent** — the Pulumi CLI is designed for agents: run any command with `npx pulumi`, perform one-shot resource operations with [`pulumi do`](https://www.pulumi.com/docs/iac/cli/direct-resource-operations/), and get an [ephemeral Pulumi Cloud account provisioned automatically](https://www.pulumi.com/docs/administration/concepts/agent-accounts/) on first use — no signup required. [Pulumi Agent Skills](https://www.pulumi.com/docs/ai/skills/) provide proven Pulumi workflows, and the [Pulumi MCP server](https://www.pulumi.com/docs/ai/mcp-server/) exposes stacks, resource search, and the Registry as MCP tools. +- **Doing infrastructure work as an agent** — the Pulumi CLI is designed for agents: run any command with `npx pulumi`, perform one-shot resource operations with [`pulumi do`](https://www.pulumi.com/docs/iac/cli/direct-resource-operations/), and get an [ephemeral Pulumi Cloud account provisioned automatically](https://www.pulumi.com/docs/administration/concepts/agent-accounts/) on first use — no signup required. [Pulumi Agent Skills](https://www.pulumi.com/docs/ai/concepts/agent-skills/) provide proven Pulumi workflows, and the [Pulumi MCP server](https://www.pulumi.com/docs/ai/guides/set-up-mcp-server/) exposes stacks, resource search, and the Registry as MCP tools. {{/* The support-request contract below mirrors infrastructure/support-form/validation.ts and handler.ts. Change one and change the other in the same PR. */}} - **Filing a support request** — open a ticket with the Pulumi support team without driving the [web form](https://www.pulumi.com/support/new/). No authentication and no cookies. Post exactly the six fields below: any unknown top-level key is rejected, so send this shape rather than scraping the HTML form for its inputs. In particular the rendered form carries a hidden `leave_blank` input, which is a spam trap — sending it discards the request behind a response indistinguishable from success, so never send a `leave_blank` key. @@ -99,7 +99,7 @@ This llms.txt covers www.pulumi.com, which includes: - [Product](https://www.pulumi.com/product/): Pulumi Cloud platform overview and capabilities - [Pricing](https://www.pulumi.com/pricing/): Plans and pricing for Pulumi Cloud ({{ delimit $editionNames ", " }}) - [Pulumi Registry](https://www.pulumi.com/registry/): Documentation for hundreds of cloud providers and components, available at `https://www.pulumi.com/registry/packages//` -- [Infrastructure AI](https://www.pulumi.com/docs/ai/): Using AI agents with Pulumi — bring your own agent via [Agent Skills](https://www.pulumi.com/docs/ai/skills/) and the [MCP server](https://www.pulumi.com/docs/ai/mcp-server/), or use [Pulumi Neo](https://www.pulumi.com/neo/), Pulumi's purpose-built infrastructure agent +- [Infrastructure AI](https://www.pulumi.com/docs/ai/): Using AI agents with Pulumi — bring your own agent via [Agent Skills](https://www.pulumi.com/docs/ai/concepts/agent-skills/) and the [MCP server](https://www.pulumi.com/docs/ai/guides/set-up-mcp-server/), or use [Pulumi Neo](https://www.pulumi.com/neo/), Pulumi's purpose-built infrastructure agent - [Blog](https://www.pulumi.com/blog/): Product announcements, technical guides, and engineering posts - [Dev Center](https://www.pulumi.com/dev/): Tutorials, templates, community examples, and a glossary. Has an index of its own at [/dev/llms.txt](https://www.pulumi.com/dev/llms.txt), and every detail page has a markdown twin at its URL plus `.md` - [What is...](https://www.pulumi.com/what-is/): Explainer pages for cloud infrastructure concepts (e.g., infrastructure as code, Kubernetes, serverless) diff --git a/scripts/redirects/general-broken-links-redirects.txt b/scripts/redirects/general-broken-links-redirects.txt index 18e2abd31d12..b3c1806fbdcc 100644 --- a/scripts/redirects/general-broken-links-redirects.txt +++ b/scripts/redirects/general-broken-links-redirects.txt @@ -1,7 +1,7 @@ containers/index.html|/docs/integrations/clouds/kubernetes/ docs/guides/index.html|/docs/iac/ docs/iac/guides/index.html|/docs/iac/ -docs/iac/guides/ai-integration/index.html|/docs/ai/mcp-server/ +docs/iac/guides/ai-integration/index.html|/docs/ai/guides/set-up-mcp-server/ docs/using-pulumi/adopting-pulumi/migrating-to-pulumi/index.html|/docs/iac/guides/migration/ what-is/infrastructure-as-code/index.html|/what-is/what-is-infrastructure-as-code/ docs/support/troubleshooting/debugging/images/automatic-1.png|/docs/iac/operations/debugging/images/automatic-1.png From 5dd6e0e081a140fc33e7c07afaeb1bea3a0be42a Mon Sep 17 00:00:00 2001 From: Josh Kodroff Date: Thu, 22 Oct 2026 16:24:51 -0400 Subject: [PATCH 3/4] Address pre-merge review: permissions accuracy, read-only scope, outdated screenshot - F2: link MCP-created tasks to the Pulumi MCP server guide - F3: name the VCS identity exceptions (repo creation, GHES individual auth) - F4: drop the claim that permission mode has an org-level default - F6/F7: move bootstrapping subsection under Repository instructions; remove duplicate sentence - F62, F64/F65, F69: tighten overclaims on agent accounts, read-only mode, and the integrations page - Remove the outdated Neo access screenshot from the settings page Co-Authored-By: Claude Opus 5.5 --- content/docs/ai/_index.md | 2 +- content/docs/ai/concepts/neo/_index.md | 4 +-- .../ai/concepts/neo/instructions/index.md | 28 ++++++++---------- content/docs/ai/concepts/neo/permissions.md | 6 ++-- .../docs/ai/concepts/neo/settings/index.md | 4 +-- .../neo/settings/toggle-neo-access.png | Bin 195995 -> 0 bytes 6 files changed, 19 insertions(+), 25 deletions(-) delete mode 100644 content/docs/ai/concepts/neo/settings/toggle-neo-access.png diff --git a/content/docs/ai/_index.md b/content/docs/ai/_index.md index c7be3ea57f67..a2d9c3e36285 100644 --- a/content/docs/ai/_index.md +++ b/content/docs/ai/_index.md @@ -22,7 +22,7 @@ sections: - type: flat heading: Overview description_md: | - Pulumi is built to be driven by AI agents, including the coding agents your team already uses. Because Pulumi infrastructure is real code with a verifiable plan for every change, agents like Claude Code, Codex, Cursor, and GitHub Copilot can write, preview, and deploy it directly. The [Pulumi CLI](/docs/ai/concepts/cli-for-agents/) is designed for them: run any command with `npx pulumi`, perform one-shot resource operations with [`pulumi do`](/docs/iac/cli/direct-resource-operations/), and parse structured `--json` output. [Pulumi Agent Skills](/docs/ai/concepts/agent-skills/) teach agents proven Pulumi workflows, the [Pulumi MCP server](/docs/ai/guides/set-up-mcp-server/) offers the same reach over [MCP](/what-is/mcp-for-infrastructure-as-code/), and [agent accounts](/docs/administration/concepts/agent-accounts/) remove signup friction entirely. + Pulumi is built to be driven by AI agents, including the coding agents your team already uses. Because Pulumi infrastructure is real code with a verifiable plan for every change, agents like Claude Code, Codex, Cursor, and GitHub Copilot can write, preview, and deploy it directly. The [Pulumi CLI](/docs/ai/concepts/cli-for-agents/) is designed for them: run any command with `npx pulumi`, perform one-shot resource operations with [`pulumi do`](/docs/iac/cli/direct-resource-operations/), and parse structured `--json` output. [Pulumi Agent Skills](/docs/ai/concepts/agent-skills/) teach agents proven Pulumi workflows, the [Pulumi MCP server](/docs/ai/guides/set-up-mcp-server/) offers the same reach over [MCP](/what-is/mcp-for-infrastructure-as-code/), and [agent accounts](/docs/administration/concepts/agent-accounts/) let an agent start working before anyone signs up. [Pulumi Neo](/docs/ai/concepts/neo/) is Pulumi's own infrastructure agent, built on the same foundations and adding organizational context, policy guardrails, human-in-the-loop approvals, and scheduled autonomous work. Use your favorite agent, use Neo, or use both together: Neo for long-running, governed infrastructure tasks, and your coding agent for interactive development. diff --git a/content/docs/ai/concepts/neo/_index.md b/content/docs/ai/concepts/neo/_index.md index 7e056daa3fbc..048db42c1f20 100644 --- a/content/docs/ai/concepts/neo/_index.md +++ b/content/docs/ai/concepts/neo/_index.md @@ -88,5 +88,5 @@ the context a task needs. [Plan Mode](/docs/ai/concepts/neo/tasks/#plan-mode) makes Neo agree on a plan with you before it acts, [task modes](/docs/ai/concepts/neo/tasks/#task-modes) control which steps need your approval, and -[read-only mode](/docs/ai/get-started/neo/#read-only-mode) removes its ability -to change anything at all. Neo never has more access than you do, only less. +[read-only mode](/docs/ai/get-started/neo/#read-only-mode) stops it from +making changes in Pulumi Cloud. Neo never has more access than you do, only less. diff --git a/content/docs/ai/concepts/neo/instructions/index.md b/content/docs/ai/concepts/neo/instructions/index.md index 9b7cb2a51ff9..b8a58c043a84 100644 --- a/content/docs/ai/concepts/neo/instructions/index.md +++ b/content/docs/ai/concepts/neo/instructions/index.md @@ -54,19 +54,6 @@ When you ask Neo to create resources, it automatically applies your organization - Update instructions as your team's practices evolve - Test instructions in individual prompts before rolling out broadly -### Bootstrapping repository instructions - -Neo reads `AGENTS.md` files when it enters a repository, but it needs to clone the repository first. To ensure Neo picks up your repository instructions early in every task, add a bootstrapping instruction to your Custom Instructions: - -```text -When working on a task, immediately clone the associated repository -(and any additional repositories involved) and look for an AGENTS.md -file. Follow any setup instructions it contains before proceeding -with the task. -``` - -This ensures that environment setup, git hooks, and coding standards defined in `AGENTS.md` are applied before Neo starts working. - ## Configuration precedence Neo applies configuration in layers, with later layers taking priority: @@ -92,8 +79,6 @@ Common uses for `AGENTS.md` include: - **Git hooks**: Hook paths and setup commands that must run before committing - **Coding standards**: Language preferences, naming conventions, and style requirements -Use `AGENTS.md` to capture conventions that aren't enforced by linters or formatters: coding standards, naming conventions, how to run tests, or any other guidance your team needs. - ### Example ```markdown @@ -122,6 +107,19 @@ Always run `git config core.hooksPath .githooks` before committing. You can place `AGENTS.md` files in subdirectories for more specific instructions. When Neo works in a subdirectory, it reads the nearest `AGENTS.md` file, with subdirectory files taking precedence over parent files. This lets you define general project-wide conventions at the root while providing specialized guidance for specific areas of your codebase. +### Bootstrapping repository instructions + +Neo reads `AGENTS.md` files when it enters a repository, but it needs to clone the repository first. To ensure Neo picks up your repository instructions early in every task, add a bootstrapping instruction to your Custom Instructions: + +```text +When working on a task, immediately clone the associated repository +(and any additional repositories involved) and look for an AGENTS.md +file. Follow any setup instructions it contains before proceeding +with the task. +``` + +This ensures that environment setup, git hooks, and coding standards defined in `AGENTS.md` are applied before Neo starts working. + ### Repository instructions best practices - Start simple with a few key conventions, then expand as needed diff --git a/content/docs/ai/concepts/neo/permissions.md b/content/docs/ai/concepts/neo/permissions.md index 6490e4b98a56..3aa0a6684273 100644 --- a/content/docs/ai/concepts/neo/permissions.md +++ b/content/docs/ai/concepts/neo/permissions.md @@ -40,9 +40,9 @@ Neo is one agent reachable from the surfaces below. Whichever surface starts a t | [Slack](/docs/ai/integrations/slack/) | The Pulumi user linked to your Slack identity | Requires connecting your Slack identity in Neo settings first. | | PR mentions / [code reviews](/docs/ai/concepts/neo/code-reviews/) | The Pulumi user matched to your VCS identity | Neo matches your GitHub identity to your Pulumi user. | | [Scheduled automations](/docs/ai/concepts/neo/automations/) | The user who scheduled the automation | RBAC is evaluated at execution time — if that user's permissions change, the new permissions apply. | -| API / [MCP](/docs/ai/integrations/external-mcp-servers/)-created tasks | The Pulumi user whose token created the task | The task runs with that user's RBAC, exactly as if they had started it in the console. | +| API / [MCP](/docs/ai/guides/set-up-mcp-server/)-created tasks | The Pulumi user whose token created the task | The task runs with that user's RBAC, exactly as if they had started it in the console. | -These identities govern what Neo does in Pulumi Cloud. Writes to your version control provider are a separate matter: Neo authenticates as the shared app installation for its VCS interactions no matter which surface started the task (see [VCS identity per provider](#vcs-identity-per-provider)). +These identities govern what Neo does in Pulumi Cloud. Writes to your version control provider are a separate matter: for most VCS interactions, Neo authenticates as the shared app installation no matter which surface started the task. Creating repositories, and GitHub Enterprise Server with individual authentication enabled, are exceptions (see [VCS identity per provider](#vcs-identity-per-provider)). Because a task's Pulumi RBAC is evaluated at execution time, it never runs with stale permissions: if the acting user is deactivated or loses access, the task loses that access immediately, including in the middle of a running task. @@ -115,8 +115,6 @@ Every lever that shapes what a Neo task can do, and who sets it: For scheduled automations, settings resolve in this order: the per-automation setting, then the org-level default, then the built-in fallback (auto approval and read-only permissions). -Org-level defaults for permission and approval mode set the starting point for new tasks; a user can override them per task. - [CLI integrations](/docs/ai/integrations/cli-integrations/) are a distinct, admin-controlled capability: an organization admin points a CLI at an ESC environment, and every task in the organization is then offered that integration unless the user turns it off for the task. Being offered an integration is not the same as being able to use it. Neo invokes the CLI with `pulumi env run`, as the acting user, so the integration only works for users who can open the backing environment — for anyone else, the call fails with a permission error rather than handing over the environment's credentials. Connecting an integration doesn't widen anyone's access; it makes an environment the user could already open convenient for Neo to reach. Scope each integration's ESC environment to what Neo needs — prefer a read-only cloud role and broaden it deliberately. ## VCS identity per provider diff --git a/content/docs/ai/concepts/neo/settings/index.md b/content/docs/ai/concepts/neo/settings/index.md index a18edec75acd..d49d0e3e1069 100644 --- a/content/docs/ai/concepts/neo/settings/index.md +++ b/content/docs/ai/concepts/neo/settings/index.md @@ -56,8 +56,6 @@ If you'd rather keep Neo on but disable specific capabilities, use the per-featu To disable [Neo code reviews](/docs/ai/concepts/neo/code-reviews/), select the "Code reviews" tab in Neo Settings and turn off "Enable code reviews". -![Neo access settings](toggle-neo-access.png) - {{% notes type="info" %}} If Neo was previously disabled, it will need to be enabled as outlined above. {{% /notes %}} @@ -80,7 +78,7 @@ The **Organization instructions** tab and the slash commands section of the **Ge Neo can connect to third-party services like issue trackers, observability platforms, and incident response tools, giving tasks the ability to query external tools alongside your infrastructure. Integrations are configured in the **Integrations** tab of Neo Settings, where administrators can enable services and provide credentials. -See [Integrations](/docs/ai/integrations/) for the full list of available integrations, setup instructions, and credential storage details. +See [Integrations](/docs/ai/integrations/) for the available integrations and how to set them up, and [credential storage](/docs/ai/integrations/external-mcp-servers/#credential-storage) for how Neo stores their credentials. ## Task modes diff --git a/content/docs/ai/concepts/neo/settings/toggle-neo-access.png b/content/docs/ai/concepts/neo/settings/toggle-neo-access.png deleted file mode 100644 index 18922533f91d645e8029ae959a6db4b21c3befb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 195995 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 O@21M_Yk61AAO07teii=! From a0f9eccbc89f07c61ac30c6a5362aec5dba502b8 Mon Sep 17 00:00:00 2001 From: Josh Kodroff Date: Thu, 22 Oct 2026 16:28:00 -0400 Subject: [PATCH 4/4] Address pre-merge review: say where per-feature controls live (F8) Co-Authored-By: Claude Opus 5.5 --- content/docs/ai/concepts/neo/settings/index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/docs/ai/concepts/neo/settings/index.md b/content/docs/ai/concepts/neo/settings/index.md index d49d0e3e1069..9747c86e2e99 100644 --- a/content/docs/ai/concepts/neo/settings/index.md +++ b/content/docs/ai/concepts/neo/settings/index.md @@ -54,6 +54,8 @@ If you'd rather keep Neo on but disable specific capabilities, use the per-featu - **Enable Neo CLI explanations**: AI explanations served to the Pulumi CLI - **Enable natural-language resource search**: Searching your resources with natural-language queries +The per-feature controls are on the same **General** tab, below the master switch. + To disable [Neo code reviews](/docs/ai/concepts/neo/code-reviews/), select the "Code reviews" tab in Neo Settings and turn off "Enable code reviews". {{% notes type="info" %}}