[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71KNHGB7HPMAAJC73AP9Q2A":3,"skill-same:01M71KNHGB7HPMAAJC73AP9Q2A":79},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":49,"commitSha":50,"skillDirectory":51,"forksCount":52,"repositoryHtmlUrl":53,"repositoryHomepageUrl":54,"ownerHtmlUrl":55,"ownerBlogUrl":56,"ownerDescription":57,"updatedAt":58,"install":59,"resources":72},"01M71KNHGB7HPMAAJC73AP9Q2A","query-integration-data",null,"Query and modify data in any connected integration (Linear, GitHub, HubSpot, Slack, Google services, etc.) or connected data warehouse (Databricks, Snowflake, BigQuery). Use listConnections() in the code_execution sandbox to get credentials, then call APIs directly. Supports read operations (queries, counts, exports) and write operations (create, update, delete).","clawdsolana\u002FOpenClawd","clawdsolana","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F279036008?v=4","01M71JTVF9FNGKE2SVJRPTQM31","OpenClawd","01M71JTVGCKWBSS8ZYC1HYWVA5",2,"MIT","https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd\u002Fblob\u002Fmain\u002Fskills\u002Fquery-integration-data\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"data","query integration data","integration","query","sandbox","modify","warehouse","linear","hubspot","google","write","read","update","slack","delete","credentials","create","code","snowflake","get","2026-11-10 10:56:23",false,"---\nname: query-integration-data\ndescription: Query and modify data in any connected integration (Linear, GitHub, HubSpot, Slack, Google services, etc.) or connected data warehouse (Databricks, Snowflake, BigQuery). Use listConnections() in the code_execution sandbox to get credentials, then call APIs directly. Supports read operations (queries, counts, exports) and write operations (create, update, delete).\n---\n\n# Query Integration Data Skill\n\nConnect to any Replit-supported integration to read or write data — query issues, create tickets, send messages, update contacts, manage files, etc. This also includes querying supported data warehouse integrations like Databricks, Snowflake, and BigQuery.\n\nAll code runs inline in the `code_execution` sandbox — no script files needed.\n\n## When to Use\n\nUse this skill when the user asks you a **question in chat** that requires data from external services to answer, or when they need to perform data operations without building a visual interface.\n\n- **Answer questions**: Query data to respond to user questions in the conversation (e.g., \"How many issues were created this week?\")\n- **Fetch and export data**: Export data to CSV\u002FJSON for later use or analysis\n- **Write operations**: Create, update, delete, or modify data in a service\n- **Ad-hoc queries**: One-time data lookups or investigations\n- **Automate tasks**: Perform multi-step operations across the API\n\n**Key point:** Use this skill when the output is an answer or data file, NOT when building a dashboard or visualization interface.\n\n## When NOT to Use\n\n- **The user wants to create a dashboard, visualization, or analytics interface** - use the `data-visualization` skill (it handles data fetching internally)\n- **The user asks to \"build\", \"create\", or \"make\" a dashboard\u002Fapp with data** - use the `data-visualization` skill\n- The user needs to add an integration to their app (use the `integrations` skill)\n- Production database operations (use the database pane directly)\n- Asks to check deployment or server logs (use the `deployment` skill)\n\n## File Structure\n\n```text\n.agents\u002F\n└── outputs\u002F         # Generated artifacts (CSV, JSON, etc.)\n```\n\nCode runs inline in the `code_execution` sandbox — no script files are needed.\n\n## Workflow\n\n```text\n1. CHECK      → listConnections(connectorName) to get existing credentials\n   ├─ connections exist → EXECUTE → OUTPUT\n   └─ empty array      → SEARCH → LEARN → CLARIFY → setup via `integrations` skill → EXECUTE → OUTPUT\n```\n\n- **CHECK**: Call `listConnections(connectorName)` in the `code_execution` sandbox. If it returns connections, you already have credentials — skip straight to EXECUTE.\n- **SEARCH → CONNECT** (only when no connections exist): Use `searchIntegrations`, `proposeIntegration`, and `addIntegration` to set up a new connection. See the `integrations` skill for the full lifecycle details.\n- **EXECUTE**: Write and run code in the `code_execution` sandbox.\n- **OUTPUT**: Return the answer or confirmation to the user.\n\n## Getting Connection Credentials\n\n### Primary: `listConnections(connectorName)`\n\nThis is the main way to get credentials. It's a pre-registered function in the `code_execution` sandbox.\n\n```javascript\nconst conns = await listConnections('linear');\nconsole.log(conns.map(c => ({ id: c.id, displayName: c.displayName, status: c.status })));\n```\n\nEach connection object has:\n\n- `id`, `connectorConfigId`, `status`, `displayName`, `metadata`, `environment`\n- `settings` — credentials dict (access tokens, API keys, etc.)\n- `getClient()` — returns the `settings` object for constructing SDK clients\n\nReturns an empty array when no connections are configured.\n\n```javascript\nconst conns = await listConnections('linear');\nif (conns.length > 0) {\n  const token = conns[0].settings.access_token;\n  const { LinearClient } = await import('@linear\u002Fsdk');\n  const client = new LinearClient({ accessToken: token });\n  \u002F\u002F Ready to query\n}\n```\n\n### Fallback: Setting Up a New Connection\n\nIf `listConnections` returns an empty array, the user hasn't connected the service yet. Use `searchIntegrations` to find the connector, then follow the `integrations` skill to walk the user through setup (`addIntegration` and `proposeIntegration` — order depends on integration type). After the connection is established, `listConnections` will return it.\n\n### Browse the Documentation\n\n**Always browse `public_documentation_link`** before writing code, especially for write operations. This helps you understand:\n\n- Required vs optional fields for creating resources\n- Valid values for enums (status, priority, type, etc.)\n- Relationships between resources (e.g., issues belong to projects)\n- Rate limits and best practices\n\n## Clarifying Questions\n\n**Before write operations, gather required information.** Many APIs require IDs or specific values that the user may not know.\n\n### When to Ask\n\nAsk clarifying questions when the user's request requires:\n\n- **Entity selection**: \"Which project should this issue be created in?\"\n- **User assignment**: \"Who should be assigned? Let me list the team members...\"\n- **Required fields**: \"What priority - urgent, high, medium, or low?\"\n- **Ambiguous references**: \"I found 3 projects matching 'backend'. Which one?\"\n\n### Pattern: Fetch Options First\n\nFor write operations, often run a read query first to get valid options:\n\n```javascript\n\u002F\u002F User says: \"Create a Linear ticket assigned to John\"\n\u002F\u002F Problem: Need John's user ID, not just name\n\nconst conns = await listConnections('linear');\nconst { LinearClient } = await import('@linear\u002Fsdk');\nconst client = new LinearClient({ accessToken: conns[0].settings.access_token });\n\n\u002F\u002F Step 1: List users to find John's ID\nconst users = await client.users();\nconst john = users.nodes.find(u => u.name.includes('John'));\n\n\u002F\u002F Step 2: If ambiguous, ASK the user\n\u002F\u002F \"I found John Smith and John Doe. Which one?\"\n\n\u002F\u002F Step 3: Create with correct ID\nawait client.createIssue({ assigneeId: john.id, ... });\n```\n\n### Common Multi-Step Patterns\n\n| Action                     | First fetch...            |\n| -------------------------- | ------------------------- |\n| Create issue with assignee | List team members         |\n| Create issue in project    | List projects             |\n| Set status\u002Fpriority        | Get valid workflow states |\n| Add to channel             | List channels             |\n| Assign to team             | List teams                |\n\n## Running Code in the Sandbox\n\nAll code runs in the `code_execution` sandbox. State persists across calls (notebook-style), so variables from one call are available in subsequent calls.\n\n### Read Operations\n\nQuery data and return results:\n\n```javascript\nconst conns = await listConnections('linear');\nconst { LinearClient } = await import('@linear\u002Fsdk');\nconst client = new LinearClient({ accessToken: conns[0].settings.access_token });\n\nconst issues = await client.issues({ first: 10 });\nconsole.log(`Found ${issues.nodes.length} issues`);\nfor (const issue of issues.nodes) {\n  console.log(`${issue.identifier}: ${issue.title} [${issue.state?.name}]`);\n}\n```\n\n### Write Operations\n\nCreate, update, or delete data:\n\n```javascript\nconst conns = await listConnections('linear');\nconst { LinearClient } = await import('@linear\u002Fsdk');\nconst client = new LinearClient({ accessToken: conns[0].settings.access_token });\n\n\u002F\u002F Create\nconst created = await client.createIssue({ teamId: team.id, title: \"Fix login bug\" });\nconsole.log(`Created: ${created.issue?.identifier}`);\n\n\u002F\u002F Update\nawait client.updateIssue(issueId, { stateId: doneState.id });\nconsole.log(`Updated: ${issueId}`);\n\n\u002F\u002F Delete\nawait client.deleteIssue(issueId);\nconsole.log(`Deleted: ${issueId}`);\n```\n\n### Multi-Step Operations\n\nVariables persist across `code_execution` calls, enabling multi-step workflows:\n\n```javascript\n\u002F\u002F Call 1: Get credentials and list teams\nconst conns = await listConnections('linear');\nconst { LinearClient } = await import('@linear\u002Fsdk');\nconst client = new LinearClient({ accessToken: conns[0].settings.access_token });\n\nconst teams = await client.teams();\nconst team = teams.nodes[0];\nconsole.log(`Using team: ${team.name}`);\n\nconst users = await client.users();\nconst assignee = users.nodes.find(u => u.name === 'John');\nconsole.log(`Found assignee: ${assignee?.name}`);\n```\n\n```javascript\n\u002F\u002F Call 2: Variables from Call 1 are still available\nconst issue = await client.createIssue({\n  teamId: team.id,\n  assigneeId: assignee?.id,\n  title: 'New feature request',\n  description: 'Details here...',\n});\nconsole.log(`Created ${issue.issue?.identifier}: New feature request`);\n```\n\n## Databricks\n\nWhen the user wants to connect to Databricks, use the `databricks-m2m` connector (not the plain `databricks` connector).\n\n## Warehouse Data Exploration\n\nWhen querying data warehouses (BigQuery, Snowflake, Databricks), large schemas can make serial exploration slow (7-10s per query round-trip). Use the parallel subagent pattern to explore schemas faster.\n\n### When to Use Parallel Exploration\n\nUse this pattern when ALL of the following are true:\n\n- The target is a **warehouse** connection (`bigquery`, `snowflake`, or `databricks`)\n- The initial INFORMATION_SCHEMA query returns **15+ tables**\n- The user's question is **not about a specific known table** (e.g., they're asking a broad question like \"what's our revenue trend?\" or \"show me customer data\")\n\nIf the schema has fewer than 15 tables, serial exploration is fast enough — just query tables one-by-one.\n\n### 4-Step Parallel Workflow\n\n**Step 1: Schema Discovery** — Run a single `executeSql` call to get the full table list.\n\n```javascript\n\u002F\u002F BigQuery\nconst tables = await executeSql({ sqlQuery: `SELECT table_schema, table_name, row_count FROM \\`project.region-us\\`.INFORMATION_SCHEMA.TABLES WHERE table_schema NOT IN ('INFORMATION_SCHEMA') ORDER BY table_schema, table_name`, target: \"bigquery\" });\n\n\u002F\u002F Snowflake\nconst tables = await executeSql({ sqlQuery: `SELECT TABLE_SCHEMA, TABLE_NAME, ROW_COUNT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA NOT IN ('INFORMATION_SCHEMA') ORDER BY TABLE_SCHEMA, TABLE_NAME`, target: \"snowflake\" });\n\n\u002F\u002F Databricks\nconst tables = await executeSql({ sqlQuery: `SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema NOT IN ('information_schema') ORDER BY table_schema, table_name`, target: \"databricks\" });\n```\n\n**Step 2: Group Tables** — Partition the table list into 2-4 clusters:\n\n- By schema\u002Fdataset name (e.g., `analytics.*`, `sales.*`, `marketing.*`)\n- By name prefix (e.g., `dim_*`, `fact_*`, `stg_*`)\n- By estimated relevance to the user's question (most-likely-relevant tables first)\n\n**Step 3: Launch Parallel Subagents** — Start one `SMALL_TASK` subagent per group:\n\n```javascript\nconst group1 = await startAsyncSubagent({\n  task: `Explore these warehouse tables to answer: \"${userQuestion}\"\n\nConnection: Use executeSql({ sqlQuery: \"...\", target: \"bigquery\" }) — always pass target.\nDialect: BigQuery (use backtick quoting for project.dataset.table)\n\nTables to explore:\n- analytics.events\n- analytics.sessions\n- analytics.conversions\n\nFor each table:\n1. Run: SELECT column_name, data_type FROM \\`project.dataset\\`.INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'TABLE_NAME'\n2. Run: SELECT * FROM \\`project.dataset.TABLE_NAME\\` LIMIT 5\n\nReturn your findings in this exact format:\n\n## Table Relevance\n| Table | Relevant? | Why |\n|-------|-----------|-----|\n| ... | Yes\u002FNo | Brief reason |\n\n## Column Details (relevant tables only)\n| Table | Column | Type | Notes |\n|-------|--------|------|-------|\n| ... | ... | ... | Key field, foreign key, metric, etc. |\n\n## Suggested Join Conditions\n- table_a.id = table_b.a_id (describe relationship)\n\n## Key Findings\n- Bullet points about data patterns, date ranges, notable values`,\n  specialization: 'SMALL_TASK',\n  relevantFiles: ['.local\u002Fskills\u002Fdatabase\u002FSKILL.md']\n});\n\n\u002F\u002F Launch additional subagents for other groups (2-4 total)\nconst group2 = await startAsyncSubagent({ \u002F* same pattern, different tables *\u002F });\n```\n\n**Step 4: Synthesize and Query** — Use the `wait_for_background_tasks` tool to wait for the schema-discovery subagents. Once they complete, read their outputs, combine the relevant tables\u002Fcolumns, and write the final SQL query.\n\n### Dialect-Specific Notes\n\n| Dialect | Table Quoting | INFORMATION_SCHEMA Path | Sample Query |\n|---------|--------------|------------------------|--------------|\n| BigQuery | `` `project.dataset.table` `` | `` `project.dataset`.INFORMATION_SCHEMA.COLUMNS `` | `SELECT * FROM \\`p.d.t\\` LIMIT 5` |\n| Snowflake | `\"DATABASE\".\"SCHEMA\".\"TABLE\"` | `DATABASE.INFORMATION_SCHEMA.COLUMNS` | `SELECT * FROM \"DB\".\"SCH\".\"TBL\" LIMIT 5` |\n| Databricks | `` `catalog.schema.table` `` | `catalog.information_schema.columns` | `SELECT * FROM \\`c.s.t\\` LIMIT 5` |\n\n### Tips\n\n- Each subagent should run 3-6 SQL queries (column metadata + sample data per table)\n- Keep subagent count to 2-4 — more than 4 has diminishing returns\n- The structured markdown output format ensures consistent, scannable results\n- After synthesis, write a single well-commented SQL query that answers the user's question\n\n## Output Guidelines\n\n- **Simple answers** (counts, scalar values, short lists of \u003C 20 records): Print directly with `console.log()`\n- **Complex results** (tabular results): Write to `.agents\u002Foutputs\u002F\u003Cfilename>.csv` and summarize\n- **Write confirmations**: Print what was created\u002Fupdated\u002Fdeleted with IDs\n- **Errors**: Print clear error messages\n\n```javascript\nconst fs = await import('fs');\n\n\u002F\u002F Simple\nconsole.log(`Answer: 42 issues created this week`);\n\n\u002F\u002F Tabular results - write CSV to .agents\u002Foutputs\u002F\nfs.mkdirSync('.agents\u002Foutputs', { recursive: true });\nfs.writeFileSync('.agents\u002Foutputs\u002Fresults.csv', csvContent);\nconsole.log(`Exported 500 records to .agents\u002Foutputs\u002Fresults.csv`);\n\n\u002F\u002F Write\nconsole.log(`Created issue ENG-123: \"Fix login bug\"`);\nconsole.log(`Updated 5 contacts`);\nconsole.log(`Deleted message ID abc123`);\n```\n\n## Key Points\n\n- **Use `listConnections(connectorName)`** as the primary way to get credentials\n- **Fall back to search → propose → add** when no connections exist (see `integrations` skill)\n- **All code runs in the `code_execution` sandbox** — no script files needed\n- **Use `console.log()`** to see output — functions execute silently without it (but never log credentials)\n- **Use `await import(...)`** for packages (dynamic imports only)\n- **State persists** across `code_execution` calls — reuse `conns`, clients, and extracted credentials instead of re-fetching (unless expired).\n- **Browse `public_documentation_link`** to understand the API before coding\n- **Ask clarifying questions** before write operations that need specific IDs or values\n- **Fetch options first** when the user references something by name (users, projects, etc.)\n- **Don't cache clients** — access tokens expire; re-create clients from `listConnections` when needed\n- **Write large outputs to `.agents\u002Foutputs\u002F`** as CSV or JSON\n","# Query Integration Data Skill\n\nConnect to any Replit-supported integration to read or write data — query issues, create tickets, send messages, update contacts, manage files, etc. This also includes querying supported data warehouse integrations like Databricks, Snowflake, and BigQuery.\n\nAll code runs inline in the `code_execution` sandbox — no script files needed.\n\n## When to Use\n\nUse this skill when the user asks you a **question in chat** that requires data from external services to answer, or when they need to perform data operations without building a visual interface.\n\n- **Answer questions**: Query data to respond to user questions in the conversation (e.g., \"How many issues were created this week?\")\n- **Fetch and export data**: Export data to CSV\u002FJSON for later use or analysis\n- **Write operations**: Create, update, delete, or modify data in a service\n- **Ad-hoc queries**: One-time data lookups or investigations\n- **Automate tasks**: Perform multi-step operations across the API\n\n**Key point:** Use this skill when the output is an answer or data file, NOT when building a dashboard or visualization interface.\n\n## When NOT to Use\n\n- **The user wants to create a dashboard, visualization, or analytics interface** - use the `data-visualization` skill (it handles data fetching internally)\n- **The user asks to \"build\", \"create\", or \"make\" a dashboard\u002Fapp with data** - use the `data-visualization` skill\n- The user needs to add an integration to their app (use the `integrations` skill)\n- Production database operations (use the database pane directly)\n- Asks to check deployment or server logs (use the `deployment` skill)\n\n## File Structure\n\n```text\n.agents\u002F\n└── outputs\u002F         # Generated artifacts (CSV, JSON, etc.)\n```\n\nCode runs inline in the `code_execution` sandbox — no script files are needed.\n\n## Workflow\n\n```text\n1. CHECK      → listConnections(connectorName) to get existing credentials\n   ├─ connections exist → EXECUTE → OUTPUT\n   └─ empty array      → SEARCH → LEARN → CLARIFY → setup via `integrations` skill → EXECUTE → OUTPUT\n```\n\n- **CHECK**: Call `listConnections(connectorName)` in the `code_execution` sandbox. If it returns connections, you already have credentials — skip straight to EXECUTE.\n- **SEARCH → CONNECT** (only when no connections exist): Use `searchIntegrations`, `proposeIntegration`, and `addIntegration` to set up a new connection. See the `integrations` skill for the full lifecycle details.\n- **EXECUTE**: Write and run code in the `code_execution` sandbox.\n- **OUTPUT**: Return the answer or confirmation to the user.\n\n## Getting Connection Credentials\n\n### Primary: `listConnections(connectorName)`\n\nThis is the main way to get credentials. It's a pre-registered function in the `code_execution` sandbox.\n\n```javascript\nconst conns = await listConnections('linear');\nconsole.log(conns.map(c => ({ id: c.id, displayName: c.displayName, status: c.status })));\n```\n\nEach connection object has:\n\n- `id`, `connectorConfigId`, `status`, `displayName`, `metadata`, `environment`\n- `settings` — credentials dict (access tokens, API keys, etc.)\n- `getClient()` — returns the `settings` object for constructing SDK clients\n\nReturns an empty array when no connections are configured.\n\n```javascript\nconst conns = await listConnections('linear');\nif (conns.length > 0) {\n  const token = conns[0].settings.access_token;\n  const { LinearClient } = await import('@linear\u002Fsdk');\n  const client = new LinearClient({ accessToken: token });\n  \u002F\u002F Ready to query\n}\n```\n\n### Fallback: Setting Up a New Connection\n\nIf `listConnections` returns an empty array, the user hasn't connected the service yet. Use `searchIntegrations` to find the connector, then follow the `integrations` skill to walk the user through setup (`addIntegration` and `proposeIntegration` — order depends on integration type). After the connection is established, `listConnections` will return it.\n\n### Browse the Documentation\n\n**Always browse `public_documentation_link`** before writing code, especially for write operations. This helps you understand:\n\n- Required vs optional fields for creating resources\n- Valid values for enums (status, priority, type, etc.)\n- Relationships between resources (e.g., issues belong to projects)\n- Rate limits and best practices\n\n## Clarifying Questions\n\n**Before write operations, gather required information.** Many APIs require IDs or specific values that the user may not know.\n\n### When to Ask\n\nAsk clarifying questions when the user's request requires:\n\n- **Entity selection**: \"Which project should this issue be created in?\"\n- **User assignment**: \"Who should be assigned? Let me list the team members...\"\n- **Required fields**: \"What priority - urgent, high, medium, or low?\"\n- **Ambiguous references**: \"I found 3 projects matching 'backend'. Which one?\"\n\n### Pattern: Fetch Options First\n\nFor write operations, often run a read query first to get valid options:\n\n```javascript\n\u002F\u002F User says: \"Create a Linear ticket assigned to John\"\n\u002F\u002F Problem: Need John's user ID, not just name\n\nconst conns = await listConnections('linear');\nconst { LinearClient } = await import('@linear\u002Fsdk');\nconst client = new LinearClient({ accessToken: conns[0].settings.access_token });\n\n\u002F\u002F Step 1: List users to find John's ID\nconst users = await client.users();\nconst john = users.nodes.find(u => u.name.includes('John'));\n\n\u002F\u002F Step 2: If ambiguous, ASK the user\n\u002F\u002F \"I found John Smith and John Doe. Which one?\"\n\n\u002F\u002F Step 3: Create with correct ID\nawait client.createIssue({ assigneeId: john.id, ... });\n```\n\n### Common Multi-Step Patterns\n\n| Action                     | First fetch...            |\n| -------------------------- | ------------------------- |\n| Create issue with assignee | List team members         |\n| Create issue in project    | List projects             |\n| Set status\u002Fpriority        | Get valid workflow states |\n| Add to channel             | List channels             |\n| Assign to team             | List teams                |\n\n## Running Code in the Sandbox\n\nAll code runs in the `code_execution` sandbox. State persists across calls (notebook-style), so variables from one call are available in subsequent calls.\n\n### Read Operations\n\nQuery data and return results:\n\n```javascript\nconst conns = await listConnections('linear');\nconst { LinearClient } = await import('@linear\u002Fsdk');\nconst client = new LinearClient({ accessToken: conns[0].settings.access_token });\n\nconst issues = await client.issues({ first: 10 });\nconsole.log(`Found ${issues.nodes.length} issues`);\nfor (const issue of issues.nodes) {\n  console.log(`${issue.identifier}: ${issue.title} [${issue.state?.name}]`);\n}\n```\n\n### Write Operations\n\nCreate, update, or delete data:\n\n```javascript\nconst conns = await listConnections('linear');\nconst { LinearClient } = await import('@linear\u002Fsdk');\nconst client = new LinearClient({ accessToken: conns[0].settings.access_token });\n\n\u002F\u002F Create\nconst created = await client.createIssue({ teamId: team.id, title: \"Fix login bug\" });\nconsole.log(`Created: ${created.issue?.identifier}`);\n\n\u002F\u002F Update\nawait client.updateIssue(issueId, { stateId: doneState.id });\nconsole.log(`Updated: ${issueId}`);\n\n\u002F\u002F Delete\nawait client.deleteIssue(issueId);\nconsole.log(`Deleted: ${issueId}`);\n```\n\n### Multi-Step Operations\n\nVariables persist across `code_execution` calls, enabling multi-step workflows:\n\n```javascript\n\u002F\u002F Call 1: Get credentials and list teams\nconst conns = await listConnections('linear');\nconst { LinearClient } = await import('@linear\u002Fsdk');\nconst client = new LinearClient({ accessToken: conns[0].settings.access_token });\n\nconst teams = await client.teams();\nconst team = teams.nodes[0];\nconsole.log(`Using team: ${team.name}`);\n\nconst users = await client.users();\nconst assignee = users.nodes.find(u => u.name === 'John');\nconsole.log(`Found assignee: ${assignee?.name}`);\n```\n\n```javascript\n\u002F\u002F Call 2: Variables from Call 1 are still available\nconst issue = await client.createIssue({\n  teamId: team.id,\n  assigneeId: assignee?.id,\n  title: 'New feature request',\n  description: 'Details here...',\n});\nconsole.log(`Created ${issue.issue?.identifier}: New feature request`);\n```\n\n## Databricks\n\nWhen the user wants to connect to Databricks, use the `databricks-m2m` connector (not the plain `databricks` connector).\n\n## Warehouse Data Exploration\n\nWhen querying data warehouses (BigQuery, Snowflake, Databricks), large schemas can make serial exploration slow (7-10s per query round-trip). Use the parallel subagent pattern to explore schemas faster.\n\n### When to Use Parallel Exploration\n\nUse this pattern when ALL of the following are true:\n\n- The target is a **warehouse** connection (`bigquery`, `snowflake`, or `databricks`)\n- The initial INFORMATION_SCHEMA query returns **15+ tables**\n- The user's question is **not about a specific known table** (e.g., they're asking a broad question like \"what's our revenue trend?\" or \"show me customer data\")\n\nIf the schema has fewer than 15 tables, serial exploration is fast enough — just query tables one-by-one.\n\n### 4-Step Parallel Workflow\n\n**Step 1: Schema Discovery** — Run a single `executeSql` call to get the full table list.\n\n```javascript\n\u002F\u002F BigQuery\nconst tables = await executeSql({ sqlQuery: `SELECT table_schema, table_name, row_count FROM \\`project.region-us\\`.INFORMATION_SCHEMA.TABLES WHERE table_schema NOT IN ('INFORMATION_SCHEMA') ORDER BY table_schema, table_name`, target: \"bigquery\" });\n\n\u002F\u002F Snowflake\nconst tables = await executeSql({ sqlQuery: `SELECT TABLE_SCHEMA, TABLE_NAME, ROW_COUNT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA NOT IN ('INFORMATION_SCHEMA') ORDER BY TABLE_SCHEMA, TABLE_NAME`, target: \"snowflake\" });\n\n\u002F\u002F Databricks\nconst tables = await executeSql({ sqlQuery: `SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema NOT IN ('information_schema') ORDER BY table_schema, table_name`, target: \"databricks\" });\n```\n\n**Step 2: Group Tables** — Partition the table list into 2-4 clusters:\n\n- By schema\u002Fdataset name (e.g., `analytics.*`, `sales.*`, `marketing.*`)\n- By name prefix (e.g., `dim_*`, `fact_*`, `stg_*`)\n- By estimated relevance to the user's question (most-likely-relevant tables first)\n\n**Step 3: Launch Parallel Subagents** — Start one `SMALL_TASK` subagent per group:\n\n```javascript\nconst group1 = await startAsyncSubagent({\n  task: `Explore these warehouse tables to answer: \"${userQuestion}\"\n\nConnection: Use executeSql({ sqlQuery: \"...\", target: \"bigquery\" }) — always pass target.\nDialect: BigQuery (use backtick quoting for project.dataset.table)\n\nTables to explore:\n- analytics.events\n- analytics.sessions\n- analytics.conversions\n\nFor each table:\n1. Run: SELECT column_name, data_type FROM \\`project.dataset\\`.INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'TABLE_NAME'\n2. Run: SELECT * FROM \\`project.dataset.TABLE_NAME\\` LIMIT 5\n\nReturn your findings in this exact format:\n\n## Table Relevance\n| Table | Relevant? | Why |\n|-------|-----------|-----|\n| ... | Yes\u002FNo | Brief reason |\n\n## Column Details (relevant tables only)\n| Table | Column | Type | Notes |\n|-------|--------|------|-------|\n| ... | ... | ... | Key field, foreign key, metric, etc. |\n\n## Suggested Join Conditions\n- table_a.id = table_b.a_id (describe relationship)\n\n## Key Findings\n- Bullet points about data patterns, date ranges, notable values`,\n  specialization: 'SMALL_TASK',\n  relevantFiles: ['.local\u002Fskills\u002Fdatabase\u002FSKILL.md']\n});\n\n\u002F\u002F Launch additional subagents for other groups (2-4 total)\nconst group2 = await startAsyncSubagent({ \u002F* same pattern, different tables *\u002F });\n```\n\n**Step 4: Synthesize and Query** — Use the `wait_for_background_tasks` tool to wait for the schema-discovery subagents. Once they complete, read their outputs, combine the relevant tables\u002Fcolumns, and write the final SQL query.\n\n### Dialect-Specific Notes\n\n| Dialect | Table Quoting | INFORMATION_SCHEMA Path | Sample Query |\n|---------|--------------|------------------------|--------------|\n| BigQuery | `` `project.dataset.table` `` | `` `project.dataset`.INFORMATION_SCHEMA.COLUMNS `` | `SELECT * FROM \\`p.d.t\\` LIMIT 5` |\n| Snowflake | `\"DATABASE\".\"SCHEMA\".\"TABLE\"` | `DATABASE.INFORMATION_SCHEMA.COLUMNS` | `SELECT * FROM \"DB\".\"SCH\".\"TBL\" LIMIT 5` |\n| Databricks | `` `catalog.schema.table` `` | `catalog.information_schema.columns` | `SELECT * FROM \\`c.s.t\\` LIMIT 5` |\n\n### Tips\n\n- Each subagent should run 3-6 SQL queries (column metadata + sample data per table)\n- Keep subagent count to 2-4 — more than 4 has diminishing returns\n- The structured markdown output format ensures consistent, scannable results\n- After synthesis, write a single well-commented SQL query that answers the user's question\n\n## Output Guidelines\n\n- **Simple answers** (counts, scalar values, short lists of \u003C 20 records): Print directly with `console.log()`\n- **Complex results** (tabular results): Write to `.agents\u002Foutputs\u002F\u003Cfilename>.csv` and summarize\n- **Write confirmations**: Print what was created\u002Fupdated\u002Fdeleted with IDs\n- **Errors**: Print clear error messages\n\n```javascript\nconst fs = await import('fs');\n\n\u002F\u002F Simple\nconsole.log(`Answer: 42 issues created this week`);\n\n\u002F\u002F Tabular results - write CSV to .agents\u002Foutputs\u002F\nfs.mkdirSync('.agents\u002Foutputs', { recursive: true });\nfs.writeFileSync('.agents\u002Foutputs\u002Fresults.csv', csvContent);\nconsole.log(`Exported 500 records to .agents\u002Foutputs\u002Fresults.csv`);\n\n\u002F\u002F Write\nconsole.log(`Created issue ENG-123: \"Fix login bug\"`);\nconsole.log(`Updated 5 contacts`);\nconsole.log(`Deleted message ID abc123`);\n```\n\n## Key Points\n\n- **Use `listConnections(connectorName)`** as the primary way to get credentials\n- **Fall back to search → propose → add** when no connections exist (see `integrations` skill)\n- **All code runs in the `code_execution` sandbox** — no script files needed\n- **Use `console.log()`** to see output — functions execute silently without it (but never log credentials)\n- **Use `await import(...)`** for packages (dynamic imports only)\n- **State persists** across `code_execution` calls — reuse `conns`, clients, and extracted credentials instead of re-fetching (unless expired).\n- **Browse `public_documentation_link`** to understand the API before coding\n- **Ask clarifying questions** before write operations that need specific IDs or values\n- **Fetch options first** when the user references something by name (users, projects, etc.)\n- **Don't cache clients** — access tokens expire; re-create clients from `listConnections` when needed\n- **Write large outputs to `.agents\u002Foutputs\u002F`** as CSV or JSON\n",{"name":5,"description":7},"main","6b4a291df75c639681e93b4b5b812126443fd6ed","skills\u002Fquery-integration-data",3,"https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd","https:\u002F\u002Fsolanaclawd.com\u002Fopenclawd","https:\u002F\u002Fgithub.com\u002Fclawdsolana","https:\u002F\u002Fmusebook.trade","Welcome to Open Clawd. The future of Ai on and off chain. Bringing webMCP to web 3 using X402, A2A, MPP and so much more!","2026-08-01 09:30:51",{"source":8,"skillName":5,"commands":60,"prompt":70,"zipAvailable":71},[61,64,67],{"tool":62,"command":63},"npx","npx skills add clawdsolana\u002FOpenClawd --skill query-integration-data",{"tool":65,"command":66},"bunx","bunx skills add clawdsolana\u002FOpenClawd --skill query-integration-data",{"tool":68,"command":69},"pnpm","pnpm dlx skills add clawdsolana\u002FOpenClawd --skill query-integration-data","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd\u002Fblob\u002Fmain\u002Fskills\u002Fquery-integration-data\u002FSKILL.md",true,[73],{"path":74,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":77,"sourceHtmlUrl":78},".fingerprint","OTHER","其他",32,"https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd\u002Fblob\u002Fmain\u002Fskills\u002Fquery-integration-data\u002F.fingerprint",[80,111,138,162,172,196],{"skillNo":81,"name":82,"nameZh":6,"description":83,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":91,"publishedAt":44},"01M71KRBD0W01EAXJ8YM4M1SJ2","solana-dev","End-to-end Solana development playbook (Jan 2026). Prefer Solana Foundation framework-kit (@solana\u002Fclient + @solana\u002Freact-hooks) for React\u002FNext.js UI. Prefer @solana\u002Fkit for all new client\u002FRPC\u002Ftransaction code. When legacy dependencies require web3.js, isolate it behind @solana\u002Fweb3-compat (or @solana\u002Fweb3.js as a true legacy fallback). Covers wallet-standard-first connection (incl. ConnectorKit), Anchor\u002FPinocchio programs, Codama-based client generation, LiteSVM\u002FMollusk\u002FSurfpool testing, and security checklists.","https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fsolana-dev\u002FSKILL.md",[86],{"categoryNo":87,"categoryName":88,"taxonomyType":89,"taxonomyTypeDesc":90},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[92,93,94,95,96,97,98,99,100,101,102,41,103,104,105,106,107,108,109,110],"solana dev","dev","solana","Wallet","end","testing","hooks","kit","new","when","web3","react","next","2026","playbook","security","ui","fallback","framework",{"skillNo":112,"name":113,"nameZh":6,"description":114,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":120,"publishedAt":44},"01M71KR8QPESSY61SVE8ZTFNVT","xurl","A CLI tool for making authenticated requests to the X (Twitter) API. Use this skill when you need to post tweets, reply, quote, search, read posts, manage followers, send DMs, upload media, or interact with any X API v2 endpoint.","https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd\u002Fblob\u002Fmain\u002Fskills\u002Fxurl\u002FSKILL.md",[117],{"categoryNo":118,"categoryName":119,"taxonomyType":89,"taxonomyTypeDesc":90},"01JBSEEDCAT000000000000023","Skill与智能体开发",[113,121,122,123,124,125,126,101,127,128,129,35,130,131,132,133,134,135,136,137],"posts","Media","x api","search","send","tap","you","api","cli","install","cli tool","endpoint","brew","for","manage","tool","twitter",{"skillNo":139,"name":140,"nameZh":6,"description":141,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":142,"categories":143,"keywords":145,"publishedAt":44},"01M71KR6FSXV88YDKWP7NBY3SH","wurk-integration","WURK API integration for monetizing agents with x402 payments on Solana\u002FBase - create social jobs, custom challenges, and agent help tasks","https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd\u002Fblob\u002Fmain\u002Fskills\u002Fwurk-integration\u002FSKILL.md",[144],{"categoryNo":118,"categoryName":119,"taxonomyType":89,"taxonomyTypeDesc":90},[146,147,26,148,149,150,151,152,128,40,153,154,155,156,157,158,134,159,160,161],"wurk","wurk integration","x402","social","payments","tasks","team","social-jobs","command","agent-help","custom-jobs","clawd","safe","api integration","custom","true",{"skillNo":163,"name":164,"nameZh":6,"description":165,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":166,"categories":167,"keywords":168,"publishedAt":44},"01M71KR4HCX41BPAK9GP7RPRRP","workflows","Manage application workflows including configuration, restart, and removal.","https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd\u002Fblob\u002Fmain\u002Fskills\u002Fworkflows\u002FSKILL.md",[],[164,135,169,170,171],"configuration","application","restart",{"skillNo":173,"name":174,"nameZh":6,"description":175,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":176,"categories":177,"keywords":178,"publishedAt":44},"01M71KR1VM0F5GPEQDNG5J7A0H","web-search","Search the web, fetch content, extract branding profiles, and capture screenshots from URLs. Use for real-time information, API documentation, current events, design matching, and visual reference.","https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd\u002Fblob\u002Fmain\u002Fskills\u002Fweb-search\u002FSKILL.md",[],[179,124,180,181,182,134,183,184,185,186,187,188,189,128,190,191,192,193,194,195],"web search","web","fetch","api documentation","real-time","time","profiles","design","use","information","visual","documentation","branding","matching","reference","capture","content",{"skillNo":197,"name":198,"nameZh":6,"description":199,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":200,"categories":201,"keywords":202,"publishedAt":44},"01M71KQZN5MR1JFQHG5GWXYAHS","weather","Get current weather and forecasts via wttr.in or Open-Meteo. Use when: user asks about weather, temperature, or forecasts for any location. NOT for: historical weather data, severe weather alerts, or detailed meteorological analysis. No API key needed.","https:\u002F\u002Fgithub.com\u002Fclawdsolana\u002FOpenClawd\u002Fblob\u002Fmain\u002Fskills\u002Fweather\u002FSKILL.md",[],[198,43,134,203,187,101,204,128,205,206,207,208,209,210,211,212,24,213],"open","analysis","alerts","temperature","curl","via","help","about","https","location","user"]