Claude-code-plugins-plus-skills veeva-hello-world
install
source · Clone the upstream repo
git clone https://github.com/jeremylongshore/claude-code-plugins-plus-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/jeremylongshore/claude-code-plugins-plus-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/plugins/saas-packs/veeva-pack/skills/veeva-hello-world" ~/.claude/skills/jeremylongshore-claude-code-plugins-plus-skills-veeva-hello-world && rm -rf "$T"
manifest:
plugins/saas-packs/veeva-pack/skills/veeva-hello-world/SKILL.mdsource content
Veeva Vault Hello World
Overview
Create, retrieve, and query documents in Veeva Vault -- the fundamental CRUD operations. Uses the Vault REST API with VQL (Vault Query Language) for data retrieval.
Instructions
Step 1: Query Documents with VQL
import requests, os vault_url = "https://myvault.veevavault.com/api/v24.1" headers = {"Authorization": session_id} # VQL is SQL-like but Vault-specific query = "SELECT id, name__v, type__v, status__v, created_date__v FROM documents LIMIT 10" response = requests.post(f"{vault_url}/query", headers=headers, data={"q": query}) result = response.json() for doc in result.get("data", []): print(f"{doc['name__v']} | Type: {doc['type__v']} | Status: {doc['status__v']}")
Step 2: Retrieve a Document
doc_id = 123 response = requests.get(f"{vault_url}/objects/documents/{doc_id}", headers=headers) doc = response.json() print(f"Document: {doc['document']['name__v']}") print(f"Version: {doc['document']['major_version_number__v']}.{doc['document']['minor_version_number__v']}")
Step 3: Create a Document
# Create document metadata doc_data = { "name__v": "Protocol Amendment 001", "type__v": "Trial Document", "subtype__v": "Protocol", "lifecycle__v": "General Lifecycle", } response = requests.post(f"{vault_url}/objects/documents", headers=headers, data=doc_data) new_id = response.json()["id"] print(f"Created document: {new_id}")
Step 4: Upload Document File
with open("protocol.pdf", "rb") as f: response = requests.post( f"{vault_url}/objects/documents/{new_id}/file", headers={**headers, "Content-Type": "application/octet-stream"}, data=f, ) print(f"File uploaded: {response.json()['responseStatus']}")
Output
Protocol Amendment 001 | Type: Trial Document | Status: Draft Document: Protocol Amendment 001 Version: 0.1 Created document: 456 File uploaded: SUCCESS
Error Handling
| Error | Cause | Solution |
|---|---|---|
in VQL | Wrong field name | Check object metadata |
| Missing required field | Add type__v, lifecycle__v |
| Wrong document state | Check lifecycle state |
Resources
Next Steps
Proceed to
veeva-local-dev-loop for development workflow.