One command takes a CSA laptop from bare to AI-capable — on macOS and Windows.
Not just the apps. By the time a run finishes, the AI can reach CSA's actual work: your
Zendesk tickets, your Gmail and Calendar, comments on a Google Doc, courses and learners in
Skilljar. That is the point — so the question stops being "can the AI do this?" and becomes
"should we?" (see BUSINESS-CASE.md).
macOS — paste it into Terminal:
bash -c "$(curl -fsSL -H 'Cache-Control: no-cache' https://raw.githubusercontent.com/CloudSecurityAlliance/DesktopSetup/HEAD/scripts/macos-ai-tools.sh)"Windows — PowerShell needs one setting changed first (four short steps, five minutes, one-time). Then, in a regular PowerShell window:
irm https://raw.githubusercontent.com/CloudSecurityAlliance/DesktopSetup/HEAD/scripts/windows-ai-tools.ps1 -Headers @{'Cache-Control'='no-cache'} | iexThat is the whole thing. 10–30 minutes, and it is safe to re-run any number of times — it shows you its plan and asks before it changes anything. Re-running is also how you pick up a new MCP server later, so this one command stays the answer.
If you come back wanting something narrower — just the CSA layer, or the productivity apps — see Other scripts at the end. You do not need it today.
Claude Desktop and ChatGPT Desktop; the Claude Code, Codex and Gemini CLIs;
1Password (app + CLI); Git and GitHub CLI with your identity configured from your GitHub
profile; Node, Python (via uv), pandoc and typst; a curated set of Claude Code plugins; and
four CSA MCP servers if your GitHub account has CSA-Internal access:
| Server | What the AI can then do |
|---|---|
csa-zendesk |
read, triage, comment on and solve support tickets |
csa-google-gmail-calendar |
read and send mail, manage calendar events |
csa-google-workspace |
read and write Docs, Sheets and Slides, and their comment threads |
csa-skilljar |
manage courses, lessons, quizzes, learners and enrolment |
The installer also detects tools installed the wrong way — Claude Code via Homebrew or npm, for instance — and migrates them to the correct installer, preserving settings.
The command is at the top under Run this. Beyond the list above it installs a base
layer first if it is missing — Xcode CLI Tools, Homebrew, Node/npm, uv, Python —
plus the document toolchain (pandoc, typst, and pyyaml/pymupdf in ~/.default_venv)
that the document-pipeline plugin needs to render CSA PDFs.
Why
-H 'Cache-Control: no-cache'? It forces a fresh download. Without it a stale copy can sit in GitHub's CDN edge cache for a few minutes after a fix ships. Keep the header.
Windows needs a one-time PowerShell setup before any script in this repo will run.
Not your personal machine? The execution policy is a security setting. If this is a work laptop managed by your IT department, ask them before changing it.
Step 1 — Check your current policy. Open PowerShell as Administrator (Windows key, type
powershell, right-click Windows PowerShell, Run as administrator):
Get-ExecutionPolicyNote what it says — usually Restricted on a fresh install. You will restore this in Step 4.
Step 2 — Temporarily allow script execution:
Set-ExecutionPolicy RemoteSignedAnswer Y when it asks.
Step 3 — Run it. Close the Administrator window and open a regular PowerShell window:
irm https://raw.githubusercontent.com/CloudSecurityAlliance/DesktopSetup/HEAD/scripts/windows-ai-tools.ps1 -Headers @{'Cache-Control'='no-cache'} | iexInstalls Git, GitHub CLI, Python, Node.js, pandoc and typst via winget alongside the AI apps
and CLIs, plus pyyaml and pymupdf for document-pipeline. Needs Windows 10/11 and winget.
Step 4 — Restore the original policy. Re-open PowerShell as Administrator and set it back to whatever Step 1 reported:
Set-ExecutionPolicy RestrictedIf you expect to run PowerShell scripts regularly, leaving it at RemoteSigned is reasonable.
The last thing on screen is a short numbered list of what still needs you. It is the only part you have to act on, and it is deliberately last — it used to be buried under ~140 lines of install output.
Three kinds of item show up:
- Restart Claude Desktop. A newly registered MCP server is invisible to it until then.
- Sign in. Three of the four servers can do this in the conversation — just say "sign me in to Gmail" in Claude Code and follow the link. A terminal command is listed as the fallback.
- Something only another person can do — for example, Skilljar needs a credential issued to you.
If a server does not appear in Claude Code afterwards, the usual cause is item 1.
Replace ORG/REPO with the real org and repository.
# macOS
bash -c "$(curl -fsSL -H 'Cache-Control: no-cache' https://raw.githubusercontent.com/CloudSecurityAlliance/DesktopSetup/HEAD/scripts/clone-and-claude.sh)" -- ORG/REPO# Windows
$env:CSA_REPO='ORG/REPO'; irm https://raw.githubusercontent.com/CloudSecurityAlliance/DesktopSetup/HEAD/scripts/clone-and-claude.ps1 -Headers @{'Cache-Control'='no-cache'} | iexChecks prerequisites, clones to ~/GitHub/OrgName/RepoName, and tells you how to launch Claude
Code. Safe to re-run: if the repo is already there it pulls instead of cloning.
This is the one to reach for when there is a new or updated CSA MCP server. No Homebrew, winget, npm or pip; it finishes in well under a minute.
# macOS
bash -c "$(curl -fsSL -H 'Cache-Control: no-cache' https://raw.githubusercontent.com/CloudSecurityAlliance/DesktopSetup/HEAD/scripts/macos-plugins.sh)"# Windows
irm https://raw.githubusercontent.com/CloudSecurityAlliance/DesktopSetup/HEAD/scripts/windows-plugins.ps1 -Headers @{'Cache-Control'='no-cache'} | iexHomebrew/winget, npm globals, pip, Claude Code, and then the CSA layer. Takes a snapshot of every installed version first, so you can see what changed if something breaks.
# macOS
bash -c "$(curl -fsSL -H 'Cache-Control: no-cache' https://raw.githubusercontent.com/CloudSecurityAlliance/DesktopSetup/HEAD/scripts/macos-update.sh)"# Windows
irm https://raw.githubusercontent.com/CloudSecurityAlliance/DesktopSetup/HEAD/scripts/windows-update.ps1 -Headers @{'Cache-Control'='no-cache'} | iexSnapshots land in ~/Library/Logs/CSA-DesktopSetup/ (macOS) or
%LOCALAPPDATA%\CSA-DesktopSetup\ (Windows), timestamped.
# macOS
brew update && brew upgrade # Homebrew formulas and casks
npm update -g # npm globals (Codex, Gemini, Wrangler)
pip install --upgrade pip
claude update # Claude Code# Windows
winget upgrade --all; npm update -g; python -m pip install --upgrade pip; claude updateNote that doing it by hand skips the CSA layer entirely — no plugins, no MCP servers.
You almost certainly want Run this instead — re-running it picks up everything, including new MCP servers. This section is for the cases where you want to be narrower, and it spells out both platforms' filenames because there is no single name that covers them.
| I want to… | macOS | Windows | Takes |
|---|---|---|---|
| Set up a machine (what Run this does) | macos-ai-tools.sh |
windows-ai-tools.ps1 |
10–30 min |
| Add the productivity apps | macos-work-tools.sh |
windows-work-tools.ps1 |
+10 min |
| Just the CSA layer — plugins and MCP servers | macos-plugins.sh |
windows-plugins.ps1 |
under a minute |
| Update everything — Homebrew/winget, npm, pip, Claude Code and the CSA layer | macos-update.sh |
windows-update.ps1 |
5–20 min |
| Clone a CSA repo and start working in it | clone-and-claude.sh |
clone-and-claude.ps1 |
seconds |
Every one is idempotent — safe to re-run, any number of times — and every one shows its plan and asks before changing anything.
The
pluginsscripts are named badly, and we know. They install and upgrade every CSA MCP server as well as plugins, so the name undersells them by half. The filenames stay because they are in one-liners people have already saved — see ADR-003.
Optional, and independent of the AI tools.
macOS — 1Password, Slack, Zoom, Chrome, Microsoft Office, Git, GitHub CLI. An optional dev profile adds VS Code, AWS CLI and Wrangler.
bash -c "$(curl -fsSL -H 'Cache-Control: no-cache' https://raw.githubusercontent.com/CloudSecurityAlliance/DesktopSetup/HEAD/scripts/macos-work-tools.sh)"Windows — Git, GitHub CLI, 1Password, Slack, Zoom, Chrome, Microsoft Office, with the same optional dev profile. Needs the execution policy from Step 2 above.
irm https://raw.githubusercontent.com/CloudSecurityAlliance/DesktopSetup/HEAD/scripts/windows-work-tools.ps1 -Headers @{'Cache-Control'='no-cache'} | iexThe profile is chosen interactively. A non-interactive run always installs core only.
The AI tools installers and the updaters install a curated set of Claude Code plugins, so CSA staff can use them immediately and see what is possible. Public plugins install for everyone; CSA-marketplace plugins install only if your GitHub account can reach the private CSA marketplaces.
- superpowers — brainstorming, writing-plans, TDD, systematic-debugging, code review, verification, dispatching-parallel-agents, using-git-worktrees
- feature-dev —
/brainstorm,/write-plan,/execute-plan,/implement,/finish-branch - claude-code-setup — claude-automation-recommender (scan a repo, recommend hooks/agents/skills)
- claude-md-management —
/initimprovements, claude-md-improver - session-report — HTML report of tokens, cache, skills, expensive prompts
- explanatory-output-style — toggle: add educational explanations to responses
- learning-output-style — toggle: interactive learning with contribution requests
- commit-commands —
/commit,/commit-push-pr,/clean_gone - code-review —
/review - pr-review-toolkit —
/review-pr, multi-agent PR review (silent-failure-hunter, type-design-analyzer, pr-test-analyzer, comment-analyzer, code-simplifier) - github — GitHub MCP (issues, PRs, code search, releases, reviews)
- frontend-design — polished UI code that avoids generic AI aesthetics
- playwright — browser automation and UI testing via Playwright MCP
- chrome-devtools-mcp — Chrome DevTools MCP (debugging, performance, a11y, LCP)
- playground — single-file interactive HTML explorers
- typescript-lsp — TypeScript language server integration
- security-guidance — security review and guidance
- cloudflare — Workers, Pages, D1/R2/KV, Durable Objects, Agents SDK, Wrangler
- claude-api — Claude API / Anthropic SDK (migrations, caching, tool use, batching)
- agent-sdk-dev —
/new-sdk-app, Agent SDK verifiers - mcp-server-dev — build-mcp-server, build-mcp-app, build-mcpb (local .mcpb bundles)
- plugin-dev —
/create-plugin, plugin-structure, command/agent/skill/hook development - skill-creator — create, edit, and benchmark skills
- pydantic-ai — Pydantic AI framework
- slack —
/standup,/find-discussions,/summarize-channel,/draft-announcement,/channel-digest - document-skills — docx, pptx, pdf, xlsx, canvas-design, brand-guidelines, internal-comms, theme-factory, webapp-testing
- example-skills — reference implementations of the document skills above
- cwe-analysis — CWE assignment, chains, AI relevance
- incident-analysis — OSINT, timeline, impact, defensive recs for cloud/AI incidents
- nist-ir-8477-mapping — map between frameworks using NIST IR 8477
- security-knowledge-ingestion — convert standards/regs into structured data
- document-pipeline — Markdown to a branded, accessible CSA PDF (render, preflight, copy edit, design review). Needs
pandocandtypst— see its README - vendor-research — guided vendor evaluation and procurement decisions
- csa-spreadsheets — parse CCM/AICM spreadsheets into JSON, CSV, or Markdown
- cino-project-tracker — CINO Airtable project registry
- audience-lens — build audience profiles for writing tasks
- writing-style-forge — generate writing-style plugins from samples
- research-initiative-tracker — CSA research initiative tracking
- csa-certification-development, csa-training-content-development, csa-training-design-system — training & certification workflows
The lists live in scripts/csa-plugins.txt and
scripts/csa-plugins-internal.txt — edit those to change
what installs by default. A list-only change reaches everyone on their next run, with no script
update needed. Disable any single plugin locally with claude plugin disable <name>.
Re-run the same command with CSA_DEBUG set. Everything still prints to screen, and a full
transcript — every command, its output, its exit code, and what the machine looked like — is
written to a file in your home directory. Works on every script here.
CSA_DEBUG=1 bash -c "$(curl -fsSL -H 'Cache-Control: no-cache' https://raw.githubusercontent.com/CloudSecurityAlliance/DesktopSetup/HEAD/scripts/macos-ai-tools.sh)"CSA_DEBUG=1 goes before bash, as a prefix on the same line. That is what makes it reach
the script.
Paste these one at a time. Copying both lines together into the console has been observed to close the window immediately, before either line runs. Two separate pastes — or the single-line form below — both avoid it.
Turn logging on:
$env:CSA_DEBUG = '1'Then run the script:
irm https://raw.githubusercontent.com/CloudSecurityAlliance/DesktopSetup/HEAD/scripts/windows-ai-tools.ps1 -Headers @{'Cache-Control'='no-cache'} | iexThe variable stays set for the rest of that window, so a second run also logs. To stop:
Remove-Item Env:\CSA_DEBUGOr as a single line, if you would rather paste once:
$env:CSA_DEBUG = '1'; irm https://raw.githubusercontent.com/CloudSecurityAlliance/DesktopSetup/HEAD/scripts/windows-ai-tools.ps1 -Headers @{'Cache-Control'='no-cache'} | iexThere is no -Debug switch, and both obvious guesses go wrong:
| what you might type | what actually happens |
|---|---|
irm ... --Debug ... | iex |
fails immediately — "a positional parameter cannot be found that accepts argument '--Debug'" |
irm ... -Debug ... | iex |
runs, and logs nothing. -Debug is a real parameter on irm — it applies to the download, not to the script iex then executes |
Why there is no switch: irm … | iex fetches text and executes it, so the script never receives
an argument vector for a flag to arrive in. An environment variable is the only thing that
crosses that boundary — which is also how NONINTERACTIVE works.
Either spelling is accepted, since $env: is easy to forget. These are alternatives, not a
sequence — use one:
$env:CSA_DEBUG = '1'$CSA_DEBUG = '1'So is any of 1, true, yes or on, in any case.
The path is printed at the start and again at the end:
~/desktopsetup-YYYYMMDD-HHMMSS.log (macOS)
C:\Users\<you>\desktopsetup-YYYYMMDD-HHMMSS.log (Windows)
Readable only by you (mode 0600, or an ACL granting just your account). One file covers the whole run, including the CSA-internal setup that runs as a separate process — so there is only ever one file to send.
It exists even if the run stops early. A script that refuses to proceed — wrong platform, running as Administrator, a missing prerequisite — still leaves a log saying which check refused, because that is exactly when you want one.
Known credential shapes (tokens, client secrets, bearer headers, refresh tokens) are replaced
with <redacted> before anything is written, the CSA OAuth client is never captured at all, and
the snapshot records key names rather than values. That is a safety net, not a guarantee:
read the file before you send it to anyone. The first line of every log says the same.
macos-mcp-setup.sh discovered Airtable and GitHub personal access tokens and wrote them into
the Claude Code, Codex and Gemini configs. It is retired — those services are now reachable
as hosted connectors over OAuth, with no long-lived token stored on disk. The script is kept in
archives/ for reference.
If you ran it, you may still have tokens on disk. Look for airtable or github MCP entries
carrying a bearer token in ~/.claude.json, ~/.codex/config.toml and ~/.gemini/settings.json,
remove any you no longer use, then revoke the token at the service. Nothing removes them for you.
The CINO standard file set. Written after reading the repository rather than from a template, and
where something does not apply it says so and says why — per
a-standard-file-filled-from-the-template-is-worse-than-a-missing-one.
ENGINEERING.md— start here if you are changing anything. The repository's facts: the ten scripts, whymainis the release, the PowerShell 5.1 behaviour the wrappers exist for, the parity contract, the guard layerBUSINESS-CASE.md— why this exists: moving the question from can the AI do this to should weGOALS.md— what success looks like, read off this repository's record with the evidence linked inlineRACI.md— who is accountable, and the bus factor of oneDECISIONS-ADR.md— six local technical decisions and what each rejectedFRICTION.md— work that is harder than it should be, for a human or an AIWAITING-FOR.md— blocked work, each entry with an observable triggerTODO.md— open work, one line per itemOPERATIONAL-RESOURCES.md— no running service; the runtime dependencies that exist anyway, two of them CSA's ownBACKUP-RESOURCES.md— no state of our own; the backups these scripts write onto user machines, and the retention gapCLAUDE.md/AGENTS.md— thin pointers toENGINEERING.mdplus what is specific to each AI coding tool
Ten scripts, five macOS/Windows pairs — each self-contained and idempotent.
macos-ai-tools.sh/windows-ai-tools.ps1— the AI layer: desktop apps, coding CLIs, plugins, and every CSA MCP servermacos-work-tools.sh/windows-work-tools.ps1— core work apps plus an optional dev profilemacos-update.sh/windows-update.ps1— update everything, with a version snapshot firstmacos-plugins.sh/windows-plugins.ps1— CSA plugins and MCP servers only; the fast pathclone-and-claude.sh/clone-and-claude.ps1— clone a CSA repo and start Claude Codecsa-claude-connectors.py— disable chosen claude.ai connectors so the CSA Google MCP servers are used instead. Report-only unless--apply. Each file it changes is copied to.bak-<stamp>first, and those copies hold your Claude credentials — the three most recent of each are kept, so delete them once you are happy (#143)csa-plugins.txt/csa-plugins-internal.txt— the plugin lists, fetched at runtime
Eleven repo-specific checks and ten test files. ./tools/check-all.sh mirrors CI exactly —
run it before opening a pull request. See ENGINEERING.md for what it proves
and what it does not.
Design notes, the weekly source-sweep runbook, and previous script versions for reference.
Found a problem? Have a suggestion?
Open an issue — there are templates for common requests. If you are sending a bug report, a debug-mode log is the single most useful thing to attach — read it first.
Changing the scripts? ENGINEERING.md first, and run ./tools/check-all.sh.
Apache License 2.0 — see LICENSE.