Set up a new project
You start a service and want your agents to test first, review Python Agent SDK code and read your internal docs. Four commands give Claude Code and Codex the same setup, and one commit gives it to everyone else.
When you finish, these files exist and all of them are committed:
Folder.agents/
Folderskills/
Foldergrill-me/
Folderagents/
- openai.yaml
- SKILL.md
Foldertdd/
Folderagents/
- openai.yaml
Folderreferences/
- mocking.md
- SKILL.md
Folder.claude/
Folderagents/
- agent-sdk-verifier-py.md
Folderskills/
Foldergrill-me/
- SKILL.md
Foldertdd/
Folderreferences/
- mocking.md
- SKILL.md
Folder.codex/
Folderagents/
- agent-sdk-verifier-py.toml
- config.toml
- .gitignore
- .mcp.json
- palm.lock.yaml
- palm.yaml
Before you start
Section titled “Before you start”- palm is installed, and the project is a git repository.
- You know which harnesses the team uses. This guide uses Claude Code and Codex.
-
Declare the targets.
Terminal window palm init --target claude,codexCommitting
targets:means every clone installs for the same harnesses, whatever each laptop has. -
Install two skills from one repository.
Terminal window palm install mattpocock/skills tdd grill-meName as many entities as you want after the source. Not sure what a repository offers? Run
palm install mattpocock/skillsfirst. It lists everything and writes nothing. -
Install an agent from another repository.
Terminal window palm install anthropics/claude-plugins-official agent-sdk-verifier-pyThe agent names a skill and an MCP server it likes to use. palm prints the command for them and installs only what you named.
-
Add the docs MCP server.
Terminal window palm install mcp docs --url https://docs.example.com/mcp --header 'Authorization=Bearer ${DOCS_TOKEN}'The token stays in your environment. Each harness gets its own spelling of the reference.
~/project $ palm init --target claude,codex+ wrote palm.yaml: targets claude, codex+ wrote .gitignore: .palm/local/, palm.local.yamlnext: see what a source offers, for example: palm install mattpocock/skills$ palm install mattpocock/skills tdd grill-mei ref ^1.2 saved to palm.yaml (latest tag v1.2.3); edit ref: to track main+ skill tdd .agents/skills/tdd/, .claude/skills/tdd/ 5 files from mattpocock/skills v1.2.3 (claude gets its own copy in .claude/skills)+ skill grill-me .agents/skills/grill-me/, .claude/skills/grill-me/ 3 files from mattpocock/skills v1.2.32 installed. Commit palm.yaml, palm.lock.yaml, .agents/ and .claude/ together.$ palm install anthropics/claude-plugins-official agent-sdk-verifier-pyi agent agent-sdk-verifier-py preloads skill sdk-helper, mcp context7, not installed: palm install anthropics/claude-plugins-official sdk-helper mcp:context7i ref main saved to palm.yaml; edit ref: to pin a tag+ agent agent-sdk-verifier-py .claude/agents/agent-sdk-verifier-py.md, .codex/agents/agent-sdk-verifier-py.toml 2 files from anthropics/claude-plugins-official main.codex/agents/agent-sdk-verifier-py.toml: dropped model (sonnet), tools, skills, mcpServers, color (not supported by Codex)1 installed. Commit palm.yaml, palm.lock.yaml and .codex/ together.$ palm install mcp docs --url https://docs.example.com/mcp --header 'Authorization=Bearer ${DOCS_TOKEN}'+ mcp docs .mcp.json, .codex/config.toml merged (needs DOCS_TOKEN in the environment)1 installed. Commit palm.yaml, palm.lock.yaml and .mcp.json together. -
Commit and check.
Terminal window git add -Agit commit -m "Add the agent setup"palm checkCommit first:
palm checkwarns about generated files git does not track yet.
Check the result
Section titled “Check the result”$ cat palm.yamltargets: [claude, codex]sources: mattpocock/skills: ref: ^1.2 skills: [tdd, grill-me] anthropics/claude-plugins-official: ref: main agents: [agent-sdk-verifier-py]mcp: docs: url: https://docs.example.com/mcp headers: {Authorization: "Bearer ${DOCS_TOKEN}"}$ palm check✓ manifest and lock agree✓ palm.yaml targets match the lock✓ every entry is rendered✓ every entry is on all its targets✓ generated files match the lock✓ no stray file in a folder palm owns- applied files outside the lock: skipped (global scope only)✓ in-repo sources match the lock✓ no generated path lies inside a source✓ every program palm installed is trusted✓ no foreign command in the hook files palm manages✓ no foreign stdio server in the MCP files palm manages✓ every hook script exists✓ no literal secret in generated files! 1 server needs variables that are not set✓ generated files are committed✓ every source is declared✓ no link leaves the scope✓ no hidden Unicode in generated files✓ no harness loads an entity twice✓ no two agents or commands share a name in a harness folder! 1 agent preloads what is not installed✓ instruction files are within harness limits
! mcp docs: needs DOCS_TOKEN, which is not set; fix: export DOCS_TOKEN=…! agent agent-sdk-verifier-py preloads skill sdk-helper, mcp context7, not installed; fix: palm install anthropics/claude-plugins-official sdk-helper mcp:context7palm.yaml reads like a dependency list: two sources with their ranges, what you took from each, and one hand-declared server.
palm check passes with two warnings.
DOCS_TOKEN is not set in this shell: export it before you start Claude Code or Codex.
The agent preloads a skill and a server the project does not install: the warning prints the palm install line for them, if you want them.
Next steps
Section titled “Next steps”- Add the same check to CI. See Check the setup in CI.
- Invite the team. See Share a team baseline.
- Write a project-specific skill with
palm create skill <name>. See Publish your own source.