From hex-pack
Generates TypeScript code for Hex API: list projects, trigger runs with params, poll completion, access results. For new integrations, setup testing, or API learning.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin hex-packThis skill is limited to using the following tools:
List projects, trigger a project run, and poll for results using the Hex API. The core workflow is: trigger a run of a published project, poll for completion, then access the results.
Applies Hex SDK patterns for TypeScript (retry, polling) and Python (hextoolkit client, Airflow operator) to run data projects reliably.
Presents menu of 8 pre-built harness use cases for research/analysis, content creation, media/marketing, engineering; launches selected one via harness:harness skill.
Guides Next.js Cache Components and Partial Prerendering (PPR): 'use cache' directives, cacheLife(), cacheTag(), revalidateTag() for caching, invalidation, static/dynamic optimization. Auto-activates on cacheComponents: true.
Share bugs, ideas, or general feedback.
List projects, trigger a project run, and poll for results using the Hex API. The core workflow is: trigger a run of a published project, poll for completion, then access the results.
hex-install-auth setup// hello-hex.ts
import 'dotenv/config';
const TOKEN = process.env.HEX_API_TOKEN!;
const BASE = 'https://app.hex.tech/api/v1';
async function listProjects() {
const response = await fetch(`${BASE}/projects`, {
headers: { 'Authorization': `Bearer ${TOKEN}` },
});
const projects = await response.json();
for (const p of projects) {
console.log(`${p.name} (${p.projectId}) — ${p.status}`);
}
return projects;
}
async function runProject(projectId: string, inputParams?: Record<string, any>) {
const response = await fetch(`${BASE}/project/${projectId}/run`, {
method: 'POST',
headers: { 'Authorization': `Bearer ${TOKEN}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
inputParams: inputParams || {},
updateCacheResult: true,
}),
});
const { runId, projectId: pid, runStatusUrl } = await response.json();
console.log(`Run started: ${runId}`);
console.log(`Status URL: ${runStatusUrl}`);
return { runId, projectId: pid, runStatusUrl };
}
async function waitForRun(projectId: string, runId: string, timeoutMs = 300000): Promise<any> {
const startTime = Date.now();
while (Date.now() - startTime < timeoutMs) {
const response = await fetch(`${BASE}/project/${projectId}/run/${runId}`, {
headers: { 'Authorization': `Bearer ${TOKEN}` },
});
const status = await response.json();
console.log(`Run ${runId}: ${status.status}`);
if (status.status === 'COMPLETED') return status;
if (status.status === 'ERRORED' || status.status === 'KILLED') {
throw new Error(`Run failed: ${status.status}`);
}
await new Promise(r => setTimeout(r, 5000)); // Poll every 5s
}
throw new Error('Run timed out');
}
async function main() {
const projects = await listProjects();
if (projects.length === 0) { console.log('No projects found'); return; }
const project = projects[0];
const { runId } = await runProject(project.projectId, { date: '2025-01-01' });
const result = await waitForRun(project.projectId, runId);
console.log('Run completed:', result);
}
main().catch(console.error);
# List projects
curl -s -H "Authorization: Bearer $HEX_API_TOKEN" \
https://app.hex.tech/api/v1/projects | python3 -m json.tool
# Trigger a run
curl -X POST -H "Authorization: Bearer $HEX_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"inputParams": {}}' \
https://app.hex.tech/api/v1/project/PROJECT_ID/run | python3 -m json.tool
| Error | Cause | Solution |
|---|---|---|
401 | Invalid token | Regenerate API token |
403 | Read-only token | Create token with "Run projects" scope |
404 | Project not found | Verify project ID, ensure it's published |
| Run ERRORED | Project code failed | Check Hex project logs |
Proceed to hex-local-dev-loop for development workflow.