{"owner":"aden-hive","repo":"hive","hasSkills":true,"totalSkillsCount":148,"totalTokensCount":55040,"categories":["anthropic-skill","root-instruction","plugin-manifest","claude-rule","subagent-persona"],"hasMcp":true,"mcpConfig":{"mcpServers":{"hive":{"command":"npx","args":["-y","@modelcontextprotocol/server-hive"]}}},"found":[".claude/skills/triage-issue/SKILL.md","core/framework/skills/_default_skills/context-preservation/SKILL.md","core/framework/skills/_default_skills/note-taking/SKILL.md","core/framework/skills/_default_skills/error-recovery/SKILL.md","core/framework/skills/_default_skills/quality-monitor/SKILL.md",".claude/skills/browser-edge-cases/SKILL.md","core/framework/skills/_default_skills/writing-hive-skills/SKILL.md","core/framework/skills/_default_skills/colony-progress-tracker/SKILL.md","core/framework/skills/_preset_skills/terminal-tools-troubleshooting/SKILL.md","core/framework/skills/_preset_skills/terminal-tools-pty-sessions/SKILL.md","core/framework/skills/_preset_skills/x-automation/SKILL.md","core/framework/skills/_preset_skills/terminal-tools-job-control/SKILL.md","core/framework/skills/_preset_skills/terminal-tools-fs-search/SKILL.md","core/framework/skills/_preset_skills/terminal-tools-foundations/SKILL.md","core/framework/skills/_preset_skills/linkedin-automation/SKILL.md","core/framework/skills/_preset_skills/chart-creation-foundations/SKILL.md","core/framework/skills/_preset_skills/browser-automation/SKILL.md","AGENTS.md","tools/BROWSER_USE_PATTERNS.md","tools/BUILDING_TOOLS.md","tools/mcp_servers.json","tools/README.md","tools/browser-extension/manifest.json","tools/browser-extension/README.md",".claude/skills/browser-edge-cases/registry.md",".claude/skills/browser-edge-cases/scripts/test_02_twitter_scroll.py",".claude/skills/browser-edge-cases/scripts/test_03_modal_scroll.py",".claude/skills/browser-edge-cases/scripts/test_04_element_covered.py",".claude/skills/browser-edge-cases/scripts/test_06_shadow_dom.py",".claude/skills/browser-edge-cases/scripts/test_07_contenteditable.py",".claude/skills/browser-edge-cases/scripts/test_08_autocomplete.py",".claude/skills/browser-edge-cases/scripts/test_10_huge_dom.py",".claude/skills/browser-edge-cases/scripts/test_13_spa_navigation.py",".claude/skills/browser-edge-cases/scripts/test_15_screenshot.py",".claude/skills/browser-edge-cases/scripts/test_case.py","core/framework/agents/credential_tester/mcp_servers.json","core/framework/agents/queen/mcp_registry.json","core/framework/agents/queen/mcp_servers.json","core/framework/agents/queen/reference/anti_patterns.md","core/framework/agents/queen/reference/file_templates.md","core/framework/agents/queen/reference/file_templates_declarative.md","core/framework/agents/queen/reference/framework_guide.md","core/framework/agents/queen/reference/gcu_guide.md","tools/src/aden_tools/tools/account_info_tool/README.md","tools/src/aden_tools/tools/airtable_tool/README.md","tools/src/aden_tools/tools/apify_tool/README.md","tools/src/aden_tools/tools/apollo_tool/README.md","tools/src/aden_tools/tools/arxiv_tool/README.md","tools/src/aden_tools/tools/asana_tool/README.md","tools/src/aden_tools/tools/attio_tool/README.md","tools/src/aden_tools/tools/aws_s3_tool/README.md","tools/src/aden_tools/tools/azure_sql_tool/README.md","tools/src/aden_tools/tools/bigquery_tool/README.md","tools/src/aden_tools/tools/brevo_tool/README.md","tools/src/aden_tools/tools/calcom_tool/README.md","tools/src/aden_tools/tools/calendar_tool/README.md","tools/src/aden_tools/tools/calendly_tool/README.md","tools/src/aden_tools/tools/cloudflare_tool/README.md","tools/src/aden_tools/tools/cloudinary_tool/README.md","tools/src/aden_tools/tools/confluence_tool/README.md","tools/src/aden_tools/tools/csv_tool/README.md","tools/src/aden_tools/tools/databricks_tool/README.md","tools/src/aden_tools/tools/discord_tool/README.md","tools/src/aden_tools/tools/dns_security_scanner/README.md","tools/src/aden_tools/tools/docker_hub_tool/README.md","tools/src/aden_tools/tools/duckduckgo_tool/README.md","tools/src/aden_tools/tools/email_tool/README.md","tools/src/aden_tools/tools/exa_search_tool/README.md","tools/src/aden_tools/tools/excel_tool/README.md","tools/src/aden_tools/tools/file_system_toolkits/README.md","tools/src/aden_tools/tools/freshdesk_tool/README.md","tools/src/aden_tools/tools/github_tool/README.md","tools/src/aden_tools/tools/gitlab_tool/README.md","tools/src/aden_tools/tools/gmail_tool/README.md","tools/src/aden_tools/tools/google_analytics_tool/README.md","tools/src/aden_tools/tools/google_docs_tool/README.md","tools/src/aden_tools/tools/google_maps_tool/README.md","tools/src/aden_tools/tools/google_search_console_tool/README.md","tools/src/aden_tools/tools/google_sheets_tool/README.md","tools/src/aden_tools/tools/greenhouse_tool/README.md","tools/src/aden_tools/tools/http_headers_scanner/README.md","tools/src/aden_tools/tools/hubspot_tool/README.md","tools/src/aden_tools/tools/huggingface_tool/README.md","tools/src/aden_tools/tools/intercom_tool/README.md","tools/src/aden_tools/tools/jira_tool/README.md","tools/src/aden_tools/tools/kafka_tool/README.md","tools/src/aden_tools/tools/langfuse_tool/README.md","tools/src/aden_tools/tools/linear_tool/README.md","tools/src/aden_tools/tools/lusha_tool/README.md","tools/src/aden_tools/tools/microsoft_graph_tool/README.md","tools/src/aden_tools/tools/mongodb_tool/README.md","tools/src/aden_tools/tools/mssql_tool/README.md","tools/src/aden_tools/tools/n8n_tool/README.md","tools/src/aden_tools/tools/news_tool/README.md","tools/src/aden_tools/tools/notion_tool/README.md","tools/src/aden_tools/tools/obsidian_tool/README.md","tools/src/aden_tools/tools/openmeteo_tool/README.md","tools/src/aden_tools/tools/pagerduty_tool/README.md","tools/src/aden_tools/tools/pdf_read_tool/README.md","tools/src/aden_tools/tools/pinecone_tool/README.md","tools/src/aden_tools/tools/pipedrive_tool/README.md","tools/src/aden_tools/tools/plaid_tool/README.md","tools/src/aden_tools/tools/port_scanner/README.md","tools/src/aden_tools/tools/postgres_tool/README.md","tools/src/aden_tools/tools/powerbi_tool/README.md","tools/src/aden_tools/tools/prometheus_tool/README.md","tools/src/aden_tools/tools/pushover_tool/README.md","tools/src/aden_tools/tools/quickbooks_tool/README.md","tools/src/aden_tools/tools/razorpay_tool/README.md","tools/src/aden_tools/tools/reddit_tool/README.md","tools/src/aden_tools/tools/redis_tool/README.md","tools/src/aden_tools/tools/redshift_tool/README.md","tools/src/aden_tools/tools/risk_scorer/README.md","tools/src/aden_tools/tools/salesforce_tool/README.md","tools/src/aden_tools/tools/sap_tool/README.md","tools/src/aden_tools/tools/serpapi_tool/README.md","tools/src/aden_tools/tools/shopify_tool/README.md","tools/src/aden_tools/tools/similarweb_tool/README.md","tools/src/aden_tools/tools/slack_tool/README.md","tools/src/aden_tools/tools/snowflake_tool/README.md","tools/src/aden_tools/tools/ssl_tls_scanner/README.md","tools/src/aden_tools/tools/stripe_tool/README.md","tools/src/aden_tools/tools/subdomain_enumerator/README.md","tools/src/aden_tools/tools/supabase_tool/README.md","tools/src/aden_tools/tools/tech_stack_detector/README.md","tools/src/aden_tools/tools/telegram_tool/README.md","tools/src/aden_tools/tools/terraform_tool/README.md","tools/src/aden_tools/tools/time_tool/README.md","tools/src/aden_tools/tools/tines_tool/README.md","tools/src/aden_tools/tools/trello_tool/README.md","tools/src/aden_tools/tools/twilio_tool/README.md","tools/src/aden_tools/tools/twitter_tool/README.md","tools/src/aden_tools/tools/vercel_tool/README.md","tools/src/aden_tools/tools/vision_tool/README.md","tools/src/aden_tools/tools/wandb_tool/README.md","tools/src/aden_tools/tools/web_scrape_tool/README.md","tools/src/aden_tools/tools/web_search_tool/README.md","tools/src/aden_tools/tools/wikipedia_tool/README.md","tools/src/aden_tools/tools/yahoo_finance_tool/README.md","tools/src/aden_tools/tools/youtube_tool/README.md","tools/src/aden_tools/tools/youtube_transcript_tool/README.md","tools/src/aden_tools/tools/zendesk_tool/README.md","tools/src/aden_tools/tools/zoho_crm_tool/README.md","tools/src/aden_tools/tools/zoom_tool/README.md","core/framework/skills/_preset_skills/terminal-tools-job-control/references/signals.md","core/framework/skills/_preset_skills/terminal-tools-fs-search/references/find_predicates.md","core/framework/skills/_preset_skills/terminal-tools-fs-search/references/ripgrep_cheatsheet.md","core/framework/skills/_preset_skills/terminal-tools-foundations/references/exit_codes.md"],"skills":{".claude/skills/triage-issue/SKILL.md":"# Triage Issue Skill\n\nAnalyze a GitHub issue, verify claims against the codebase, and close invalid issues with a technical response.\n\n## Trigger\n\nUser provides a GitHub issue URL or number, e.g.:\n- `/triage-issue 1970`\n- `/triage-issue https://github.com/adenhq/hive/issues/1970`\n\n## Workflow\n\n### Step 1: Fetch Issue Details\n\n```bash\ngh issue view <number> --repo adenhq/hive --json title,body,state,labels,author\n```\n\nExtract:\n- Title\n- Body (the claim/bug report)\n- Current state\n- Labels\n- Author\n\nIf issue is already closed, inform user and stop.\n\n### Step 2: Analyze the Claim\n\nRead the issue body and identify:\n1. **The core claim** - What is the user asserting?\n2. **Technical specifics** - File paths, function names, code snippets mentioned\n3. **Expected behavior** - What do they think should happen?\n4. **Severity claimed** - Security issue? Bug? Feature request?\n\n### Step 3: Investigate the Codebase\n\nFor each technical claim:\n1. Find the referenced code using Grep/Glob/Read\n2. Understand the actual implementation\n3. Check if the claim accurately describes the behavior\n4. Look for related tests, documentation, or design decisions\n\n### Step 4: Evaluate Validity\n\nCategorize the issue as one of:\n\n| Category | Action |\n|----------|--------|\n| **Valid Bug** | Do NOT close. Inform user this is a real issue. |\n| **Valid Feature Request** | Do NOT close. Suggest labeling appropriately. |\n| **Misunderstanding** | Prepare technical explanation for why behavior is correct. |\n| **Fundamentally Flawed** | Prepare critique explaining the technical impossibility or design rationale. |\n| **Duplicate** | Find the original issue and prepare duplicate notice. |\n| **Incomplete** | Prepare request for more information. |\n\n### Step 5: Draft Response\n\nFor issues to be closed, draft a response that:\n\n1. **Acknowledges the concern** - Don't be dismissive\n2. **Explains the actual behavior** - With code references\n3. **Provides technical rationale** - Why it works this way\n4. **References industry standards** - If applicable\n5. **Offers alternatives** - If there's a better approach for the user\n\nUse this template:\n\n```markdown\n## Analysis\n\n[Brief summary of what was investigated]\n\n## Technical Details\n\n[Explanation with code references]\n\n## Why This Is Working As Designed\n\n[Rationale]\n\n## Recommendation\n\n[What the user should do instead, if applicable]\n\n---\n*This issue was reviewed and closed by the maintainers.*\n```\n\n### Step 6: User Review\n\nPresent the draft to the user with:\n\n```\n## Issue #<number>: <title>\n\n**Claim:** <summary of claim>\n\n**Finding:** <valid/invalid/misunderstanding/etc>\n\n**Draft Response:**\n<the markdown response>\n\n---\nDo you want me to post this comment and close the issue?\n```\n\nUse AskUserQuestion with options:\n- \"Post and close\" - Post comment, close issue\n- \"Edit response\" - Let user modify the response\n- \"Skip\" - Don't take action\n\n### Step 7: Execute Action\n\nIf user approves:\n\n```bash\n# Post comment\ngh issue comment <number> --repo adenhq/hive --body \"<response>\"\n\n# Close issue\ngh issue close <number> --repo adenhq/hive --reason \"not planned\"\n```\n\nReport success with link to the issue.\n\n## Important Guidelines\n\n1. **Never close valid issues** - If there's any merit to the claim, don't close it\n2. **Be respectful** - The reporter took time to file the issue\n3. **Be technical** - Provide code references and evidence\n4. **Be educational** - Help them understand, don't just dismiss\n5. **Check twice** - Make sure you understand the code before declaring something invalid\n6. **Consider edge cases** - Maybe their environment reveals a real issue\n\n## Example Critiques\n\n### Security Misunderstanding\n> \"The claim that secrets are exposed in plaintext misunderstands the encryption architecture. While `SecretStr` is used for logging protection, actual encryption is provided by Fernet (AES-128-CBC) at the storage layer. The code path is: serialize → encrypt → write. Only encrypted bytes touch disk.\"\n\n### Impossible Request\n> \"The requested feature would require [X] which violates [fundamental constraint]. This is not a limitation of our implementation but a fundamental property of [technology/protocol].\"\n\n### Already Handled\n> \"This scenario is already handled by [code reference]. The reporter may be using an older version or misconfigured environment.\"\n","core/framework/skills/_default_skills/context-preservation/SKILL.md":"---\nname: hive.context-preservation\ndescription: Proactively extract critical values from tool results into working notes before automatic context pruning destroys them.\nmetadata:\n  author: hive\n  type: default-skill\n  visibility: [worker]\n---\n\n## Operational Protocol: Context Preservation\n\nYou operate under a finite context window. Older tool results WILL be pruned. Extract what you need while it's still in context.\n\n**Save-as-you-go.** After any tool call producing information you'll need later, immediately extract the key data into `_working_notes` or `_preserved_data`. Do not rely on referring back to old tool results — once they're pruned they're gone.\n\n**What to extract:**\n- URLs and key snippets (not full pages)\n- Relevant API fields (not raw JSON blobs)\n- Specific lines, values, or IDs (not entire files)\n- Analysis conclusions (not raw data)\n\n**Handoffs between tasks** happen through `progress.db`, not through shared-buffer handoff blobs. When you finish a task, any state the next worker needs goes into the task row itself (`steps.evidence`, `tasks.last_error`, `sop_checklist.note`) — see `hive.colony-progress-tracker`. Use `_working_notes` for things the DB schema doesn't cover.\n\nYou will receive an alert when context reaches {{warn_at_usage_ratio_pct}}% — preserve immediately.\n","core/framework/skills/_default_skills/note-taking/SKILL.md":"---\nname: hive.note-taking\ndescription: Maintain a free-form scratchpad of decisions, extracted values, and open questions so context pruning doesn't lose anything you still need.\nmetadata:\n  author: hive\n  type: default-skill\n  visibility: [worker]\n---\n\n## Operational Protocol: Structured Note-Taking\n\nMaintain free-form working notes in shared buffer key `_working_notes` for data that *you* need to remember but that isn't captured by the colony task queue.\n\n**Do not duplicate the queue in here.** Per-task goal, ordered steps, and SOP gates live in `progress.db` — use `hive.colony-progress-tracker` for those. These notes are for things the DB schema doesn't cover.\n\nUpdate at these checkpoints:\n\n- After receiving new information that changes how you plan to approach the current step\n- Before any tool call that will produce substantial output you'll need to reference later\n- When you make a non-obvious decision whose *why* would be lost if the tool call history gets pruned\n\nStructure:\n\n### Key Decisions — decisions made and WHY\n### Working Data — intermediate results, extracted values (URLs, IDs, key snippets — not full pages)\n### Open Questions — uncertainties you plan to verify\n### Blockers — anything preventing progress that isn't already captured in `tasks.last_error`\n\nUpdate incrementally — do not rewrite from scratch each time.\n","core/framework/skills/_default_skills/error-recovery/SKILL.md":"---\nname: hive.error-recovery\ndescription: Follow a structured recovery decision tree when tool calls fail instead of blindly retrying or giving up.\nmetadata:\n  author: hive\n  type: default-skill\n  visibility: [worker]\n---\n\n## Operational Protocol: Error Recovery\n\nWhen a tool call fails:\n\n1. **Diagnose** — classify the failure as *transient* (network blip, rate limit, timeout) or *structural* (wrong selector, missing auth, invalid schema, permission denied).\n\n2. **Decide:**\n   - Transient → retry once.\n   - Structural + fixable → fix the input and retry.\n   - Structural + unfixable → record the failure and move to the next item.\n   - Blocking all progress → escalate.\n\n3. **Adapt** — if the same tool has failed {{max_retries_per_tool}}+ times in a row, stop using it and find an alternative approach.\n\n**Never silently drop a failed item.** If the item is a task in the colony queue, write the failure to the DB instead of an in-memory buffer:\n\n```bash\nsqlite3 \"$DB_PATH\" \"UPDATE tasks SET status='failed', last_error='<one-sentence reason>', completed_at=datetime('now'), updated_at=datetime('now') WHERE id='<task-id>' AND worker_id='<your-worker-id>';\"\n```\n\nThe `tasks.retry_count` column and the stale-claim reclaimer handle auto-retry for crashes; your job is the within-run decision tree above. See `hive.colony-progress-tracker` for the full queue protocol.\n","core/framework/skills/_default_skills/quality-monitor/SKILL.md":"---\nname: hive.quality-monitor\ndescription: Periodically self-assess output quality to catch degradation before the judge does.\nmetadata:\n  author: hive\n  type: default-skill\n  visibility: [worker]\n---\n\n## Operational Protocol: Quality Self-Assessment\n\nEvery {{assessment_interval}} iterations, self-assess:\n\n1. On-task? Still working toward the stated objective?\n2. Thorough? Cutting corners compared to earlier?\n3. Non-repetitive? Producing new value or rehashing?\n4. Consistent? Latest output contradict earlier decisions?\n5. Complete? Tracking all items, or silently dropped some?\n\nIf degrading: write assessment to `_quality_log`, re-read `_working_notes`,\nchange approach explicitly. If acceptable: brief note in `_quality_log`.\n",".claude/skills/browser-edge-cases/SKILL.md":"---\nname: browser-edge-cases\ndescription: SOP for debugging browser automation failures on complex websites. Use when browser tools fail on specific sites like LinkedIn, Twitter/X, SPAs, or sites with Shadow DOM.\nlicense: MIT\n---\n\n# Browser Tool Edge Cases\n\nStandard Operating Procedure for debugging and fixing browser automation failures on complex websites.\n\n## When to Use This Skill\n\n- `browser_interact(action=\"scroll\")` succeeds but page doesn't move\n- `browser_interact(action=\"left_click\")` succeeds but no action triggered\n- `browser_interact(action=\"type\")` text disappears or doesn't work\n- `browser_snapshot` hangs or returns stale content\n- `browser_navigate` loads wrong content\n\n## SOP: Debugging Browser Tool Failures\n\n### Phase 1: Reproduce & Isolate\n\n```\n1. Create minimal test case demonstrating failure\n2. Test against simple site (example.com) to verify tool works\n3. Test against problematic site to confirm issue\n```\n\n**Quick isolation test:**\n```python\n# Test 1: Does the tool work at all?\nawait browser_navigate(tab_id, \"https://example.com\")\nresult = await browser_interact(action=\"scroll\", tab_id=tab_id, scroll_direction=\"down\", scroll_amount=100)\n# Should work on simple sites\n\n# Test 2: Does it fail on the problematic site?\nawait browser_navigate(tab_id, \"https://linkedin.com/feed\")\nresult = await browser_interact(action=\"scroll\", tab_id=tab_id, scroll_direction=\"down\", scroll_amount=100)\n# If this fails but example.com works → site-specific edge case\n```\n\n### Phase 2: Analyze Root Cause\n\n**Step 2a: Check console for errors**\n```python\nconsole = await browser_console(tab_id)\n# Look for: CSP violations, React errors, JavaScript exceptions\n```\n\n**Step 2b: Inspect DOM structure**\n```python\nhtml = await browser_html(tab_id)\nsnapshot = await browser_snapshot(tab_id)\n# Look for:\n# - Nested scrollable divs (overflow: scroll/auto)\n# - Shadow DOM roots\n# - iframes\n# - Custom widgets\n```\n\n**Step 2c: Identify the pattern**\n\n| Symptom | Likely Cause | Check |\n|---------|--------------|-------|\n| Scroll doesn't move | Nested scroll container | Look for `overflow: scroll` divs |\n| Click no effect | Element covered | Check `getBoundingClientRect` vs viewport |\n| Type clears | Autocomplete/React | Check for event listeners on input; try a `type` action with no selector |\n| Snapshot hangs | Huge DOM | Check node count in snapshot |\n| Snapshot stale | SPA hydration | Wait after navigation |\n\n### Phase 3: Implement Multi-Layer Fix\n\n**Pattern: Always have fallbacks**\n\n```python\nasync def robust_operation(tab_id):\n    # Method 1: Primary approach\n    try:\n        result = await primary_method(tab_id)\n        if verify_success(result):\n            return result\n    except Exception:\n        pass\n\n    # Method 2: CDP fallback\n    try:\n        result = await cdp_fallback(tab_id)\n        if verify_success(result):\n            return result\n    except Exception:\n        pass\n\n    # Method 3: JavaScript fallback\n    return await javascript_fallback(tab_id)\n```\n\n**Pattern: Always add timeouts**\n\n```python\n# Bad - can hang forever\nresult = await browser_snapshot(tab_id)\n\n# Good - fails fast with useful error\ntry:\n    result = await browser_snapshot(tab_id, timeout_s=10.0)\nexcept asyncio.TimeoutError:\n    # Handle timeout gracefully\n    result = await fallback_snapshot(tab_id)\n```\n\n### Phase 4: Verify Fix\n\n```\n1. Run against problematic site → should work\n2. Run against simple site → should still work (regression check)\n3. Document in registry.md\n```\n\n## Pattern Library\n\n### P1: Nested Scrollable Containers\n\n**Sites:** LinkedIn, Twitter/X, any SPA with scrollable feeds\n\n**Detection:**\n```javascript\n// Find largest scrollable container\nconst candidates = [];\ndocument.querySelectorAll('*').forEach(el => {\n    const style = getComputedStyle(el);\n    if (style.overflow.includes('scroll') || style.overflow.includes('auto')) {\n        const rect = el.getBoundingClientRect();\n        if (rect.width > 100 && rect.height > 100) {\n            candidates.push({el, area: rect.width * rect.height});\n        }\n    }\n});\ncandidates.sort((a, b) => b.area - a.area);\nreturn candidates[0]?.el;\n```\n\n**Fix:** Dispatch scroll events at container's center, not viewport center.\n\n### P2: Element Covered by Overlay\n\n**Sites:** Modals, tooltips, SPAs with loading overlays\n\n**Detection:**\n```javascript\nconst rect = element.getBoundingClientRect();\nconst centerX = rect.left + rect.width / 2;\nconst centerY = rect.top + rect.height / 2;\nconst topElement = document.elementFromPoint(centerX, centerY);\nreturn topElement === element || element.contains(topElement);\n```\n\n**Fix:** Wait for overlay to disappear, or use JavaScript click.\n\n### P3: React Synthetic Events\n\n**Sites:** React SPAs, modern web apps\n\n**Detection:** If CDP click doesn't trigger handler but manual click works.\n\n**Fix:** Use JavaScript click as primary:\n```javascript\nelement.click();\n```\n\n### P4: Huge DOM / Accessibility Tree\n\n**Sites:** LinkedIn, Facebook, Twitter (feeds with 1000s of nodes)\n\n**Detection:**\n```javascript\ndocument.querySelectorAll('*').length > 5000\n```\n\n**Fix:**\n1. Add timeout to snapshot operation\n2. Truncate tree at 2000 nodes\n3. Fall back to DOM-based snapshot if accessibility tree too large\n\n### P5: SPA Hydration Delay\n\n**Sites:** React, Vue, Angular SPAs after navigation\n\n**Detection:**\n```javascript\n// Check if React app has hydrated\ndocument.querySelector('[data-reactroot]') ||\ndocument.querySelector('[data-reactid]')\n```\n\n**Fix:** Wait for specific selector after navigation:\n```python\nawait browser_navigate(tab_id, url, wait_until=\"load\")\nawait browser_interact(action=\"wait\", tab_id=tab_id, wait_for_selector='[data-testid=\"content\"]', timeout_ms=5000)\n```\n\n### P6: Shadow DOM\n\n**Sites:** Components using Shadow DOM, Lit elements\n\n**Detection:**\n```javascript\ndocument.querySelectorAll('*').some(el => el.shadowRoot)\n```\n\n**Fix:** Pierce shadow root:\n```javascript\nfunction queryShadow(selector) {\n    const parts = selector.split('>>>');\n    let node = document;\n    for (const part of parts) {\n        if (node.shadowRoot) {\n            node = node.shadowRoot.querySelector(part.trim());\n        } else {\n            node = node.querySelector(part.trim());\n        }\n    }\n    return node;\n}\n```\n\n## Quick Reference\n\n| Issue | Primary Fix | Fallback |\n|-------|-------------|----------|\n| Scroll not working | Find scrollable container | Mouse wheel at container center |\n| Click no effect | JavaScript click() | CDP mouse events |\n| Type clears | `use_insert_text=False` (per-keystroke) | Use a `type` action (Input.insertText) |\n| Snapshot hangs | Add timeout_s | DOM snapshot fallback |\n| Stale content | Wait for selector | Increase wait_until timeout |\n| Shadow DOM | Pierce selector | JavaScript traversal |\n\n## References\n\n- [registry.md](registry.md) - Full list of known edge cases\n- [scripts/test_case.py](scripts/test_case.py) - Template for testing new cases\n- [BROWSER_USE_PATTERNS.md](../../tools/BROWSER_USE_PATTERNS.md) - Implementation patterns from browser-use\n","core/framework/skills/_default_skills/writing-hive-skills/SKILL.md":"---\nname: hive.writing-hive-skills\ndescription: Author a new Agent Skill for a Hive agent that conforms to the Agent Skills specification (SKILL.md with YAML frontmatter, optional scripts/references/assets directories). Use when the user asks to create, scaffold, add, or package a new skill for a Hive agent.\nmetadata:\n  author: hive\n  type: default-skill\n  spec-source: https://agentskills.io/specification\n---\n\n## Operational Protocol: Writing Hive Skills\n\nHive agents discover skills by scanning several roots, in precedence order:\n\n1. `<project>/.hive/skills/` — project, Hive-specific\n2. `<project>/.agents/skills/` — project, cross-client\n3. `~/.hive/skills/` — user, Hive-specific\n4. `~/.agents/skills/` — user, cross-client\n5. Framework defaults shipped in `core/framework/skills/_default_skills/`\n\nEach skill is a directory containing a `SKILL.md`. At startup, only the frontmatter `name` + `description` of every skill is loaded; the body is loaded only when the agent activates the skill. Design for that.\n\n### Choosing where to put a new skill\n\n- **Colony-scoped (via `write_skill` inside colony mode)**: when the skill is the operational protocol a single colony needs — its API auth, DOM selectors, DB schema, task-queue conventions — do NOT place it under `~/.hive/skills/` or `<project>/.hive/skills/` yourself. Those roots are SHARED and every colony on the machine will see it. Instead, once you're inside the colony (post-fork), call `write_skill(skill_name, skill_description, skill_body, skill_files?)` and the skill is materialized under `~/.hive/colonies/<colony_name>/skills/<skill-name>/` where only that colony's workers discover it. See the subsection below.\n- **Project-scoped**: put under `<project>/.hive/skills/` when the skill is tied to that codebase's APIs, conventions, or infra and multiple agents in the project should share it.\n- **User-scoped**: put under `~/.hive/skills/` when the skill is reusable across projects for this machine/user and all agents should see it.\n- **Framework default**: add under `core/framework/skills/_default_skills/` AND register in `framework/skills/defaults.py::SKILL_REGISTRY` only when the skill is a universal operational protocol shipped with Hive. Default skills use the `hive.<name>` naming convention and include `type: default-skill` in metadata.\n\n### Colony-scoped skills via `write_skill`\n\nA colony-scoped skill is one that belongs to exactly ONE colony — e.g. it encodes the HoneyComb staging API the `honeycomb_research` colony polls, or the LinkedIn outbound flow the `linkedin_outbound_campaign` colony runs. Writing such a skill at `~/.hive/skills/` or `<project>/.hive/skills/` leaks it to every other colony, which will then see it at selection time.\n\n**Do not create the folder yourself with the terminal.** Once the colony has been forked (via `suggest_colony` → user confirms the Create Colony popup), call `write_skill` inside the colony:\n\n```\nwrite_skill(\n    skill_name=\"honeycomb-api-protocol\",\n    skill_description=\"How to query the HoneyComb staging API…\",\n    skill_body=\"## Operational Protocol\\n\\nAuth: …\",\n    skill_files=[{\"path\": \"scripts/fetch_tickers.py\", \"content\": \"…\"}],  # optional\n)\n```\n\nThe tool writes `~/.hive/colonies/<this_colony>/skills/honeycomb-api-protocol/SKILL.md` (plus any `skill_files`), which `SkillDiscovery` picks up as project scope when that colony's workers start — and ONLY that colony's workers. No cross-colony leakage.\n\nDo not write colony-bound skill folders by hand under `~/.hive/skills/`. A skill placed there is user-scoped and becomes visible to every colony on the machine — defeating the isolation you wanted.\n\n### Directory layout\n\n```\n<skill-name>/\n├── SKILL.md          # Required\n├── scripts/          # Optional — executable helpers\n├── references/       # Optional — on-demand docs\n└── assets/           # Optional — templates, data, images\n```\n\nRules:\n- The directory name **must** equal the `name` frontmatter field (for framework defaults, the directory is the unprefixed name, e.g. `writing-hive-skills/` for `hive.writing-hive-skills`).\n- Keep `SKILL.md` under ~500 lines. Move long reference material into `references/`.\n- Reference other files with relative paths from the skill root (`scripts/foo.py`, `references/API.md`). Keep references one level deep.\n\n### SKILL.md frontmatter\n\nRequired fields:\n\n| Field | Constraints |\n|-------|-------------|\n| `name` | 1–64 chars, `[a-z0-9-]`, no leading/trailing/consecutive hyphens. Must match the directory name. Framework defaults prefix with `hive.` |\n| `description` | 1–1024 chars. Must describe **what** the skill does **and when to use it**. Include trigger keywords the user is likely to say. |\n\nOptional fields:\n\n| Field | Notes |\n|-------|-------|\n| `license` | License name or reference to a bundled file |\n| `compatibility` | ≤500 chars. Only include if env requirements are non-trivial (network, tools, runtime) |\n| `metadata` | Free-form string→string map. Namespace keys to avoid collisions. Default skills set `type: default-skill`. |\n| `allowed-tools` | Experimental. Space-separated pre-approved tools, e.g. `Bash(curl:*) Bash(jq:*) Read` |\n\nMinimal template:\n\n```markdown\n---\nname: my-skill\ndescription: One sentence on what it does. One sentence on when to use it, with concrete trigger words the agent will see in user requests.\n---\n\n# My Skill\n\n<body>\n```\n\n### Writing a good `description`\n\nThis is the single most important field — it's the only thing the agent sees at skill-selection time.\n\n- **Bad**: `Helps with trading.`\n- **Good**: `Buy and sell shares on the HoneyComb exchange. Handles auth, slippage-protected orders, idempotent retries, and AMM output estimation. Use when placing trades or interacting with the AMM.`\n\nInclude verbs the user is likely to say (`buy`, `sell`, `place trade`) and proper nouns (`HoneyComb`, `AMM`).\n\n### Writing the body\n\nStructure the body for the agent, not a human reader:\n\n1. **Lead with what the agent can't guess** — API base URLs, auth shape, project conventions, specific function names. Skip generic background (\"PDFs are a document format\").\n2. **Show exact request/response shapes** — include JSON payloads, headers, status codes. Copy real examples rather than paraphrasing.\n3. **Document failure modes** — error codes, retry rules, rate limits. This is where skills earn their keep vs. a generic agent.\n4. **Give a short end-to-end example** — a \"typical flow\" section at the bottom anchors everything above.\n\nRecommended sections (adapt to the domain):\n- Authentication / setup\n- Core operations (one per endpoint or action)\n- Error reference table\n- Rate limits / gotchas\n- End-to-end example pattern\n\n### Progressive disclosure\n\nThree tiers of context cost:\n\n1. **Always loaded** (~100 tokens per skill): `name` + `description`. Keep tight.\n2. **Loaded on activation** (<5k tokens target): body of `SKILL.md`.\n3. **Loaded on demand**: files under `scripts/`, `references/`, `assets/`. The agent reads these only when the body points to them.\n\nIf a section is long and only needed sometimes (e.g., a full schema dump, rarely-used edge cases), move it to `references/SOMETHING.md` and link to it from the body: `See [the error catalog](references/ERRORS.md) for the full list.`\n\n### Scripts\n\nPut executable helpers in `scripts/`. They should:\n- Be self-contained or document dependencies in a comment header.\n- Print human-readable errors to stderr and exit non-zero on failure.\n- Accept arguments via CLI flags, not env vars (easier for the agent to invoke).\n\nReference them from the body by relative path:\n\n```markdown\nEstimate buy output with `scripts/estimate_buy.py --v-hc 1000000 --v-shares 1000000 --hc 500`.\n```\n\nFor Python scripts in a Hive project, prefer `uv run scripts/foo.py ...`.\n\n### Creating a new skill — workflow\n\n1. Pick a `<skill-name>` (lowercase-hyphenated).\n2. Decide scope: **colony** (pass content INLINE to `create_colony` — STOP here, do not hand-author the folder), project (`<project>/.hive/skills/`), user (`~/.hive/skills/`), or framework default (`core/framework/skills/_default_skills/` + registry entry).\n3. For the non-colony scopes: create the directory and write `SKILL.md` with frontmatter + body.\n4. Add `scripts/`, `references/`, `assets/` only if needed.\n5. Validate the frontmatter: name matches dir, description is specific, no forbidden characters.\n6. Validate using the Hive CLI:\n   ```bash\n   uv run hive skill validate <path-to-skill-dir>\n   uv run hive skill doctor\n   ```\n7. Confirm discovery with `uv run hive skill list`.\n8. Test by invoking a Hive agent on a task the skill should match — confirm it activates and follows the instructions.\n\n### Registering as a framework default\n\nWhen adding a skill as a shipped default:\n\n1. Place the directory under `core/framework/skills/_default_skills/<unprefixed-name>/`.\n2. Set frontmatter `name: hive.<unprefixed-name>` and `metadata.type: default-skill`.\n3. Add the mapping to `SKILL_REGISTRY` in `core/framework/skills/defaults.py`:\n   ```python\n   SKILL_REGISTRY: dict[str, str] = {\n       ...\n       \"hive.<unprefixed-name>\": \"<unprefixed-name>\",\n   }\n   ```\n4. If the skill uses `{{placeholder}}` substitution, add defaults to `_SKILL_DEFAULTS` in the same file.\n5. If the skill reads/writes shared buffer keys, list them in `DATA_BUFFER_KEYS`.\n\n### What NOT to put in a skill\n\n- Generic programming knowledge the agent already has.\n- Conversation-specific state (use memory or plans instead).\n- Secrets or credentials (skills are plaintext; reference env vars or credential stores).\n- Deeply nested reference chains — keep everything one hop from `SKILL.md`.\n","core/framework/skills/_default_skills/colony-progress-tracker/SKILL.md":"---\nname: hive.colony-progress-tracker\ndescription: Claim tasks, record step progress, and verify SOP gates in the colony SQLite queue. Applies when your spawn message includes a db_path field.\nmetadata:\n  author: hive\n  type: default-skill\n  visibility: [worker]\n---\n\n## Operational Protocol: Colony Progress Tracker\n\n**Applies when** your spawn message has `db_path:` and `colony_id:` fields. The DB is your durable working memory — tells you what's done, what to skip, which SOP gates you owe.\n\nAccess via `terminal_exec` running `sqlite3 \"<db_path>\" \"...\"`. Tables: `tasks` (queue), `steps` (per-task decomposition), `sop_checklist` (hard gates).\n\n### Claim: assigned task (check this FIRST)\n\nIf your spawn message includes a `task_id:` field, the queen pre-assigned a specific row to you. Claim that row by id — **do not** use the generic next-pending pattern below:\n\n```bash\nsqlite3 \"<db_path>\" <<'SQL'\nUPDATE tasks SET status='claimed', worker_id='<worker-id>',\n  claim_token=lower(hex(randomblob(8))),\n  claimed_at=datetime('now'), updated_at=datetime('now')\nWHERE id='<task_id>' AND status='pending'\nRETURNING id, goal, payload;\nSQL\n```\n\nEmpty output → another worker raced you or the row is already done. Stop and report.  Non-empty → that row is yours, proceed to \"Load the plan\".\n\n### Claim: next pending (fallback when no task_id is assigned)\n\nIf your spawn message did NOT include `task_id:` — you are a generic fan-out worker racing on a shared queue. Use the generic next-pending claim:\n\n```bash\nsqlite3 \"<db_path>\" <<'SQL'\nUPDATE tasks SET status='claimed', worker_id='<worker-id>',\n  claim_token=lower(hex(randomblob(8))),\n  claimed_at=datetime('now'), updated_at=datetime('now')\nWHERE id=(SELECT id FROM tasks WHERE status='pending'\n  ORDER BY priority DESC, seq, created_at LIMIT 1)\nRETURNING id, goal, payload;\nSQL\n```\n\nEmpty output → queue drained, exit. Otherwise the returned `id` is yours. **Never SELECT-then-UPDATE** — races.\n\n### Load the plan\n\n```bash\nsqlite3 \"<db_path>\" \"SELECT seq, id, title, status FROM steps WHERE task_id='<task-id>' ORDER BY seq;\"\nsqlite3 \"<db_path>\" \"SELECT key, description, required, done_at FROM sop_checklist WHERE task_id='<task-id>';\"\n```\n\n**Skip any step where status='done'.** That's the point — don't redo completed work.\n\n### Execute a step\n\nBefore tool calls:\n```bash\nsqlite3 \"<db_path>\" \"UPDATE steps SET status='in_progress', worker_id='<worker-id>', started_at=datetime('now') WHERE id='<step-id>';\"\n```\nAfter success (one-line evidence: path, URL, key result):\n```bash\nsqlite3 \"<db_path>\" \"UPDATE steps SET status='done', evidence='<what you did>', completed_at=datetime('now') WHERE id='<step-id>';\"\n```\n\n### MANDATORY: SOP gate check before marking task done\n\n```bash\nsqlite3 \"<db_path>\" \"SELECT key, description FROM sop_checklist WHERE task_id='<task-id>' AND required=1 AND done_at IS NULL;\"\n```\n\n- Empty → proceed to \"Mark task done\".\n- Non-empty → each row is work you still owe. Do it, then check it off:\n\n```bash\nsqlite3 \"<db_path>\" \"UPDATE sop_checklist SET done_at=datetime('now'), done_by='<worker-id>', note='<why>' WHERE task_id='<task-id>' AND key='<key>';\"\n```\n\n**Never mark a task done while this SELECT returns rows.** This gate exists specifically to stop you from declaring success while skipping required steps.\n\n### Mark task done / failed\n\n```bash\n# Success:\nsqlite3 \"<db_path>\" \"UPDATE tasks SET status='done', completed_at=datetime('now'), updated_at=datetime('now') WHERE id='<task-id>' AND worker_id='<worker-id>';\"\n\n# Unrecoverable failure:\nsqlite3 \"<db_path>\" \"UPDATE tasks SET status='failed', last_error='<one sentence>', completed_at=datetime('now'), updated_at=datetime('now') WHERE id='<task-id>' AND worker_id='<worker-id>';\"\n```\n\nThe `AND worker_id=?` guard means a reclaimed row won't accept your write — treat zero rows affected as \"your claim was revoked, stop.\"\n\n### Loop\n\nAfter done/failed → claim the next task. Exit only when claim returns empty.\n\n### Errors + debug\n\n- **\"database is locked\"**: retry with 100ms → 1s backoff, max 5 attempts. `busy_timeout=5000` handles most contention silently.\n- **Queue health**: `SELECT status, count(*) FROM tasks GROUP BY status;`\n- **Your in-flight work**: `SELECT id, goal, status FROM tasks WHERE worker_id='<worker-id>';`\n\n### Anti-patterns (will break the queue)\n\n- Don't DDL (CREATE/ALTER/DROP).\n- Don't DELETE — failed tasks stay as `failed` for audit.\n- Don't skip Protocol 4 (SOP gate) before marking done.\n- Don't hold a task >15min without updates — the stale-claim reclaimer revokes your claim.\n- Don't invent task IDs. Workers update existing rows; only the queen enqueues new ones.\n","core/framework/skills/_preset_skills/terminal-tools-troubleshooting/SKILL.md":"---\nname: hive.terminal-tools-troubleshooting\ndescription: Read when a terminal-tools call returned something surprising — empty stdout despite no error, exit_code is null, output_handle came back expired, \"too many jobs\" / \"session busy\" / \"too many PTYs\", warning was set unexpectedly, semantic_status disagrees with exit_code. Diagnostic recipes only — load on demand. Don't preload; the foundational skill covers the happy path.\nmetadata:\n  author: hive\n  type: preset-skill\n  version: \"1.0\"\n---\n\n# Troubleshooting terminal-tools\n\nRecipes for surprising results. Match the symptom to the section.\n\n## Empty `stdout` despite the command \"should have\" produced output\n\nPossible causes:\n1. Output went to **stderr** instead. Check `stderr` in the envelope (or use `merge_stderr=True` for jobs).\n2. Output was **fully truncated** because `max_output_kb` is too small. Check `stdout_truncated_bytes > 0`. Bump `max_output_kb` or paginate via `output_handle`.\n3. Command produced no output (correct, just unexpected — `silent` flags, no matches).\n4. Pipeline issue: the last stage of a pipe ran but stdout went elsewhere (`> /dev/null`, redirected via `2>&1`).\n5. Process is buffering its output and didn't flush before exit. Add `stdbuf -oL` (line-buffered) or `unbuffer` to the command.\n\n## `exit_code: null`\n\n| Cause | Other field |\n|---|---|\n| Auto-backgrounded | `auto_backgrounded: true, job_id: <X>` |\n| Hard timeout, process killed | `timed_out: true` |\n| Pre-spawn failure (command not found) | `error: ...` set, `pid: null` |\n| Still running (in `terminal_job_logs`) | `status: \"running\"` |\n\n## `output_handle` returned `expired: true`\n\n5-minute TTL. Either (a) you waited too long, or (b) the store evicted it under memory pressure (64 MB total cap, LRU eviction). Re-run the command.\n\nTo reduce risk: paginate the handle as soon as you receive it, or use `terminal_job_*` for huge outputs (4 MB ring buffer with offsets — no expiry).\n\n## \"too many jobs\" / `JobLimitExceeded`\n\n`TERMINAL_TOOLS_MAX_JOBS` (default 32) hit. Either:\n- Wait for jobs to exit (poll with `terminal_job_logs(wait_until_exit=True)`)\n- Kill old jobs: `terminal_job_manage(action=\"list\")` to see what's running, then `signal_term` the abandoned ones\n- Raise the cap via env (rare)\n\n## \"session busy\"\n\nA `terminal_pty_run` was issued while another `_run` is in flight on the same session. PTY sessions are single-threaded conversations. Wait for the prior call to return, or open a second session.\n\n## \"PTY cap reached\"\n\n`TERMINAL_TOOLS_MAX_PTY` (default 8) hit. Close idle sessions (`terminal_pty_close`). Idle reaping is lazy; force it by opening — no, actually, opening throws when the cap is hit. Just close manually.\n\n## `warning` is set, the command worked\n\nInformational only. The pattern matched (e.g. `rm -rf` literally appears, or `git push --force` was used). The command ran. The warning is your \"did I mean to do that?\" prompt — verify the side effect was intended before continuing.\n\n## `semantic_status: \"ok\"` but `exit_code: 1`\n\nWorking as designed. Some commands use exit 1 for legitimate non-error states:\n- `grep` / `rg` exit 1 when **no matches** found\n- `find` exit 1 when **some directories were unreadable** (typical on `/proc`, etc.)\n- `diff` exit 1 when **files differ**\n- `test` / `[` exit 1 when **condition is false**\n\nThe `semantic_message` field explains. Trust `semantic_status`, not raw `exit_code`.\n\n## `semantic_status: \"error\"` but `exit_code: 0`\n\nShouldn't happen. If it does, file a bug.\n\n## `truncated_bytes_dropped > 0` in `terminal_job_logs`\n\nYour `since_offset` was older than the ring buffer's floor — bytes evicted before you could read them. Either:\n- Poll faster (lower latency between calls)\n- Use `merge_stderr=True` (single 4 MB ring instead of 4 MB × 2)\n- Accept the gap and move forward from `next_offset`\n\n## `terminal_pty_open` succeeds but the first `_run` times out\n\nThe session may not have produced its first prompt sentinel within the 2-second startup window. Try:\n- A `terminal_pty_run(sid, read_only=True, timeout_sec=2)` to drain whatever's accumulated\n- A noop command (`terminal_pty_run(sid, command=\"true\")`) to force a prompt cycle\n\nCould also indicate the bash process died at startup — `terminal_pty_run(sid, ...)` would then return `\"session has exited\"`.\n\n## `shell=\"/bin/zsh\"` returned an error\n\nBy design. terminal-tools is bash-only on POSIX. Use `shell=True` (default `/bin/bash`) or omit `shell=` to exec directly.\n\n## A command in `shell=True` is interpreted differently than expected\n\nBash, not zsh, semantics. `**/*` doesn't recurse without `shopt -s globstar`; `=cmd` expansion doesn't work; arrays use `arr[idx]` not `${arr[idx]}` differently than zsh. When in doubt, the foundational skill's \"bash, not zsh\" section is the canonical statement.\n","core/framework/skills/_preset_skills/terminal-tools-pty-sessions/SKILL.md":"---\nname: hive.terminal-tools-pty-sessions\ndescription: Use when you need state across calls — building env vars, navigating with cd, driving REPLs (python -i, mysql, psql, node), or responding to interactive prompts (sudo password, ssh host-key confirmation, mysql connection). Teaches the prompt-sentinel exec pattern (default mode), raw I/O for REPLs (raw_send=True then read_only=True), the one-in-flight-per-session rule, and the close-or-leak-against-the-cap discipline. Bash on macOS — never zsh; explicit shell=/bin/zsh is rejected. Read before calling terminal_pty_open.\nmetadata:\n  author: hive\n  type: preset-skill\n  version: \"1.0\"\n---\n\n# Persistent PTY sessions\n\nPTY sessions are how you talk to interactive programs — programs that detect a terminal (`isatty()`) and behave differently when they don't see one. Use a session when:\n\n- You need state to persist across calls (`cd`, env vars, sourced scripts)\n- You're driving a REPL (`python -i`, `mysql`, `psql`, `node`, `irb`)\n- A program demands an interactive prompt (`sudo`, `ssh`, `npm login`, `gh auth login`)\n\nFor everything else, `terminal_exec` is simpler. Sessions cost more (per-session bash process, ring buffer, idle-reaping bookkeeping) and have a hard cap (`TERMINAL_TOOLS_MAX_PTY`, default 8).\n\n## Why PTY (and not subprocess pipes)\n\nSubprocess pipes break on every interactive program. The moment a program calls `isatty()` and sees False, it disables prompts, color, line-editing, password masking, progress bars — sometimes refuses to start. PTY makes us look like a real terminal so these programs work the same as in your shell.\n\nThe cost: PTY output includes terminal escape codes (cursor moves, color codes). The session captures them as-is; if you need clean text, strip ANSI escapes in your processing layer.\n\n## Bash on macOS — by deliberate policy\n\n`terminal_pty_open` always invokes `/bin/bash`, regardless of the user's `$SHELL`. macOS users: yes, even when zsh is your interactive default. This is the **terminal-tools-foundations** policy applied to PTYs.\n\nReasons:\n- zsh has command/builtin classes (`zmodload`, `=cmd` expansion, `zpty`, `ztcp`) that bypass bash-shaped security checks\n- One shell behavior across platforms eliminates \"works on Linux, breaks on macOS\" surprises\n- Bash is universal: any shell you've used will accept the bash subset\n\nThe bash invocation uses `--norc --noprofile` so user dotfiles don't leak in. PS1 is set to a unique sentinel for prompt detection. PS2 is empty. PROMPT_COMMAND is empty.\n\n## Three modes of `terminal_pty_run`\n\n### 1. Default: send command, wait for prompt sentinel\n\n```\nterminal_pty_run(session_id, command=\"ls -la\")\n  → { output, prompt_after: True, ... }\n```\n\nThe session writes `ls -la\\n`, waits for the sentinel that its custom PS1 emits, returns the slice between submission and prompt. **One in-flight call per session** — a concurrent call returns a `\"session busy\"` error.\n\n### 2. raw_send: send raw input, no waiting\n\n```\nterminal_pty_run(session_id, command=\"print('hi')\\n\", raw_send=True)\n  → { bytes_sent: 12 }\n```\n\nFor REPLs, vim keystrokes, password prompts. The session writes the bytes and returns immediately — it doesn't wait for a prompt (REPLs don't print bash's prompt; they print their own).\n\nAfter a `raw_send`, you typically follow with:\n\n### 3. read_only: drain currently-buffered output\n\n```\nterminal_pty_run(session_id, read_only=True, timeout_sec=2)\n  → { output: \"hi\\n\", more: False, ... }\n```\n\nReads whatever the session has accumulated since the last drain, with a brief settle window. Use after raw_send to capture the REPL's response.\n\n## Custom prompt detection (`expect`)\n\nWhen the command launches a program with its own prompt (Python REPL's `>>> `, mysql's `mysql> `, sudo's password prompt), the bash sentinel won't appear until the program exits. Override:\n\n```\nterminal_pty_run(session_id, command=\"python3\", expect=r\">>>\\s*$\", timeout_sec=10)\n  → output up to and including \">>>\", then control returns\n```\n\nFor sudo:\n\n```\nterminal_pty_run(session_id, command=\"sudo -k && sudo whoami\", expect=r\"[Pp]assword:\")\nterminal_pty_run(session_id, command=\"<password>\", raw_send=True, command=\"<password>\\n\")\nterminal_pty_run(session_id, read_only=True, timeout_sec=5)\n```\n\n(Treat passwords carefully — they end up in the ring buffer.)\n\n## Always close\n\n```\nterminal_pty_close(session_id)\n```\n\nLeaked sessions count against `TERMINAL_TOOLS_MAX_PTY` (default 8). Idle reaping happens lazily on every `_open` call (sessions inactive longer than `idle_timeout_sec`, default 1800s, are dropped) — but don't rely on it. Close when you're done.\n\nFor unresponsive sessions, `force=True` skips the graceful \"exit\" attempt and goes straight to SIGTERM/SIGKILL.\n\n## Common patterns\n\n### Stateful navigation\n\n```\nsid = terminal_pty_open(cwd=\"/\")\nterminal_pty_run(sid, command=\"cd /var/log\")\nterminal_pty_run(sid, command=\"ls -la *.log | head\")\nterminal_pty_close(sid)\n```\n\n### Python REPL\n\n```\nsid = terminal_pty_open()\nterminal_pty_run(sid, command=\"python3\", expect=r\">>>\\s*$\")\nterminal_pty_run(sid, command=\"x = 42\", raw_send=True)\nterminal_pty_run(sid, command=\"print(x*x)\\n\", raw_send=True)\nresult = terminal_pty_run(sid, read_only=True)  # → \"1764\\n>>> \"\nterminal_pty_run(sid, command=\"exit()\", raw_send=True)\nterminal_pty_close(sid)\n```\n\n### ssh with host-key prompt\n\n```\nsid = terminal_pty_open()\nterminal_pty_run(sid, command=\"ssh user@new-host\", expect=r\"\\(yes/no.*\\)\\?\")\nterminal_pty_run(sid, command=\"yes\\n\", raw_send=True)\nterminal_pty_run(sid, read_only=True, timeout_sec=10)  # password prompt or login\n```\n","core/framework/skills/_preset_skills/x-automation/SKILL.md":"---\nname: hive.x-automation\ndescription: Read before automating X / Twitter with browser_* tools. Verified flows for post, reply, delete, search-and-engage, plus the Draft.js compose quirks that silently disable the send button. Includes the daily-reply and job-market-reply playbooks. Requires hive.browser-automation for the underlying screenshot + coordinate workflow. Verified 2026-04-11.\nmetadata:\n  author: hive\n  type: default-skill\n  version: \"1.0\"\n  verified: 2026-04-11\n  requires_skill: hive.browser-automation\n---\n\n# X / Twitter Automation\n\nX uses **Draft.js** (the original Facebook rich-text editor) for the compose text area, which was the original canary for all the rich-text editor quirks the `browser-automation` skill now documents. Most of the site is otherwise stable — `data-testid` attributes have held up for years, the SPA is reasonably honest about what it renders, and shadow DOM is minimal. The hard parts are the composer, rate limiting, and the occasional anti-bot challenge.\n\n**Always activate `browser-automation` first.** This skill assumes you already know about CSS-px coordinates, click-first typing, and `Input.insertText`. The guidance below is X-specific.\n\n## Timing expectations\n\n- `browser_navigate(wait_until=\"load\")` returns in **1.3–1.6 s** on a warm cache.\n- After navigation, **`sleep(2–3)`** for SPA hydration before querying selectors.\n- Compose modal slide-in: **~1.5 s** after clicking reply / compose.\n- First 1–2 characters typed into the compose editor **may be dropped** — see \"Draft.js quirks\" below.\n\n## Verified selectors (2026-04-11)\n\n| Target | Selector |\n|---|---|\n| Home nav link | `a[data-testid='AppTabBar_Home_Link']` |\n| Explore nav link | `a[data-testid='AppTabBar_Explore_Link']` |\n| Notifications | `a[data-testid='AppTabBar_Notifications_Link']` |\n| Main search input | `input[data-testid='SearchBox_Search_Input']` |\n| Compose text area | `[data-testid='tweetTextarea_0']` (Draft.js contenteditable) |\n| Post / Tweet submit button | `[data-testid='tweetButton']` |\n| Reply button (on feed / tweet detail) | `[data-testid='reply']` |\n| Like button | `[data-testid='like']` |\n| Retweet / repost button | `[data-testid='retweet']` |\n| Caret (⋯) menu on a post | `[data-testid='caret']` |\n| Confirmation sheet confirm button | `[data-testid='confirmationSheetConfirm']` |\n| Tweet article wrapper | `article[data-testid='tweet']` |\n| Close modal / composer | `[aria-label='Close']` or press `Escape` |\n\nAll of these are light-DOM `data-testid` attributes — `wait_for_selector` and `browser_type(selector=...)` work on them directly, no shadow piercing needed.\n\n## Post new tweet flow\n\n```\nbrowser_navigate(\"https://x.com/home\", wait_until=\"load\")\nsleep(3)\n\n# Open the compose UI (click the post-new-tweet nav or use shortcut N)\nbrowser_press(\"n\")   # keyboard shortcut — opens compose modal\nsleep(1.5)\n\n# Click the textarea to make sure Draft.js is in edit mode\nta_rect = browser_get_rect(\"[data-testid='tweetTextarea_0']\")\nbrowser_click_coordinate(ta_rect.cx, ta_rect.cy)\nsleep(0.5)\n\n# Type — browser_type handles Draft.js correctly now via Input.insertText\nbrowser_type(\"[data-testid='tweetTextarea_0']\", tweet_text)\nsleep(1.0)  # let Draft.js commit state\n\n# Verify the Post button is enabled — never click blindly, Draft.js sometimes\n# doesn't register the input even with a prior click.\nstate = browser_evaluate(\"\"\"\n  (function(){\n    const btn = document.querySelector('[data-testid=\"tweetButton\"]');\n    if (!btn) return {found: false};\n    return {\n      found: true,\n      disabled: btn.disabled || btn.getAttribute('aria-disabled') === 'true',\n    };\n  })();\n\"\"\")\nif state['found'] and not state['disabled']:\n    browser_click(\"[data-testid='tweetButton']\")\n    sleep(2)\n    browser_press(\"Escape\")  # close any leftover modal\n```\n\n## Posting a tweet WITH an image\n\n**Critical: NEVER click the photo button.** On `x.com/compose/post` the media button is a styled `<button>` that triggers Chrome's native OS file picker when clicked — that dialog is unreachable via CDP and will wedge the automation. Instead, set the file directly on the hidden `<input type='file'>` element using `browser_upload`:\n\n```python\n# 1. Open the compose modal as usual\nbrowser_press(\"n\")\nsleep(1.5)\nbrowser_click_coordinate(ta_rect.cx, ta_rect.cy)\nsleep(0.5)\nbrowser_type(\"[data-testid='tweetTextarea_0']\", tweet_text)\n\n# 2. Find the hidden file input X uses for media uploads.\n#    X's input is marked with data-testid='fileInput' and accepts\n#    image/*,video/*. It's hidden (display:none) but still mounted.\ninputs = browser_evaluate(\"\"\"\n  (function(){\n    return Array.from(document.querySelectorAll('input[type=\"file\"]'))\n      .map(el => ({\n        testid: el.getAttribute('data-testid') || '',\n        accept: el.accept || '',\n        multiple: el.multiple,\n      }));\n  })();\n\"\"\")\n# Expect to see: [{testid: 'fileInput', accept: 'image/jpeg,...', multiple: true}]\n\n# 3. Set the file WITHOUT opening any dialog\nbrowser_upload(\n    selector=\"input[data-testid='fileInput']\",\n    file_paths=[\"/absolute/path/to/photo.png\"],\n)\nsleep(2)  # X takes ~1-2s to show the preview thumbnail\n\n# 4. Verify the preview rendered before posting — if not, the upload\n#    didn't land and Post button will fail.\npreview = browser_evaluate(\"\"\"\n  (function(){\n    // X renders uploaded media as an <img> with data-testid='attachments'\n    // (or similar) inside the composer.\n    const att = document.querySelector('[data-testid=\"attachments\"] img');\n    return { hasPreview: !!att };\n  })();\n\"\"\")\nif not preview['hasPreview']:\n    raise Exception(\"Upload didn't render in composer — do NOT click Post\")\n\n# 5. Now click Post as usual\nbrowser_click(\"[data-testid='tweetButton']\")\nsleep(3)  # media upload + post takes longer than text-only\nbrowser_press(\"Escape\")\n```\n\nIf you don't already have the image file on disk, write it first: `write_file(\"/tmp/x_upload.png\", base64_bytes)` or copy from a known location. `browser_upload` requires an absolute file path — relative paths and `~` expansion are not supported.\n\n## Reply to a post flow\n\nThe reply flow is the same shape as posting, with a few scroll / find-and-click steps before.\n\n```\nbrowser_navigate(\"https://x.com/home\", wait_until=\"load\")\nsleep(3)\n\n# Load content by scrolling — X lazy-loads feed items\nbrowser_scroll(direction=\"down\", amount=2000)\nsleep(1.5)\n\n# Find replyable tweets — reply buttons, in visual/feed order\ncandidates = browser_evaluate(\"\"\"\n  (function(){\n    const tweets = document.querySelectorAll('article[data-testid=\"tweet\"]');\n    const out = [];\n    tweets.forEach((t, i) => {\n      const reply = t.querySelector('[data-testid=\"reply\"]');\n      if (!reply) return;\n      const r = reply.getBoundingClientRect();\n      if (r.width <= 0 || r.y < 0 || r.y > window.innerHeight) return;\n      const text = (t.textContent || '').slice(0, 120);\n      out.push({\n        index: i,\n        preview: text,\n        cx: r.x + r.width/2,\n        cy: r.y + r.height/2,\n      });\n    });\n    return out;\n  })();\n\"\"\")\n\n# For each unreplied candidate...\nfor c in candidates:\n    if already_replied(c['preview']):\n        continue  # see dedup pattern below\n\n    # Click reply\n    browser_click_coordinate(c['cx'], c['cy'])\n    sleep(1.5)  # composer slide-in\n\n    # Click the textarea to focus Draft.js\n    ta = browser_get_rect(\"[data-testid='tweetTextarea_0']\")\n    browser_click_coordinate(ta.cx, ta.cy)\n    sleep(0.5)\n\n    # Type the reply\n    browser_type(\"[data-testid='tweetTextarea_0']\", reply_text)\n    sleep(1.5)   # Draft.js state commit takes a beat\n\n    # Verify button enabled\n    state = browser_evaluate(\"\"\"\n      (function(){\n        const b = document.querySelector('[data-testid=\"tweetButton\"]');\n        return b ? {d: b.disabled || b.getAttribute('aria-disabled') === 'true'} : {d: true};\n      })();\n    \"\"\")\n    if state['d']:\n        # Recovery: click the textarea again + one extra character toggles React state\n        browser_click_coordinate(ta.cx, ta.cy)\n        browser_press(\"End\")\n        browser_press(\" \")\n        browser_press(\"Backspace\")\n        sleep(0.5)\n    else:\n        browser_click(\"[data-testid='tweetButton']\")\n        sleep(2)\n        # Mark the task done in progress.db — see hive.colony-progress-tracker\n\n    # Close the composer (press Escape or click the Close button)\n    browser_press(\"Escape\")\n    sleep(random.uniform(10, 20))   # human cadence — see rate limits\n```\n\n## Search-and-engage flow\n\nFor \"daily reply to live posts matching query X\" — e.g. job-market replies.\n\n```\nquery = \"job market\"\nurl = f\"https://x.com/search?q={urllib.parse.quote(query)}&src=typed_query&f=live\"\nbrowser_navigate(url, wait_until=\"load\")\nsleep(3)\nbrowser_scroll(\"down\", 2000)\nsleep(1.5)\n\n# Same replyable-tweets probe as above, then same reply-to-tweet loop\n```\n\n## Delete a post flow\n\n```\nbrowser_navigate(\"https://x.com/<your_username>/with_replies\", wait_until=\"load\")\nsleep(3)\n\n# Find the target article (by text match or index)\ntarget_caret = browser_evaluate(\"\"\"\n  (function(target_text){\n    const tweets = document.querySelectorAll('article[data-testid=\"tweet\"]');\n    for (const t of tweets){\n      if (!(t.textContent || '').includes(target_text)) continue;\n      const caret = t.querySelector('[data-testid=\"caret\"]');\n      if (!caret) continue;\n      const r = caret.getBoundingClientRect();\n      return {cx: r.x + r.width/2, cy: r.y + r.height/2};\n    }\n    return null;\n  })();\n\"\"\", target_text)\n\nbrowser_click_coordinate(target_caret['cx'], target_caret['cy'])\nsleep(0.8)   # menu animation\n\n# The Delete menuitem doesn't have a stable data-testid — find by text\ndelete_rect = browser_evaluate(\"\"\"\n  (function(){\n    const items = document.querySelectorAll('[role=\"menuitem\"]');\n    for (const el of items){\n      if ((el.textContent || '').trim() === 'Delete'){\n        const r = el.getBoundingClientRect();\n        return {cx: r.x + r.width/2, cy: r.y + r.height/2};\n      }\n    }\n    return null;\n  })();\n\"\"\")\nbrowser_click_coordinate(delete_rect['cx'], delete_rect['cy'])\nsleep(0.8)\n\n# Confirmation sheet — this one DOES have a stable testid\nbrowser_click(\"[data-testid='confirmationSheetConfirm']\")\nsleep(1.5)\n```\n\n## Draft.js quirks\n\nX's compose editor is the canonical test case for every rich-text-editor bug the GCU bridge has ever had. What you need to know:\n\n- **Click the textarea first.** Mandatory. Without a native click-sourced focus event, Draft.js's editor state never enters edit mode, and the Post button stays disabled regardless of how much text you type. `browser_type` now does this click automatically.\n\n- **`browser_type` uses CDP `Input.insertText` by default**, which Draft.js accepts cleanly. The older approach — per-character `Input.dispatchKeyEvent` with `delay_ms=20` — *also* works, but insertText is more reliable and faster. Only pass `delay_ms > 0` (which falls back to per-char dispatch) if you're specifically testing the keystroke timing path.\n\n- **First 1–2 characters may be eaten** on the per-char dispatch path (not on insertText). If you see `\"estin\"` instead of `\"testin\"`, prepend a throwaway character or use insertText.\n\n- **Verify `tweetButton`'s `disabled` state** before clicking. Draft.js's internal state can disagree with the DOM text — verify framework state via a targeted `browser_evaluate` on `aria-disabled`.\n\n- **If the button stays disabled after typing**, use the recovery dance: click the textarea again, press `End`, press a space, press `Backspace`. This forces React to recompute `hasRealContent` and usually flips the button on.\n\n- **URL previews take a beat to render.** If your tweet ends with a URL, wait 2–3 s after typing so the link-card preview loads before you post — otherwise the tweet publishes without the card.\n\n## Rate limits and safety\n\n| Action | Limit |\n|---|---|\n| Tweets per hour | ~50 before throttling |\n| Replies per session | **5–10 per run**, randomized 10–20 s delays |\n| DMs per day | Varies by account age; 50–100 for established accounts |\n| Follow/unfollow | <400/day spread over time |\n| Like per day | 1000 max; 200–300 is safer |\n\nSignals you're being rate-limited or flagged:\n- 429 status in network responses (not always visible to the agent)\n- \"You are unable to Tweet\" banner\n- Redirect to `https://x.com/account/access` (anti-bot check)\n- Posts appearing to publish but not visible on your profile\n- Reply button click opens but composer never receives focus\n\nIf any of these appear, **stop the run, screenshot the state, and surface the issue.** Do not retry immediately.\n\n## Deduplication pattern\n\nDedup is handled by the colony progress queue, not a separate JSON file. The queen enqueues one row in the `tasks` table per reply target (keyed by tweet URL); workers claim, reply, and mark done. Already-`done` rows are skipped on the next claim — that's your crash-resume and cross-day dedup, for free. See `hive.colony-progress-tracker` for the full claim/update protocol.\n\nExtract the tweet URL via `browser_evaluate` so the queen can use it as the task key:\n\n```\nurl = browser_evaluate(\"\"\"\n  (function(article_index){\n    const t = document.querySelectorAll('article[data-testid=\"tweet\"]')[article_index];\n    if (!t) return null;\n    const link = t.querySelector('a[href*=\"/status/\"]');\n    return link ? link.href : null;\n  })();\n\"\"\", article_index)\n```\n\nIf you need to check whether a given tweet URL has already been replied to in a prior run (e.g., scanning live search results before enqueuing), query the queue directly:\n\n```bash\nsqlite3 \"<db_path>\" \"SELECT status FROM tasks WHERE payload LIKE '%\\\"tweet_url\\\":\\\"<url>\\\"%';\"\n```\n\nEmpty → not yet enqueued, safe to add. Otherwise honor the existing row's status.\n\n## Reply style guidelines\n\nThese are soft rules derived from the backed-up `x-daily-replies` and `x-job-market-replies` skills — tune per your operator's preference.\n\n**Daily replies (siren_fs persona, dark humorous):**\n- 2 sentences MAX\n- Dark, humorous, insightful, trendy\n- Must feel like a real person with opinions and edge\n- Must NOT sound like AI, use corporate speak, or be corny\n- Tie to current news/culture when possible\n- English only\n- Target: 5–8 replies per run\n- Skip posts that are purely images/video with no text context\n- Prioritize high-engagement accounts\n- Skip ads unless genuinely interesting\n\n**Job-market replies (casual slang + prediction-market CTA):**\n- 2–3 short sentences max\n- Casual slang, alt spellings: \"u\", \"fr\", \"lmao\", \"lol\"\n- Always include a profile-level CTA (\"check my profile if u wanna see…\")\n- Tie the reply to the economic / career angle of the original post\n- Vary templates — never identical text across replies\n- Max 10 replies per session\n\n## Common pitfalls\n\n- **Typing without clicking first → send button stays disabled.** Draft.js only enters edit mode after a native focus event. `browser_type` handles this automatically now, but if you're using raw CDP calls, click first.\n\n- **First 1–2 chars eaten on per-char dispatch.** Stick with `browser_type` default (uses `Input.insertText`). Only use `delay_ms=20` fallback if you need per-keystroke timing.\n\n- **Clicking Post with Draft.js state disagreeing.** Always verify `[data-testid=\"tweetButton\"]`'s `disabled` / `aria-disabled` before clicking. If disabled, run the recovery dance.\n\n- **Anti-bot challenge mid-run.** X occasionally shows a JavaScript challenge or redirects to `/account/access`. Detect by checking the URL after navigation and the presence of the home nav:\n  ```\n  challenged = browser_evaluate(\"\"\"\n    (function(){\n      return window.location.href.includes('/account/access') ||\n             !document.querySelector('a[data-testid=\"AppTabBar_Home_Link\"]');\n    })();\n  \"\"\")\n  ```\n  If challenged, stop and surface to the operator. Do not try to solve it.\n\n- **Composer modal fails to open on rapid clicks.** X debounces the reply button click. Always `sleep(1.5)` after clicking before trying to query the textarea.\n\n- **Navigation inside the SPA is preferred over full page loads.** Clicking a tweet to open its detail view keeps the compose state; using `browser_navigate` reloads everything and slows the run. Use `browser_click` on internal links when possible.\n\n- **X's `window.innerHeight` changes on compose modal open.** The modal takes over most of the viewport. Don't cache viewport dimensions across a compose open; re-query after the modal slide-in.\n\n- **URL-only tweets post without a link card if you click Post too fast.** Wait 2–3 s after typing a URL before clicking Post so the card preview renders.\n\n## Auth wall detection\n\nCheck logged-in state before any action:\n\n```\nlogged_in = browser_evaluate(\"\"\"\n  (function(){\n    return !!document.querySelector('a[data-testid=\"AppTabBar_Home_Link\"]') &&\n           !window.location.href.includes('/i/flow/login');\n  })();\n\"\"\")\n```\n\nIf not logged in, **stop immediately** and surface. Do not attempt to log in via automation.\n\n## See also\n\n- `browser-automation` skill — general CDP/coord/screenshot rules, click-then-type pattern, Input.insertText\n- `linkedin-automation` skill — LinkedIn equivalent\n","core/framework/skills/_preset_skills/terminal-tools-job-control/SKILL.md":"# terminal-tools-job-control\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-job-control/SKILL.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-job-control/SKILL.md)","core/framework/skills/_preset_skills/terminal-tools-fs-search/SKILL.md":"# terminal-tools-fs-search\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-fs-search/SKILL.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-fs-search/SKILL.md)","core/framework/skills/_preset_skills/terminal-tools-foundations/SKILL.md":"# terminal-tools-foundations\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-foundations/SKILL.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-foundations/SKILL.md)","core/framework/skills/_preset_skills/linkedin-automation/SKILL.md":"# linkedin-automation\n\nPath: `core/framework/skills/_preset_skills/linkedin-automation/SKILL.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/linkedin-automation/SKILL.md)","core/framework/skills/_preset_skills/chart-creation-foundations/SKILL.md":"# chart-creation-foundations\n\nPath: `core/framework/skills/_preset_skills/chart-creation-foundations/SKILL.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/chart-creation-foundations/SKILL.md)","core/framework/skills/_preset_skills/browser-automation/SKILL.md":"# browser-automation\n\nPath: `core/framework/skills/_preset_skills/browser-automation/SKILL.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/browser-automation/SKILL.md)","AGENTS.md":"# AI Agent Protocol & Instructions\n\nPath: `AGENTS.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/AGENTS.md)","tools/BROWSER_USE_PATTERNS.md":"# Tools Skill\n\nPath: `tools/BROWSER_USE_PATTERNS.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/BROWSER_USE_PATTERNS.md)","tools/BUILDING_TOOLS.md":"# Tools Skill\n\nPath: `tools/BUILDING_TOOLS.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/BUILDING_TOOLS.md)","tools/mcp_servers.json":"# Tools Skill\n\nPath: `tools/mcp_servers.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/mcp_servers.json)","tools/README.md":"# tools Documentation\n\nPath: `tools/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/README.md)","tools/browser-extension/manifest.json":"# Browser-extension Skill\n\nPath: `tools/browser-extension/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/browser-extension/manifest.json)","tools/browser-extension/README.md":"# browser-extension Documentation\n\nPath: `tools/browser-extension/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/browser-extension/README.md)",".claude/skills/browser-edge-cases/registry.md":"# Browser-edge-cases Skill\n\nPath: `.claude/skills/browser-edge-cases/registry.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/registry.md)",".claude/skills/browser-edge-cases/scripts/test_02_twitter_scroll.py":"# Claude Directive: test_02_twitter_scroll.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_02_twitter_scroll.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_02_twitter_scroll.py)",".claude/skills/browser-edge-cases/scripts/test_03_modal_scroll.py":"# Claude Directive: test_03_modal_scroll.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_03_modal_scroll.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_03_modal_scroll.py)",".claude/skills/browser-edge-cases/scripts/test_04_element_covered.py":"# Claude Directive: test_04_element_covered.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_04_element_covered.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_04_element_covered.py)",".claude/skills/browser-edge-cases/scripts/test_06_shadow_dom.py":"# Claude Directive: test_06_shadow_dom.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_06_shadow_dom.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_06_shadow_dom.py)",".claude/skills/browser-edge-cases/scripts/test_07_contenteditable.py":"# Claude Directive: test_07_contenteditable.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_07_contenteditable.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_07_contenteditable.py)",".claude/skills/browser-edge-cases/scripts/test_08_autocomplete.py":"# Claude Directive: test_08_autocomplete.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_08_autocomplete.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_08_autocomplete.py)",".claude/skills/browser-edge-cases/scripts/test_10_huge_dom.py":"# Claude Directive: test_10_huge_dom.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_10_huge_dom.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_10_huge_dom.py)",".claude/skills/browser-edge-cases/scripts/test_13_spa_navigation.py":"# Claude Directive: test_13_spa_navigation.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_13_spa_navigation.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_13_spa_navigation.py)",".claude/skills/browser-edge-cases/scripts/test_15_screenshot.py":"# Claude Directive: test_15_screenshot.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_15_screenshot.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_15_screenshot.py)",".claude/skills/browser-edge-cases/scripts/test_case.py":"# Claude Directive: test_case.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_case.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_case.py)","core/framework/agents/credential_tester/mcp_servers.json":"# Credential_tester Skill\n\nPath: `core/framework/agents/credential_tester/mcp_servers.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/credential_tester/mcp_servers.json)","core/framework/agents/queen/mcp_registry.json":"# Queen Skill\n\nPath: `core/framework/agents/queen/mcp_registry.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/mcp_registry.json)","core/framework/agents/queen/mcp_servers.json":"# Queen Skill\n\nPath: `core/framework/agents/queen/mcp_servers.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/mcp_servers.json)","core/framework/agents/queen/reference/anti_patterns.md":"# Subagent: anti_patterns\n\nPath: `core/framework/agents/queen/reference/anti_patterns.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/reference/anti_patterns.md)","core/framework/agents/queen/reference/file_templates.md":"# Subagent: file_templates\n\nPath: `core/framework/agents/queen/reference/file_templates.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/reference/file_templates.md)","core/framework/agents/queen/reference/file_templates_declarative.md":"# Subagent: file_templates_declarative\n\nPath: `core/framework/agents/queen/reference/file_templates_declarative.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/reference/file_templates_declarative.md)","core/framework/agents/queen/reference/framework_guide.md":"# Subagent: framework_guide\n\nPath: `core/framework/agents/queen/reference/framework_guide.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/reference/framework_guide.md)","core/framework/agents/queen/reference/gcu_guide.md":"# Subagent: gcu_guide\n\nPath: `core/framework/agents/queen/reference/gcu_guide.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/reference/gcu_guide.md)","tools/src/aden_tools/tools/account_info_tool/README.md":"# account_info_tool Documentation\n\nPath: `tools/src/aden_tools/tools/account_info_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/account_info_tool/README.md)","tools/src/aden_tools/tools/airtable_tool/README.md":"# airtable_tool Documentation\n\nPath: `tools/src/aden_tools/tools/airtable_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/airtable_tool/README.md)","tools/src/aden_tools/tools/apify_tool/README.md":"# apify_tool Documentation\n\nPath: `tools/src/aden_tools/tools/apify_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/apify_tool/README.md)","tools/src/aden_tools/tools/apollo_tool/README.md":"# apollo_tool Documentation\n\nPath: `tools/src/aden_tools/tools/apollo_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/apollo_tool/README.md)","tools/src/aden_tools/tools/arxiv_tool/README.md":"# arxiv_tool Documentation\n\nPath: `tools/src/aden_tools/tools/arxiv_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/arxiv_tool/README.md)","tools/src/aden_tools/tools/asana_tool/README.md":"# asana_tool Documentation\n\nPath: `tools/src/aden_tools/tools/asana_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/asana_tool/README.md)","tools/src/aden_tools/tools/attio_tool/README.md":"# attio_tool Documentation\n\nPath: `tools/src/aden_tools/tools/attio_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/attio_tool/README.md)","tools/src/aden_tools/tools/aws_s3_tool/README.md":"# aws_s3_tool Documentation\n\nPath: `tools/src/aden_tools/tools/aws_s3_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/aws_s3_tool/README.md)","tools/src/aden_tools/tools/azure_sql_tool/README.md":"# azure_sql_tool Documentation\n\nPath: `tools/src/aden_tools/tools/azure_sql_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/azure_sql_tool/README.md)","tools/src/aden_tools/tools/bigquery_tool/README.md":"# bigquery_tool Documentation\n\nPath: `tools/src/aden_tools/tools/bigquery_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/bigquery_tool/README.md)","tools/src/aden_tools/tools/brevo_tool/README.md":"# brevo_tool Documentation\n\nPath: `tools/src/aden_tools/tools/brevo_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/brevo_tool/README.md)","tools/src/aden_tools/tools/calcom_tool/README.md":"# calcom_tool Documentation\n\nPath: `tools/src/aden_tools/tools/calcom_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/calcom_tool/README.md)","tools/src/aden_tools/tools/calendar_tool/README.md":"# calendar_tool Documentation\n\nPath: `tools/src/aden_tools/tools/calendar_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/calendar_tool/README.md)","tools/src/aden_tools/tools/calendly_tool/README.md":"# calendly_tool Documentation\n\nPath: `tools/src/aden_tools/tools/calendly_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/calendly_tool/README.md)","tools/src/aden_tools/tools/cloudflare_tool/README.md":"# cloudflare_tool Documentation\n\nPath: `tools/src/aden_tools/tools/cloudflare_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/cloudflare_tool/README.md)","tools/src/aden_tools/tools/cloudinary_tool/README.md":"# cloudinary_tool Documentation\n\nPath: `tools/src/aden_tools/tools/cloudinary_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/cloudinary_tool/README.md)","tools/src/aden_tools/tools/confluence_tool/README.md":"# confluence_tool Documentation\n\nPath: `tools/src/aden_tools/tools/confluence_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/confluence_tool/README.md)","tools/src/aden_tools/tools/csv_tool/README.md":"# csv_tool Documentation\n\nPath: `tools/src/aden_tools/tools/csv_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/csv_tool/README.md)","tools/src/aden_tools/tools/databricks_tool/README.md":"# databricks_tool Documentation\n\nPath: `tools/src/aden_tools/tools/databricks_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/databricks_tool/README.md)","tools/src/aden_tools/tools/discord_tool/README.md":"# discord_tool Documentation\n\nPath: `tools/src/aden_tools/tools/discord_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/discord_tool/README.md)","tools/src/aden_tools/tools/dns_security_scanner/README.md":"# dns_security_scanner Documentation\n\nPath: `tools/src/aden_tools/tools/dns_security_scanner/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/dns_security_scanner/README.md)","tools/src/aden_tools/tools/docker_hub_tool/README.md":"# docker_hub_tool Documentation\n\nPath: `tools/src/aden_tools/tools/docker_hub_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/docker_hub_tool/README.md)","tools/src/aden_tools/tools/duckduckgo_tool/README.md":"# duckduckgo_tool Documentation\n\nPath: `tools/src/aden_tools/tools/duckduckgo_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/duckduckgo_tool/README.md)","tools/src/aden_tools/tools/email_tool/README.md":"# email_tool Documentation\n\nPath: `tools/src/aden_tools/tools/email_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/email_tool/README.md)","tools/src/aden_tools/tools/exa_search_tool/README.md":"# exa_search_tool Documentation\n\nPath: `tools/src/aden_tools/tools/exa_search_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/exa_search_tool/README.md)","tools/src/aden_tools/tools/excel_tool/README.md":"# excel_tool Documentation\n\nPath: `tools/src/aden_tools/tools/excel_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/excel_tool/README.md)","tools/src/aden_tools/tools/file_system_toolkits/README.md":"# file_system_toolkits Documentation\n\nPath: `tools/src/aden_tools/tools/file_system_toolkits/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/file_system_toolkits/README.md)","tools/src/aden_tools/tools/freshdesk_tool/README.md":"# freshdesk_tool Documentation\n\nPath: `tools/src/aden_tools/tools/freshdesk_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/freshdesk_tool/README.md)","tools/src/aden_tools/tools/github_tool/README.md":"# github_tool Documentation\n\nPath: `tools/src/aden_tools/tools/github_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/github_tool/README.md)","tools/src/aden_tools/tools/gitlab_tool/README.md":"# gitlab_tool Documentation\n\nPath: `tools/src/aden_tools/tools/gitlab_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/gitlab_tool/README.md)","tools/src/aden_tools/tools/gmail_tool/README.md":"# gmail_tool Documentation\n\nPath: `tools/src/aden_tools/tools/gmail_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/gmail_tool/README.md)","tools/src/aden_tools/tools/google_analytics_tool/README.md":"# google_analytics_tool Documentation\n\nPath: `tools/src/aden_tools/tools/google_analytics_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/google_analytics_tool/README.md)","tools/src/aden_tools/tools/google_docs_tool/README.md":"# google_docs_tool Documentation\n\nPath: `tools/src/aden_tools/tools/google_docs_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/google_docs_tool/README.md)","tools/src/aden_tools/tools/google_maps_tool/README.md":"# google_maps_tool Documentation\n\nPath: `tools/src/aden_tools/tools/google_maps_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/google_maps_tool/README.md)","tools/src/aden_tools/tools/google_search_console_tool/README.md":"# google_search_console_tool Documentation\n\nPath: `tools/src/aden_tools/tools/google_search_console_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/google_search_console_tool/README.md)","tools/src/aden_tools/tools/google_sheets_tool/README.md":"# google_sheets_tool Documentation\n\nPath: `tools/src/aden_tools/tools/google_sheets_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/google_sheets_tool/README.md)","tools/src/aden_tools/tools/greenhouse_tool/README.md":"# greenhouse_tool Documentation\n\nPath: `tools/src/aden_tools/tools/greenhouse_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/greenhouse_tool/README.md)","tools/src/aden_tools/tools/http_headers_scanner/README.md":"# http_headers_scanner Documentation\n\nPath: `tools/src/aden_tools/tools/http_headers_scanner/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/http_headers_scanner/README.md)","tools/src/aden_tools/tools/hubspot_tool/README.md":"# hubspot_tool Documentation\n\nPath: `tools/src/aden_tools/tools/hubspot_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/hubspot_tool/README.md)","tools/src/aden_tools/tools/huggingface_tool/README.md":"# huggingface_tool Documentation\n\nPath: `tools/src/aden_tools/tools/huggingface_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/huggingface_tool/README.md)","tools/src/aden_tools/tools/intercom_tool/README.md":"# intercom_tool Documentation\n\nPath: `tools/src/aden_tools/tools/intercom_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/intercom_tool/README.md)","tools/src/aden_tools/tools/jira_tool/README.md":"# jira_tool Documentation\n\nPath: `tools/src/aden_tools/tools/jira_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/jira_tool/README.md)","tools/src/aden_tools/tools/kafka_tool/README.md":"# kafka_tool Documentation\n\nPath: `tools/src/aden_tools/tools/kafka_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/kafka_tool/README.md)","tools/src/aden_tools/tools/langfuse_tool/README.md":"# langfuse_tool Documentation\n\nPath: `tools/src/aden_tools/tools/langfuse_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/langfuse_tool/README.md)","tools/src/aden_tools/tools/linear_tool/README.md":"# linear_tool Documentation\n\nPath: `tools/src/aden_tools/tools/linear_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/linear_tool/README.md)","tools/src/aden_tools/tools/lusha_tool/README.md":"# lusha_tool Documentation\n\nPath: `tools/src/aden_tools/tools/lusha_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/lusha_tool/README.md)","tools/src/aden_tools/tools/microsoft_graph_tool/README.md":"# microsoft_graph_tool Documentation\n\nPath: `tools/src/aden_tools/tools/microsoft_graph_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/microsoft_graph_tool/README.md)","tools/src/aden_tools/tools/mongodb_tool/README.md":"# mongodb_tool Documentation\n\nPath: `tools/src/aden_tools/tools/mongodb_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/mongodb_tool/README.md)","tools/src/aden_tools/tools/mssql_tool/README.md":"# mssql_tool Documentation\n\nPath: `tools/src/aden_tools/tools/mssql_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/mssql_tool/README.md)","tools/src/aden_tools/tools/n8n_tool/README.md":"# n8n_tool Documentation\n\nPath: `tools/src/aden_tools/tools/n8n_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/n8n_tool/README.md)","tools/src/aden_tools/tools/news_tool/README.md":"# news_tool Documentation\n\nPath: `tools/src/aden_tools/tools/news_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/news_tool/README.md)","tools/src/aden_tools/tools/notion_tool/README.md":"# notion_tool Documentation\n\nPath: `tools/src/aden_tools/tools/notion_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/notion_tool/README.md)","tools/src/aden_tools/tools/obsidian_tool/README.md":"# obsidian_tool Documentation\n\nPath: `tools/src/aden_tools/tools/obsidian_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/obsidian_tool/README.md)","tools/src/aden_tools/tools/openmeteo_tool/README.md":"# openmeteo_tool Documentation\n\nPath: `tools/src/aden_tools/tools/openmeteo_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/openmeteo_tool/README.md)","tools/src/aden_tools/tools/pagerduty_tool/README.md":"# pagerduty_tool Documentation\n\nPath: `tools/src/aden_tools/tools/pagerduty_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/pagerduty_tool/README.md)","tools/src/aden_tools/tools/pdf_read_tool/README.md":"# pdf_read_tool Documentation\n\nPath: `tools/src/aden_tools/tools/pdf_read_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/pdf_read_tool/README.md)","tools/src/aden_tools/tools/pinecone_tool/README.md":"# pinecone_tool Documentation\n\nPath: `tools/src/aden_tools/tools/pinecone_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/pinecone_tool/README.md)","tools/src/aden_tools/tools/pipedrive_tool/README.md":"# pipedrive_tool Documentation\n\nPath: `tools/src/aden_tools/tools/pipedrive_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/pipedrive_tool/README.md)","tools/src/aden_tools/tools/plaid_tool/README.md":"# plaid_tool Documentation\n\nPath: `tools/src/aden_tools/tools/plaid_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/plaid_tool/README.md)","tools/src/aden_tools/tools/port_scanner/README.md":"# port_scanner Documentation\n\nPath: `tools/src/aden_tools/tools/port_scanner/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/port_scanner/README.md)","tools/src/aden_tools/tools/postgres_tool/README.md":"# postgres_tool Documentation\n\nPath: `tools/src/aden_tools/tools/postgres_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/postgres_tool/README.md)","tools/src/aden_tools/tools/powerbi_tool/README.md":"# powerbi_tool Documentation\n\nPath: `tools/src/aden_tools/tools/powerbi_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/powerbi_tool/README.md)","tools/src/aden_tools/tools/prometheus_tool/README.md":"# prometheus_tool Documentation\n\nPath: `tools/src/aden_tools/tools/prometheus_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/prometheus_tool/README.md)","tools/src/aden_tools/tools/pushover_tool/README.md":"# pushover_tool Documentation\n\nPath: `tools/src/aden_tools/tools/pushover_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/pushover_tool/README.md)","tools/src/aden_tools/tools/quickbooks_tool/README.md":"# quickbooks_tool Documentation\n\nPath: `tools/src/aden_tools/tools/quickbooks_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/quickbooks_tool/README.md)","tools/src/aden_tools/tools/razorpay_tool/README.md":"# razorpay_tool Documentation\n\nPath: `tools/src/aden_tools/tools/razorpay_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/razorpay_tool/README.md)","tools/src/aden_tools/tools/reddit_tool/README.md":"# reddit_tool Documentation\n\nPath: `tools/src/aden_tools/tools/reddit_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/reddit_tool/README.md)","tools/src/aden_tools/tools/redis_tool/README.md":"# redis_tool Documentation\n\nPath: `tools/src/aden_tools/tools/redis_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/redis_tool/README.md)","tools/src/aden_tools/tools/redshift_tool/README.md":"# redshift_tool Documentation\n\nPath: `tools/src/aden_tools/tools/redshift_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/redshift_tool/README.md)","tools/src/aden_tools/tools/risk_scorer/README.md":"# risk_scorer Documentation\n\nPath: `tools/src/aden_tools/tools/risk_scorer/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/risk_scorer/README.md)","tools/src/aden_tools/tools/salesforce_tool/README.md":"# salesforce_tool Documentation\n\nPath: `tools/src/aden_tools/tools/salesforce_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/salesforce_tool/README.md)","tools/src/aden_tools/tools/sap_tool/README.md":"# sap_tool Documentation\n\nPath: `tools/src/aden_tools/tools/sap_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/sap_tool/README.md)","tools/src/aden_tools/tools/serpapi_tool/README.md":"# serpapi_tool Documentation\n\nPath: `tools/src/aden_tools/tools/serpapi_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/serpapi_tool/README.md)","tools/src/aden_tools/tools/shopify_tool/README.md":"# shopify_tool Documentation\n\nPath: `tools/src/aden_tools/tools/shopify_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/shopify_tool/README.md)","tools/src/aden_tools/tools/similarweb_tool/README.md":"# similarweb_tool Documentation\n\nPath: `tools/src/aden_tools/tools/similarweb_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/similarweb_tool/README.md)","tools/src/aden_tools/tools/slack_tool/README.md":"# slack_tool Documentation\n\nPath: `tools/src/aden_tools/tools/slack_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/slack_tool/README.md)","tools/src/aden_tools/tools/snowflake_tool/README.md":"# snowflake_tool Documentation\n\nPath: `tools/src/aden_tools/tools/snowflake_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/snowflake_tool/README.md)","tools/src/aden_tools/tools/ssl_tls_scanner/README.md":"# ssl_tls_scanner Documentation\n\nPath: `tools/src/aden_tools/tools/ssl_tls_scanner/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/ssl_tls_scanner/README.md)","tools/src/aden_tools/tools/stripe_tool/README.md":"# stripe_tool Documentation\n\nPath: `tools/src/aden_tools/tools/stripe_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/stripe_tool/README.md)","tools/src/aden_tools/tools/subdomain_enumerator/README.md":"# subdomain_enumerator Documentation\n\nPath: `tools/src/aden_tools/tools/subdomain_enumerator/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/subdomain_enumerator/README.md)","tools/src/aden_tools/tools/supabase_tool/README.md":"# supabase_tool Documentation\n\nPath: `tools/src/aden_tools/tools/supabase_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/supabase_tool/README.md)","tools/src/aden_tools/tools/tech_stack_detector/README.md":"# tech_stack_detector Documentation\n\nPath: `tools/src/aden_tools/tools/tech_stack_detector/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/tech_stack_detector/README.md)","tools/src/aden_tools/tools/telegram_tool/README.md":"# telegram_tool Documentation\n\nPath: `tools/src/aden_tools/tools/telegram_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/telegram_tool/README.md)","tools/src/aden_tools/tools/terraform_tool/README.md":"# terraform_tool Documentation\n\nPath: `tools/src/aden_tools/tools/terraform_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/terraform_tool/README.md)","tools/src/aden_tools/tools/time_tool/README.md":"# time_tool Documentation\n\nPath: `tools/src/aden_tools/tools/time_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/time_tool/README.md)","tools/src/aden_tools/tools/tines_tool/README.md":"# tines_tool Documentation\n\nPath: `tools/src/aden_tools/tools/tines_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/tines_tool/README.md)","tools/src/aden_tools/tools/trello_tool/README.md":"# trello_tool Documentation\n\nPath: `tools/src/aden_tools/tools/trello_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/trello_tool/README.md)","tools/src/aden_tools/tools/twilio_tool/README.md":"# twilio_tool Documentation\n\nPath: `tools/src/aden_tools/tools/twilio_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/twilio_tool/README.md)","tools/src/aden_tools/tools/twitter_tool/README.md":"# twitter_tool Documentation\n\nPath: `tools/src/aden_tools/tools/twitter_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/twitter_tool/README.md)","tools/src/aden_tools/tools/vercel_tool/README.md":"# vercel_tool Documentation\n\nPath: `tools/src/aden_tools/tools/vercel_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/vercel_tool/README.md)","tools/src/aden_tools/tools/vision_tool/README.md":"# vision_tool Documentation\n\nPath: `tools/src/aden_tools/tools/vision_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/vision_tool/README.md)","tools/src/aden_tools/tools/wandb_tool/README.md":"# wandb_tool Documentation\n\nPath: `tools/src/aden_tools/tools/wandb_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/wandb_tool/README.md)","tools/src/aden_tools/tools/web_scrape_tool/README.md":"# web_scrape_tool Documentation\n\nPath: `tools/src/aden_tools/tools/web_scrape_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/web_scrape_tool/README.md)","tools/src/aden_tools/tools/web_search_tool/README.md":"# web_search_tool Documentation\n\nPath: `tools/src/aden_tools/tools/web_search_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/web_search_tool/README.md)","tools/src/aden_tools/tools/wikipedia_tool/README.md":"# wikipedia_tool Documentation\n\nPath: `tools/src/aden_tools/tools/wikipedia_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/wikipedia_tool/README.md)","tools/src/aden_tools/tools/yahoo_finance_tool/README.md":"# yahoo_finance_tool Documentation\n\nPath: `tools/src/aden_tools/tools/yahoo_finance_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/yahoo_finance_tool/README.md)","tools/src/aden_tools/tools/youtube_tool/README.md":"# youtube_tool Documentation\n\nPath: `tools/src/aden_tools/tools/youtube_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/youtube_tool/README.md)","tools/src/aden_tools/tools/youtube_transcript_tool/README.md":"# youtube_transcript_tool Documentation\n\nPath: `tools/src/aden_tools/tools/youtube_transcript_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/youtube_transcript_tool/README.md)","tools/src/aden_tools/tools/zendesk_tool/README.md":"# zendesk_tool Documentation\n\nPath: `tools/src/aden_tools/tools/zendesk_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/zendesk_tool/README.md)","tools/src/aden_tools/tools/zoho_crm_tool/README.md":"# zoho_crm_tool Documentation\n\nPath: `tools/src/aden_tools/tools/zoho_crm_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/zoho_crm_tool/README.md)","tools/src/aden_tools/tools/zoom_tool/README.md":"# zoom_tool Documentation\n\nPath: `tools/src/aden_tools/tools/zoom_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/zoom_tool/README.md)","core/framework/skills/_preset_skills/terminal-tools-job-control/references/signals.md":"# References Skill\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-job-control/references/signals.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-job-control/references/signals.md)","core/framework/skills/_preset_skills/terminal-tools-fs-search/references/find_predicates.md":"# References Skill\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-fs-search/references/find_predicates.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-fs-search/references/find_predicates.md)","core/framework/skills/_preset_skills/terminal-tools-fs-search/references/ripgrep_cheatsheet.md":"# References Skill\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-fs-search/references/ripgrep_cheatsheet.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-fs-search/references/ripgrep_cheatsheet.md)","core/framework/skills/_preset_skills/terminal-tools-foundations/references/exit_codes.md":"# References Skill\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-foundations/references/exit_codes.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-foundations/references/exit_codes.md)"},"files":{".claude/skills/triage-issue/SKILL.md":"# Triage Issue Skill\n\nAnalyze a GitHub issue, verify claims against the codebase, and close invalid issues with a technical response.\n\n## Trigger\n\nUser provides a GitHub issue URL or number, e.g.:\n- `/triage-issue 1970`\n- `/triage-issue https://github.com/adenhq/hive/issues/1970`\n\n## Workflow\n\n### Step 1: Fetch Issue Details\n\n```bash\ngh issue view <number> --repo adenhq/hive --json title,body,state,labels,author\n```\n\nExtract:\n- Title\n- Body (the claim/bug report)\n- Current state\n- Labels\n- Author\n\nIf issue is already closed, inform user and stop.\n\n### Step 2: Analyze the Claim\n\nRead the issue body and identify:\n1. **The core claim** - What is the user asserting?\n2. **Technical specifics** - File paths, function names, code snippets mentioned\n3. **Expected behavior** - What do they think should happen?\n4. **Severity claimed** - Security issue? Bug? Feature request?\n\n### Step 3: Investigate the Codebase\n\nFor each technical claim:\n1. Find the referenced code using Grep/Glob/Read\n2. Understand the actual implementation\n3. Check if the claim accurately describes the behavior\n4. Look for related tests, documentation, or design decisions\n\n### Step 4: Evaluate Validity\n\nCategorize the issue as one of:\n\n| Category | Action |\n|----------|--------|\n| **Valid Bug** | Do NOT close. Inform user this is a real issue. |\n| **Valid Feature Request** | Do NOT close. Suggest labeling appropriately. |\n| **Misunderstanding** | Prepare technical explanation for why behavior is correct. |\n| **Fundamentally Flawed** | Prepare critique explaining the technical impossibility or design rationale. |\n| **Duplicate** | Find the original issue and prepare duplicate notice. |\n| **Incomplete** | Prepare request for more information. |\n\n### Step 5: Draft Response\n\nFor issues to be closed, draft a response that:\n\n1. **Acknowledges the concern** - Don't be dismissive\n2. **Explains the actual behavior** - With code references\n3. **Provides technical rationale** - Why it works this way\n4. **References industry standards** - If applicable\n5. **Offers alternatives** - If there's a better approach for the user\n\nUse this template:\n\n```markdown\n## Analysis\n\n[Brief summary of what was investigated]\n\n## Technical Details\n\n[Explanation with code references]\n\n## Why This Is Working As Designed\n\n[Rationale]\n\n## Recommendation\n\n[What the user should do instead, if applicable]\n\n---\n*This issue was reviewed and closed by the maintainers.*\n```\n\n### Step 6: User Review\n\nPresent the draft to the user with:\n\n```\n## Issue #<number>: <title>\n\n**Claim:** <summary of claim>\n\n**Finding:** <valid/invalid/misunderstanding/etc>\n\n**Draft Response:**\n<the markdown response>\n\n---\nDo you want me to post this comment and close the issue?\n```\n\nUse AskUserQuestion with options:\n- \"Post and close\" - Post comment, close issue\n- \"Edit response\" - Let user modify the response\n- \"Skip\" - Don't take action\n\n### Step 7: Execute Action\n\nIf user approves:\n\n```bash\n# Post comment\ngh issue comment <number> --repo adenhq/hive --body \"<response>\"\n\n# Close issue\ngh issue close <number> --repo adenhq/hive --reason \"not planned\"\n```\n\nReport success with link to the issue.\n\n## Important Guidelines\n\n1. **Never close valid issues** - If there's any merit to the claim, don't close it\n2. **Be respectful** - The reporter took time to file the issue\n3. **Be technical** - Provide code references and evidence\n4. **Be educational** - Help them understand, don't just dismiss\n5. **Check twice** - Make sure you understand the code before declaring something invalid\n6. **Consider edge cases** - Maybe their environment reveals a real issue\n\n## Example Critiques\n\n### Security Misunderstanding\n> \"The claim that secrets are exposed in plaintext misunderstands the encryption architecture. While `SecretStr` is used for logging protection, actual encryption is provided by Fernet (AES-128-CBC) at the storage layer. The code path is: serialize → encrypt → write. Only encrypted bytes touch disk.\"\n\n### Impossible Request\n> \"The requested feature would require [X] which violates [fundamental constraint]. This is not a limitation of our implementation but a fundamental property of [technology/protocol].\"\n\n### Already Handled\n> \"This scenario is already handled by [code reference]. The reporter may be using an older version or misconfigured environment.\"\n","core/framework/skills/_default_skills/context-preservation/SKILL.md":"---\nname: hive.context-preservation\ndescription: Proactively extract critical values from tool results into working notes before automatic context pruning destroys them.\nmetadata:\n  author: hive\n  type: default-skill\n  visibility: [worker]\n---\n\n## Operational Protocol: Context Preservation\n\nYou operate under a finite context window. Older tool results WILL be pruned. Extract what you need while it's still in context.\n\n**Save-as-you-go.** After any tool call producing information you'll need later, immediately extract the key data into `_working_notes` or `_preserved_data`. Do not rely on referring back to old tool results — once they're pruned they're gone.\n\n**What to extract:**\n- URLs and key snippets (not full pages)\n- Relevant API fields (not raw JSON blobs)\n- Specific lines, values, or IDs (not entire files)\n- Analysis conclusions (not raw data)\n\n**Handoffs between tasks** happen through `progress.db`, not through shared-buffer handoff blobs. When you finish a task, any state the next worker needs goes into the task row itself (`steps.evidence`, `tasks.last_error`, `sop_checklist.note`) — see `hive.colony-progress-tracker`. Use `_working_notes` for things the DB schema doesn't cover.\n\nYou will receive an alert when context reaches {{warn_at_usage_ratio_pct}}% — preserve immediately.\n","core/framework/skills/_default_skills/note-taking/SKILL.md":"---\nname: hive.note-taking\ndescription: Maintain a free-form scratchpad of decisions, extracted values, and open questions so context pruning doesn't lose anything you still need.\nmetadata:\n  author: hive\n  type: default-skill\n  visibility: [worker]\n---\n\n## Operational Protocol: Structured Note-Taking\n\nMaintain free-form working notes in shared buffer key `_working_notes` for data that *you* need to remember but that isn't captured by the colony task queue.\n\n**Do not duplicate the queue in here.** Per-task goal, ordered steps, and SOP gates live in `progress.db` — use `hive.colony-progress-tracker` for those. These notes are for things the DB schema doesn't cover.\n\nUpdate at these checkpoints:\n\n- After receiving new information that changes how you plan to approach the current step\n- Before any tool call that will produce substantial output you'll need to reference later\n- When you make a non-obvious decision whose *why* would be lost if the tool call history gets pruned\n\nStructure:\n\n### Key Decisions — decisions made and WHY\n### Working Data — intermediate results, extracted values (URLs, IDs, key snippets — not full pages)\n### Open Questions — uncertainties you plan to verify\n### Blockers — anything preventing progress that isn't already captured in `tasks.last_error`\n\nUpdate incrementally — do not rewrite from scratch each time.\n","core/framework/skills/_default_skills/error-recovery/SKILL.md":"---\nname: hive.error-recovery\ndescription: Follow a structured recovery decision tree when tool calls fail instead of blindly retrying or giving up.\nmetadata:\n  author: hive\n  type: default-skill\n  visibility: [worker]\n---\n\n## Operational Protocol: Error Recovery\n\nWhen a tool call fails:\n\n1. **Diagnose** — classify the failure as *transient* (network blip, rate limit, timeout) or *structural* (wrong selector, missing auth, invalid schema, permission denied).\n\n2. **Decide:**\n   - Transient → retry once.\n   - Structural + fixable → fix the input and retry.\n   - Structural + unfixable → record the failure and move to the next item.\n   - Blocking all progress → escalate.\n\n3. **Adapt** — if the same tool has failed {{max_retries_per_tool}}+ times in a row, stop using it and find an alternative approach.\n\n**Never silently drop a failed item.** If the item is a task in the colony queue, write the failure to the DB instead of an in-memory buffer:\n\n```bash\nsqlite3 \"$DB_PATH\" \"UPDATE tasks SET status='failed', last_error='<one-sentence reason>', completed_at=datetime('now'), updated_at=datetime('now') WHERE id='<task-id>' AND worker_id='<your-worker-id>';\"\n```\n\nThe `tasks.retry_count` column and the stale-claim reclaimer handle auto-retry for crashes; your job is the within-run decision tree above. See `hive.colony-progress-tracker` for the full queue protocol.\n","core/framework/skills/_default_skills/quality-monitor/SKILL.md":"---\nname: hive.quality-monitor\ndescription: Periodically self-assess output quality to catch degradation before the judge does.\nmetadata:\n  author: hive\n  type: default-skill\n  visibility: [worker]\n---\n\n## Operational Protocol: Quality Self-Assessment\n\nEvery {{assessment_interval}} iterations, self-assess:\n\n1. On-task? Still working toward the stated objective?\n2. Thorough? Cutting corners compared to earlier?\n3. Non-repetitive? Producing new value or rehashing?\n4. Consistent? Latest output contradict earlier decisions?\n5. Complete? Tracking all items, or silently dropped some?\n\nIf degrading: write assessment to `_quality_log`, re-read `_working_notes`,\nchange approach explicitly. If acceptable: brief note in `_quality_log`.\n",".claude/skills/browser-edge-cases/SKILL.md":"---\nname: browser-edge-cases\ndescription: SOP for debugging browser automation failures on complex websites. Use when browser tools fail on specific sites like LinkedIn, Twitter/X, SPAs, or sites with Shadow DOM.\nlicense: MIT\n---\n\n# Browser Tool Edge Cases\n\nStandard Operating Procedure for debugging and fixing browser automation failures on complex websites.\n\n## When to Use This Skill\n\n- `browser_interact(action=\"scroll\")` succeeds but page doesn't move\n- `browser_interact(action=\"left_click\")` succeeds but no action triggered\n- `browser_interact(action=\"type\")` text disappears or doesn't work\n- `browser_snapshot` hangs or returns stale content\n- `browser_navigate` loads wrong content\n\n## SOP: Debugging Browser Tool Failures\n\n### Phase 1: Reproduce & Isolate\n\n```\n1. Create minimal test case demonstrating failure\n2. Test against simple site (example.com) to verify tool works\n3. Test against problematic site to confirm issue\n```\n\n**Quick isolation test:**\n```python\n# Test 1: Does the tool work at all?\nawait browser_navigate(tab_id, \"https://example.com\")\nresult = await browser_interact(action=\"scroll\", tab_id=tab_id, scroll_direction=\"down\", scroll_amount=100)\n# Should work on simple sites\n\n# Test 2: Does it fail on the problematic site?\nawait browser_navigate(tab_id, \"https://linkedin.com/feed\")\nresult = await browser_interact(action=\"scroll\", tab_id=tab_id, scroll_direction=\"down\", scroll_amount=100)\n# If this fails but example.com works → site-specific edge case\n```\n\n### Phase 2: Analyze Root Cause\n\n**Step 2a: Check console for errors**\n```python\nconsole = await browser_console(tab_id)\n# Look for: CSP violations, React errors, JavaScript exceptions\n```\n\n**Step 2b: Inspect DOM structure**\n```python\nhtml = await browser_html(tab_id)\nsnapshot = await browser_snapshot(tab_id)\n# Look for:\n# - Nested scrollable divs (overflow: scroll/auto)\n# - Shadow DOM roots\n# - iframes\n# - Custom widgets\n```\n\n**Step 2c: Identify the pattern**\n\n| Symptom | Likely Cause | Check |\n|---------|--------------|-------|\n| Scroll doesn't move | Nested scroll container | Look for `overflow: scroll` divs |\n| Click no effect | Element covered | Check `getBoundingClientRect` vs viewport |\n| Type clears | Autocomplete/React | Check for event listeners on input; try a `type` action with no selector |\n| Snapshot hangs | Huge DOM | Check node count in snapshot |\n| Snapshot stale | SPA hydration | Wait after navigation |\n\n### Phase 3: Implement Multi-Layer Fix\n\n**Pattern: Always have fallbacks**\n\n```python\nasync def robust_operation(tab_id):\n    # Method 1: Primary approach\n    try:\n        result = await primary_method(tab_id)\n        if verify_success(result):\n            return result\n    except Exception:\n        pass\n\n    # Method 2: CDP fallback\n    try:\n        result = await cdp_fallback(tab_id)\n        if verify_success(result):\n            return result\n    except Exception:\n        pass\n\n    # Method 3: JavaScript fallback\n    return await javascript_fallback(tab_id)\n```\n\n**Pattern: Always add timeouts**\n\n```python\n# Bad - can hang forever\nresult = await browser_snapshot(tab_id)\n\n# Good - fails fast with useful error\ntry:\n    result = await browser_snapshot(tab_id, timeout_s=10.0)\nexcept asyncio.TimeoutError:\n    # Handle timeout gracefully\n    result = await fallback_snapshot(tab_id)\n```\n\n### Phase 4: Verify Fix\n\n```\n1. Run against problematic site → should work\n2. Run against simple site → should still work (regression check)\n3. Document in registry.md\n```\n\n## Pattern Library\n\n### P1: Nested Scrollable Containers\n\n**Sites:** LinkedIn, Twitter/X, any SPA with scrollable feeds\n\n**Detection:**\n```javascript\n// Find largest scrollable container\nconst candidates = [];\ndocument.querySelectorAll('*').forEach(el => {\n    const style = getComputedStyle(el);\n    if (style.overflow.includes('scroll') || style.overflow.includes('auto')) {\n        const rect = el.getBoundingClientRect();\n        if (rect.width > 100 && rect.height > 100) {\n            candidates.push({el, area: rect.width * rect.height});\n        }\n    }\n});\ncandidates.sort((a, b) => b.area - a.area);\nreturn candidates[0]?.el;\n```\n\n**Fix:** Dispatch scroll events at container's center, not viewport center.\n\n### P2: Element Covered by Overlay\n\n**Sites:** Modals, tooltips, SPAs with loading overlays\n\n**Detection:**\n```javascript\nconst rect = element.getBoundingClientRect();\nconst centerX = rect.left + rect.width / 2;\nconst centerY = rect.top + rect.height / 2;\nconst topElement = document.elementFromPoint(centerX, centerY);\nreturn topElement === element || element.contains(topElement);\n```\n\n**Fix:** Wait for overlay to disappear, or use JavaScript click.\n\n### P3: React Synthetic Events\n\n**Sites:** React SPAs, modern web apps\n\n**Detection:** If CDP click doesn't trigger handler but manual click works.\n\n**Fix:** Use JavaScript click as primary:\n```javascript\nelement.click();\n```\n\n### P4: Huge DOM / Accessibility Tree\n\n**Sites:** LinkedIn, Facebook, Twitter (feeds with 1000s of nodes)\n\n**Detection:**\n```javascript\ndocument.querySelectorAll('*').length > 5000\n```\n\n**Fix:**\n1. Add timeout to snapshot operation\n2. Truncate tree at 2000 nodes\n3. Fall back to DOM-based snapshot if accessibility tree too large\n\n### P5: SPA Hydration Delay\n\n**Sites:** React, Vue, Angular SPAs after navigation\n\n**Detection:**\n```javascript\n// Check if React app has hydrated\ndocument.querySelector('[data-reactroot]') ||\ndocument.querySelector('[data-reactid]')\n```\n\n**Fix:** Wait for specific selector after navigation:\n```python\nawait browser_navigate(tab_id, url, wait_until=\"load\")\nawait browser_interact(action=\"wait\", tab_id=tab_id, wait_for_selector='[data-testid=\"content\"]', timeout_ms=5000)\n```\n\n### P6: Shadow DOM\n\n**Sites:** Components using Shadow DOM, Lit elements\n\n**Detection:**\n```javascript\ndocument.querySelectorAll('*').some(el => el.shadowRoot)\n```\n\n**Fix:** Pierce shadow root:\n```javascript\nfunction queryShadow(selector) {\n    const parts = selector.split('>>>');\n    let node = document;\n    for (const part of parts) {\n        if (node.shadowRoot) {\n            node = node.shadowRoot.querySelector(part.trim());\n        } else {\n            node = node.querySelector(part.trim());\n        }\n    }\n    return node;\n}\n```\n\n## Quick Reference\n\n| Issue | Primary Fix | Fallback |\n|-------|-------------|----------|\n| Scroll not working | Find scrollable container | Mouse wheel at container center |\n| Click no effect | JavaScript click() | CDP mouse events |\n| Type clears | `use_insert_text=False` (per-keystroke) | Use a `type` action (Input.insertText) |\n| Snapshot hangs | Add timeout_s | DOM snapshot fallback |\n| Stale content | Wait for selector | Increase wait_until timeout |\n| Shadow DOM | Pierce selector | JavaScript traversal |\n\n## References\n\n- [registry.md](registry.md) - Full list of known edge cases\n- [scripts/test_case.py](scripts/test_case.py) - Template for testing new cases\n- [BROWSER_USE_PATTERNS.md](../../tools/BROWSER_USE_PATTERNS.md) - Implementation patterns from browser-use\n","core/framework/skills/_default_skills/writing-hive-skills/SKILL.md":"---\nname: hive.writing-hive-skills\ndescription: Author a new Agent Skill for a Hive agent that conforms to the Agent Skills specification (SKILL.md with YAML frontmatter, optional scripts/references/assets directories). Use when the user asks to create, scaffold, add, or package a new skill for a Hive agent.\nmetadata:\n  author: hive\n  type: default-skill\n  spec-source: https://agentskills.io/specification\n---\n\n## Operational Protocol: Writing Hive Skills\n\nHive agents discover skills by scanning several roots, in precedence order:\n\n1. `<project>/.hive/skills/` — project, Hive-specific\n2. `<project>/.agents/skills/` — project, cross-client\n3. `~/.hive/skills/` — user, Hive-specific\n4. `~/.agents/skills/` — user, cross-client\n5. Framework defaults shipped in `core/framework/skills/_default_skills/`\n\nEach skill is a directory containing a `SKILL.md`. At startup, only the frontmatter `name` + `description` of every skill is loaded; the body is loaded only when the agent activates the skill. Design for that.\n\n### Choosing where to put a new skill\n\n- **Colony-scoped (via `write_skill` inside colony mode)**: when the skill is the operational protocol a single colony needs — its API auth, DOM selectors, DB schema, task-queue conventions — do NOT place it under `~/.hive/skills/` or `<project>/.hive/skills/` yourself. Those roots are SHARED and every colony on the machine will see it. Instead, once you're inside the colony (post-fork), call `write_skill(skill_name, skill_description, skill_body, skill_files?)` and the skill is materialized under `~/.hive/colonies/<colony_name>/skills/<skill-name>/` where only that colony's workers discover it. See the subsection below.\n- **Project-scoped**: put under `<project>/.hive/skills/` when the skill is tied to that codebase's APIs, conventions, or infra and multiple agents in the project should share it.\n- **User-scoped**: put under `~/.hive/skills/` when the skill is reusable across projects for this machine/user and all agents should see it.\n- **Framework default**: add under `core/framework/skills/_default_skills/` AND register in `framework/skills/defaults.py::SKILL_REGISTRY` only when the skill is a universal operational protocol shipped with Hive. Default skills use the `hive.<name>` naming convention and include `type: default-skill` in metadata.\n\n### Colony-scoped skills via `write_skill`\n\nA colony-scoped skill is one that belongs to exactly ONE colony — e.g. it encodes the HoneyComb staging API the `honeycomb_research` colony polls, or the LinkedIn outbound flow the `linkedin_outbound_campaign` colony runs. Writing such a skill at `~/.hive/skills/` or `<project>/.hive/skills/` leaks it to every other colony, which will then see it at selection time.\n\n**Do not create the folder yourself with the terminal.** Once the colony has been forked (via `suggest_colony` → user confirms the Create Colony popup), call `write_skill` inside the colony:\n\n```\nwrite_skill(\n    skill_name=\"honeycomb-api-protocol\",\n    skill_description=\"How to query the HoneyComb staging API…\",\n    skill_body=\"## Operational Protocol\\n\\nAuth: …\",\n    skill_files=[{\"path\": \"scripts/fetch_tickers.py\", \"content\": \"…\"}],  # optional\n)\n```\n\nThe tool writes `~/.hive/colonies/<this_colony>/skills/honeycomb-api-protocol/SKILL.md` (plus any `skill_files`), which `SkillDiscovery` picks up as project scope when that colony's workers start — and ONLY that colony's workers. No cross-colony leakage.\n\nDo not write colony-bound skill folders by hand under `~/.hive/skills/`. A skill placed there is user-scoped and becomes visible to every colony on the machine — defeating the isolation you wanted.\n\n### Directory layout\n\n```\n<skill-name>/\n├── SKILL.md          # Required\n├── scripts/          # Optional — executable helpers\n├── references/       # Optional — on-demand docs\n└── assets/           # Optional — templates, data, images\n```\n\nRules:\n- The directory name **must** equal the `name` frontmatter field (for framework defaults, the directory is the unprefixed name, e.g. `writing-hive-skills/` for `hive.writing-hive-skills`).\n- Keep `SKILL.md` under ~500 lines. Move long reference material into `references/`.\n- Reference other files with relative paths from the skill root (`scripts/foo.py`, `references/API.md`). Keep references one level deep.\n\n### SKILL.md frontmatter\n\nRequired fields:\n\n| Field | Constraints |\n|-------|-------------|\n| `name` | 1–64 chars, `[a-z0-9-]`, no leading/trailing/consecutive hyphens. Must match the directory name. Framework defaults prefix with `hive.` |\n| `description` | 1–1024 chars. Must describe **what** the skill does **and when to use it**. Include trigger keywords the user is likely to say. |\n\nOptional fields:\n\n| Field | Notes |\n|-------|-------|\n| `license` | License name or reference to a bundled file |\n| `compatibility` | ≤500 chars. Only include if env requirements are non-trivial (network, tools, runtime) |\n| `metadata` | Free-form string→string map. Namespace keys to avoid collisions. Default skills set `type: default-skill`. |\n| `allowed-tools` | Experimental. Space-separated pre-approved tools, e.g. `Bash(curl:*) Bash(jq:*) Read` |\n\nMinimal template:\n\n```markdown\n---\nname: my-skill\ndescription: One sentence on what it does. One sentence on when to use it, with concrete trigger words the agent will see in user requests.\n---\n\n# My Skill\n\n<body>\n```\n\n### Writing a good `description`\n\nThis is the single most important field — it's the only thing the agent sees at skill-selection time.\n\n- **Bad**: `Helps with trading.`\n- **Good**: `Buy and sell shares on the HoneyComb exchange. Handles auth, slippage-protected orders, idempotent retries, and AMM output estimation. Use when placing trades or interacting with the AMM.`\n\nInclude verbs the user is likely to say (`buy`, `sell`, `place trade`) and proper nouns (`HoneyComb`, `AMM`).\n\n### Writing the body\n\nStructure the body for the agent, not a human reader:\n\n1. **Lead with what the agent can't guess** — API base URLs, auth shape, project conventions, specific function names. Skip generic background (\"PDFs are a document format\").\n2. **Show exact request/response shapes** — include JSON payloads, headers, status codes. Copy real examples rather than paraphrasing.\n3. **Document failure modes** — error codes, retry rules, rate limits. This is where skills earn their keep vs. a generic agent.\n4. **Give a short end-to-end example** — a \"typical flow\" section at the bottom anchors everything above.\n\nRecommended sections (adapt to the domain):\n- Authentication / setup\n- Core operations (one per endpoint or action)\n- Error reference table\n- Rate limits / gotchas\n- End-to-end example pattern\n\n### Progressive disclosure\n\nThree tiers of context cost:\n\n1. **Always loaded** (~100 tokens per skill): `name` + `description`. Keep tight.\n2. **Loaded on activation** (<5k tokens target): body of `SKILL.md`.\n3. **Loaded on demand**: files under `scripts/`, `references/`, `assets/`. The agent reads these only when the body points to them.\n\nIf a section is long and only needed sometimes (e.g., a full schema dump, rarely-used edge cases), move it to `references/SOMETHING.md` and link to it from the body: `See [the error catalog](references/ERRORS.md) for the full list.`\n\n### Scripts\n\nPut executable helpers in `scripts/`. They should:\n- Be self-contained or document dependencies in a comment header.\n- Print human-readable errors to stderr and exit non-zero on failure.\n- Accept arguments via CLI flags, not env vars (easier for the agent to invoke).\n\nReference them from the body by relative path:\n\n```markdown\nEstimate buy output with `scripts/estimate_buy.py --v-hc 1000000 --v-shares 1000000 --hc 500`.\n```\n\nFor Python scripts in a Hive project, prefer `uv run scripts/foo.py ...`.\n\n### Creating a new skill — workflow\n\n1. Pick a `<skill-name>` (lowercase-hyphenated).\n2. Decide scope: **colony** (pass content INLINE to `create_colony` — STOP here, do not hand-author the folder), project (`<project>/.hive/skills/`), user (`~/.hive/skills/`), or framework default (`core/framework/skills/_default_skills/` + registry entry).\n3. For the non-colony scopes: create the directory and write `SKILL.md` with frontmatter + body.\n4. Add `scripts/`, `references/`, `assets/` only if needed.\n5. Validate the frontmatter: name matches dir, description is specific, no forbidden characters.\n6. Validate using the Hive CLI:\n   ```bash\n   uv run hive skill validate <path-to-skill-dir>\n   uv run hive skill doctor\n   ```\n7. Confirm discovery with `uv run hive skill list`.\n8. Test by invoking a Hive agent on a task the skill should match — confirm it activates and follows the instructions.\n\n### Registering as a framework default\n\nWhen adding a skill as a shipped default:\n\n1. Place the directory under `core/framework/skills/_default_skills/<unprefixed-name>/`.\n2. Set frontmatter `name: hive.<unprefixed-name>` and `metadata.type: default-skill`.\n3. Add the mapping to `SKILL_REGISTRY` in `core/framework/skills/defaults.py`:\n   ```python\n   SKILL_REGISTRY: dict[str, str] = {\n       ...\n       \"hive.<unprefixed-name>\": \"<unprefixed-name>\",\n   }\n   ```\n4. If the skill uses `{{placeholder}}` substitution, add defaults to `_SKILL_DEFAULTS` in the same file.\n5. If the skill reads/writes shared buffer keys, list them in `DATA_BUFFER_KEYS`.\n\n### What NOT to put in a skill\n\n- Generic programming knowledge the agent already has.\n- Conversation-specific state (use memory or plans instead).\n- Secrets or credentials (skills are plaintext; reference env vars or credential stores).\n- Deeply nested reference chains — keep everything one hop from `SKILL.md`.\n","core/framework/skills/_default_skills/colony-progress-tracker/SKILL.md":"---\nname: hive.colony-progress-tracker\ndescription: Claim tasks, record step progress, and verify SOP gates in the colony SQLite queue. Applies when your spawn message includes a db_path field.\nmetadata:\n  author: hive\n  type: default-skill\n  visibility: [worker]\n---\n\n## Operational Protocol: Colony Progress Tracker\n\n**Applies when** your spawn message has `db_path:` and `colony_id:` fields. The DB is your durable working memory — tells you what's done, what to skip, which SOP gates you owe.\n\nAccess via `terminal_exec` running `sqlite3 \"<db_path>\" \"...\"`. Tables: `tasks` (queue), `steps` (per-task decomposition), `sop_checklist` (hard gates).\n\n### Claim: assigned task (check this FIRST)\n\nIf your spawn message includes a `task_id:` field, the queen pre-assigned a specific row to you. Claim that row by id — **do not** use the generic next-pending pattern below:\n\n```bash\nsqlite3 \"<db_path>\" <<'SQL'\nUPDATE tasks SET status='claimed', worker_id='<worker-id>',\n  claim_token=lower(hex(randomblob(8))),\n  claimed_at=datetime('now'), updated_at=datetime('now')\nWHERE id='<task_id>' AND status='pending'\nRETURNING id, goal, payload;\nSQL\n```\n\nEmpty output → another worker raced you or the row is already done. Stop and report.  Non-empty → that row is yours, proceed to \"Load the plan\".\n\n### Claim: next pending (fallback when no task_id is assigned)\n\nIf your spawn message did NOT include `task_id:` — you are a generic fan-out worker racing on a shared queue. Use the generic next-pending claim:\n\n```bash\nsqlite3 \"<db_path>\" <<'SQL'\nUPDATE tasks SET status='claimed', worker_id='<worker-id>',\n  claim_token=lower(hex(randomblob(8))),\n  claimed_at=datetime('now'), updated_at=datetime('now')\nWHERE id=(SELECT id FROM tasks WHERE status='pending'\n  ORDER BY priority DESC, seq, created_at LIMIT 1)\nRETURNING id, goal, payload;\nSQL\n```\n\nEmpty output → queue drained, exit. Otherwise the returned `id` is yours. **Never SELECT-then-UPDATE** — races.\n\n### Load the plan\n\n```bash\nsqlite3 \"<db_path>\" \"SELECT seq, id, title, status FROM steps WHERE task_id='<task-id>' ORDER BY seq;\"\nsqlite3 \"<db_path>\" \"SELECT key, description, required, done_at FROM sop_checklist WHERE task_id='<task-id>';\"\n```\n\n**Skip any step where status='done'.** That's the point — don't redo completed work.\n\n### Execute a step\n\nBefore tool calls:\n```bash\nsqlite3 \"<db_path>\" \"UPDATE steps SET status='in_progress', worker_id='<worker-id>', started_at=datetime('now') WHERE id='<step-id>';\"\n```\nAfter success (one-line evidence: path, URL, key result):\n```bash\nsqlite3 \"<db_path>\" \"UPDATE steps SET status='done', evidence='<what you did>', completed_at=datetime('now') WHERE id='<step-id>';\"\n```\n\n### MANDATORY: SOP gate check before marking task done\n\n```bash\nsqlite3 \"<db_path>\" \"SELECT key, description FROM sop_checklist WHERE task_id='<task-id>' AND required=1 AND done_at IS NULL;\"\n```\n\n- Empty → proceed to \"Mark task done\".\n- Non-empty → each row is work you still owe. Do it, then check it off:\n\n```bash\nsqlite3 \"<db_path>\" \"UPDATE sop_checklist SET done_at=datetime('now'), done_by='<worker-id>', note='<why>' WHERE task_id='<task-id>' AND key='<key>';\"\n```\n\n**Never mark a task done while this SELECT returns rows.** This gate exists specifically to stop you from declaring success while skipping required steps.\n\n### Mark task done / failed\n\n```bash\n# Success:\nsqlite3 \"<db_path>\" \"UPDATE tasks SET status='done', completed_at=datetime('now'), updated_at=datetime('now') WHERE id='<task-id>' AND worker_id='<worker-id>';\"\n\n# Unrecoverable failure:\nsqlite3 \"<db_path>\" \"UPDATE tasks SET status='failed', last_error='<one sentence>', completed_at=datetime('now'), updated_at=datetime('now') WHERE id='<task-id>' AND worker_id='<worker-id>';\"\n```\n\nThe `AND worker_id=?` guard means a reclaimed row won't accept your write — treat zero rows affected as \"your claim was revoked, stop.\"\n\n### Loop\n\nAfter done/failed → claim the next task. Exit only when claim returns empty.\n\n### Errors + debug\n\n- **\"database is locked\"**: retry with 100ms → 1s backoff, max 5 attempts. `busy_timeout=5000` handles most contention silently.\n- **Queue health**: `SELECT status, count(*) FROM tasks GROUP BY status;`\n- **Your in-flight work**: `SELECT id, goal, status FROM tasks WHERE worker_id='<worker-id>';`\n\n### Anti-patterns (will break the queue)\n\n- Don't DDL (CREATE/ALTER/DROP).\n- Don't DELETE — failed tasks stay as `failed` for audit.\n- Don't skip Protocol 4 (SOP gate) before marking done.\n- Don't hold a task >15min without updates — the stale-claim reclaimer revokes your claim.\n- Don't invent task IDs. Workers update existing rows; only the queen enqueues new ones.\n","core/framework/skills/_preset_skills/terminal-tools-troubleshooting/SKILL.md":"---\nname: hive.terminal-tools-troubleshooting\ndescription: Read when a terminal-tools call returned something surprising — empty stdout despite no error, exit_code is null, output_handle came back expired, \"too many jobs\" / \"session busy\" / \"too many PTYs\", warning was set unexpectedly, semantic_status disagrees with exit_code. Diagnostic recipes only — load on demand. Don't preload; the foundational skill covers the happy path.\nmetadata:\n  author: hive\n  type: preset-skill\n  version: \"1.0\"\n---\n\n# Troubleshooting terminal-tools\n\nRecipes for surprising results. Match the symptom to the section.\n\n## Empty `stdout` despite the command \"should have\" produced output\n\nPossible causes:\n1. Output went to **stderr** instead. Check `stderr` in the envelope (or use `merge_stderr=True` for jobs).\n2. Output was **fully truncated** because `max_output_kb` is too small. Check `stdout_truncated_bytes > 0`. Bump `max_output_kb` or paginate via `output_handle`.\n3. Command produced no output (correct, just unexpected — `silent` flags, no matches).\n4. Pipeline issue: the last stage of a pipe ran but stdout went elsewhere (`> /dev/null`, redirected via `2>&1`).\n5. Process is buffering its output and didn't flush before exit. Add `stdbuf -oL` (line-buffered) or `unbuffer` to the command.\n\n## `exit_code: null`\n\n| Cause | Other field |\n|---|---|\n| Auto-backgrounded | `auto_backgrounded: true, job_id: <X>` |\n| Hard timeout, process killed | `timed_out: true` |\n| Pre-spawn failure (command not found) | `error: ...` set, `pid: null` |\n| Still running (in `terminal_job_logs`) | `status: \"running\"` |\n\n## `output_handle` returned `expired: true`\n\n5-minute TTL. Either (a) you waited too long, or (b) the store evicted it under memory pressure (64 MB total cap, LRU eviction). Re-run the command.\n\nTo reduce risk: paginate the handle as soon as you receive it, or use `terminal_job_*` for huge outputs (4 MB ring buffer with offsets — no expiry).\n\n## \"too many jobs\" / `JobLimitExceeded`\n\n`TERMINAL_TOOLS_MAX_JOBS` (default 32) hit. Either:\n- Wait for jobs to exit (poll with `terminal_job_logs(wait_until_exit=True)`)\n- Kill old jobs: `terminal_job_manage(action=\"list\")` to see what's running, then `signal_term` the abandoned ones\n- Raise the cap via env (rare)\n\n## \"session busy\"\n\nA `terminal_pty_run` was issued while another `_run` is in flight on the same session. PTY sessions are single-threaded conversations. Wait for the prior call to return, or open a second session.\n\n## \"PTY cap reached\"\n\n`TERMINAL_TOOLS_MAX_PTY` (default 8) hit. Close idle sessions (`terminal_pty_close`). Idle reaping is lazy; force it by opening — no, actually, opening throws when the cap is hit. Just close manually.\n\n## `warning` is set, the command worked\n\nInformational only. The pattern matched (e.g. `rm -rf` literally appears, or `git push --force` was used). The command ran. The warning is your \"did I mean to do that?\" prompt — verify the side effect was intended before continuing.\n\n## `semantic_status: \"ok\"` but `exit_code: 1`\n\nWorking as designed. Some commands use exit 1 for legitimate non-error states:\n- `grep` / `rg` exit 1 when **no matches** found\n- `find` exit 1 when **some directories were unreadable** (typical on `/proc`, etc.)\n- `diff` exit 1 when **files differ**\n- `test` / `[` exit 1 when **condition is false**\n\nThe `semantic_message` field explains. Trust `semantic_status`, not raw `exit_code`.\n\n## `semantic_status: \"error\"` but `exit_code: 0`\n\nShouldn't happen. If it does, file a bug.\n\n## `truncated_bytes_dropped > 0` in `terminal_job_logs`\n\nYour `since_offset` was older than the ring buffer's floor — bytes evicted before you could read them. Either:\n- Poll faster (lower latency between calls)\n- Use `merge_stderr=True` (single 4 MB ring instead of 4 MB × 2)\n- Accept the gap and move forward from `next_offset`\n\n## `terminal_pty_open` succeeds but the first `_run` times out\n\nThe session may not have produced its first prompt sentinel within the 2-second startup window. Try:\n- A `terminal_pty_run(sid, read_only=True, timeout_sec=2)` to drain whatever's accumulated\n- A noop command (`terminal_pty_run(sid, command=\"true\")`) to force a prompt cycle\n\nCould also indicate the bash process died at startup — `terminal_pty_run(sid, ...)` would then return `\"session has exited\"`.\n\n## `shell=\"/bin/zsh\"` returned an error\n\nBy design. terminal-tools is bash-only on POSIX. Use `shell=True` (default `/bin/bash`) or omit `shell=` to exec directly.\n\n## A command in `shell=True` is interpreted differently than expected\n\nBash, not zsh, semantics. `**/*` doesn't recurse without `shopt -s globstar`; `=cmd` expansion doesn't work; arrays use `arr[idx]` not `${arr[idx]}` differently than zsh. When in doubt, the foundational skill's \"bash, not zsh\" section is the canonical statement.\n","core/framework/skills/_preset_skills/terminal-tools-pty-sessions/SKILL.md":"---\nname: hive.terminal-tools-pty-sessions\ndescription: Use when you need state across calls — building env vars, navigating with cd, driving REPLs (python -i, mysql, psql, node), or responding to interactive prompts (sudo password, ssh host-key confirmation, mysql connection). Teaches the prompt-sentinel exec pattern (default mode), raw I/O for REPLs (raw_send=True then read_only=True), the one-in-flight-per-session rule, and the close-or-leak-against-the-cap discipline. Bash on macOS — never zsh; explicit shell=/bin/zsh is rejected. Read before calling terminal_pty_open.\nmetadata:\n  author: hive\n  type: preset-skill\n  version: \"1.0\"\n---\n\n# Persistent PTY sessions\n\nPTY sessions are how you talk to interactive programs — programs that detect a terminal (`isatty()`) and behave differently when they don't see one. Use a session when:\n\n- You need state to persist across calls (`cd`, env vars, sourced scripts)\n- You're driving a REPL (`python -i`, `mysql`, `psql`, `node`, `irb`)\n- A program demands an interactive prompt (`sudo`, `ssh`, `npm login`, `gh auth login`)\n\nFor everything else, `terminal_exec` is simpler. Sessions cost more (per-session bash process, ring buffer, idle-reaping bookkeeping) and have a hard cap (`TERMINAL_TOOLS_MAX_PTY`, default 8).\n\n## Why PTY (and not subprocess pipes)\n\nSubprocess pipes break on every interactive program. The moment a program calls `isatty()` and sees False, it disables prompts, color, line-editing, password masking, progress bars — sometimes refuses to start. PTY makes us look like a real terminal so these programs work the same as in your shell.\n\nThe cost: PTY output includes terminal escape codes (cursor moves, color codes). The session captures them as-is; if you need clean text, strip ANSI escapes in your processing layer.\n\n## Bash on macOS — by deliberate policy\n\n`terminal_pty_open` always invokes `/bin/bash`, regardless of the user's `$SHELL`. macOS users: yes, even when zsh is your interactive default. This is the **terminal-tools-foundations** policy applied to PTYs.\n\nReasons:\n- zsh has command/builtin classes (`zmodload`, `=cmd` expansion, `zpty`, `ztcp`) that bypass bash-shaped security checks\n- One shell behavior across platforms eliminates \"works on Linux, breaks on macOS\" surprises\n- Bash is universal: any shell you've used will accept the bash subset\n\nThe bash invocation uses `--norc --noprofile` so user dotfiles don't leak in. PS1 is set to a unique sentinel for prompt detection. PS2 is empty. PROMPT_COMMAND is empty.\n\n## Three modes of `terminal_pty_run`\n\n### 1. Default: send command, wait for prompt sentinel\n\n```\nterminal_pty_run(session_id, command=\"ls -la\")\n  → { output, prompt_after: True, ... }\n```\n\nThe session writes `ls -la\\n`, waits for the sentinel that its custom PS1 emits, returns the slice between submission and prompt. **One in-flight call per session** — a concurrent call returns a `\"session busy\"` error.\n\n### 2. raw_send: send raw input, no waiting\n\n```\nterminal_pty_run(session_id, command=\"print('hi')\\n\", raw_send=True)\n  → { bytes_sent: 12 }\n```\n\nFor REPLs, vim keystrokes, password prompts. The session writes the bytes and returns immediately — it doesn't wait for a prompt (REPLs don't print bash's prompt; they print their own).\n\nAfter a `raw_send`, you typically follow with:\n\n### 3. read_only: drain currently-buffered output\n\n```\nterminal_pty_run(session_id, read_only=True, timeout_sec=2)\n  → { output: \"hi\\n\", more: False, ... }\n```\n\nReads whatever the session has accumulated since the last drain, with a brief settle window. Use after raw_send to capture the REPL's response.\n\n## Custom prompt detection (`expect`)\n\nWhen the command launches a program with its own prompt (Python REPL's `>>> `, mysql's `mysql> `, sudo's password prompt), the bash sentinel won't appear until the program exits. Override:\n\n```\nterminal_pty_run(session_id, command=\"python3\", expect=r\">>>\\s*$\", timeout_sec=10)\n  → output up to and including \">>>\", then control returns\n```\n\nFor sudo:\n\n```\nterminal_pty_run(session_id, command=\"sudo -k && sudo whoami\", expect=r\"[Pp]assword:\")\nterminal_pty_run(session_id, command=\"<password>\", raw_send=True, command=\"<password>\\n\")\nterminal_pty_run(session_id, read_only=True, timeout_sec=5)\n```\n\n(Treat passwords carefully — they end up in the ring buffer.)\n\n## Always close\n\n```\nterminal_pty_close(session_id)\n```\n\nLeaked sessions count against `TERMINAL_TOOLS_MAX_PTY` (default 8). Idle reaping happens lazily on every `_open` call (sessions inactive longer than `idle_timeout_sec`, default 1800s, are dropped) — but don't rely on it. Close when you're done.\n\nFor unresponsive sessions, `force=True` skips the graceful \"exit\" attempt and goes straight to SIGTERM/SIGKILL.\n\n## Common patterns\n\n### Stateful navigation\n\n```\nsid = terminal_pty_open(cwd=\"/\")\nterminal_pty_run(sid, command=\"cd /var/log\")\nterminal_pty_run(sid, command=\"ls -la *.log | head\")\nterminal_pty_close(sid)\n```\n\n### Python REPL\n\n```\nsid = terminal_pty_open()\nterminal_pty_run(sid, command=\"python3\", expect=r\">>>\\s*$\")\nterminal_pty_run(sid, command=\"x = 42\", raw_send=True)\nterminal_pty_run(sid, command=\"print(x*x)\\n\", raw_send=True)\nresult = terminal_pty_run(sid, read_only=True)  # → \"1764\\n>>> \"\nterminal_pty_run(sid, command=\"exit()\", raw_send=True)\nterminal_pty_close(sid)\n```\n\n### ssh with host-key prompt\n\n```\nsid = terminal_pty_open()\nterminal_pty_run(sid, command=\"ssh user@new-host\", expect=r\"\\(yes/no.*\\)\\?\")\nterminal_pty_run(sid, command=\"yes\\n\", raw_send=True)\nterminal_pty_run(sid, read_only=True, timeout_sec=10)  # password prompt or login\n```\n","core/framework/skills/_preset_skills/x-automation/SKILL.md":"---\nname: hive.x-automation\ndescription: Read before automating X / Twitter with browser_* tools. Verified flows for post, reply, delete, search-and-engage, plus the Draft.js compose quirks that silently disable the send button. Includes the daily-reply and job-market-reply playbooks. Requires hive.browser-automation for the underlying screenshot + coordinate workflow. Verified 2026-04-11.\nmetadata:\n  author: hive\n  type: default-skill\n  version: \"1.0\"\n  verified: 2026-04-11\n  requires_skill: hive.browser-automation\n---\n\n# X / Twitter Automation\n\nX uses **Draft.js** (the original Facebook rich-text editor) for the compose text area, which was the original canary for all the rich-text editor quirks the `browser-automation` skill now documents. Most of the site is otherwise stable — `data-testid` attributes have held up for years, the SPA is reasonably honest about what it renders, and shadow DOM is minimal. The hard parts are the composer, rate limiting, and the occasional anti-bot challenge.\n\n**Always activate `browser-automation` first.** This skill assumes you already know about CSS-px coordinates, click-first typing, and `Input.insertText`. The guidance below is X-specific.\n\n## Timing expectations\n\n- `browser_navigate(wait_until=\"load\")` returns in **1.3–1.6 s** on a warm cache.\n- After navigation, **`sleep(2–3)`** for SPA hydration before querying selectors.\n- Compose modal slide-in: **~1.5 s** after clicking reply / compose.\n- First 1–2 characters typed into the compose editor **may be dropped** — see \"Draft.js quirks\" below.\n\n## Verified selectors (2026-04-11)\n\n| Target | Selector |\n|---|---|\n| Home nav link | `a[data-testid='AppTabBar_Home_Link']` |\n| Explore nav link | `a[data-testid='AppTabBar_Explore_Link']` |\n| Notifications | `a[data-testid='AppTabBar_Notifications_Link']` |\n| Main search input | `input[data-testid='SearchBox_Search_Input']` |\n| Compose text area | `[data-testid='tweetTextarea_0']` (Draft.js contenteditable) |\n| Post / Tweet submit button | `[data-testid='tweetButton']` |\n| Reply button (on feed / tweet detail) | `[data-testid='reply']` |\n| Like button | `[data-testid='like']` |\n| Retweet / repost button | `[data-testid='retweet']` |\n| Caret (⋯) menu on a post | `[data-testid='caret']` |\n| Confirmation sheet confirm button | `[data-testid='confirmationSheetConfirm']` |\n| Tweet article wrapper | `article[data-testid='tweet']` |\n| Close modal / composer | `[aria-label='Close']` or press `Escape` |\n\nAll of these are light-DOM `data-testid` attributes — `wait_for_selector` and `browser_type(selector=...)` work on them directly, no shadow piercing needed.\n\n## Post new tweet flow\n\n```\nbrowser_navigate(\"https://x.com/home\", wait_until=\"load\")\nsleep(3)\n\n# Open the compose UI (click the post-new-tweet nav or use shortcut N)\nbrowser_press(\"n\")   # keyboard shortcut — opens compose modal\nsleep(1.5)\n\n# Click the textarea to make sure Draft.js is in edit mode\nta_rect = browser_get_rect(\"[data-testid='tweetTextarea_0']\")\nbrowser_click_coordinate(ta_rect.cx, ta_rect.cy)\nsleep(0.5)\n\n# Type — browser_type handles Draft.js correctly now via Input.insertText\nbrowser_type(\"[data-testid='tweetTextarea_0']\", tweet_text)\nsleep(1.0)  # let Draft.js commit state\n\n# Verify the Post button is enabled — never click blindly, Draft.js sometimes\n# doesn't register the input even with a prior click.\nstate = browser_evaluate(\"\"\"\n  (function(){\n    const btn = document.querySelector('[data-testid=\"tweetButton\"]');\n    if (!btn) return {found: false};\n    return {\n      found: true,\n      disabled: btn.disabled || btn.getAttribute('aria-disabled') === 'true',\n    };\n  })();\n\"\"\")\nif state['found'] and not state['disabled']:\n    browser_click(\"[data-testid='tweetButton']\")\n    sleep(2)\n    browser_press(\"Escape\")  # close any leftover modal\n```\n\n## Posting a tweet WITH an image\n\n**Critical: NEVER click the photo button.** On `x.com/compose/post` the media button is a styled `<button>` that triggers Chrome's native OS file picker when clicked — that dialog is unreachable via CDP and will wedge the automation. Instead, set the file directly on the hidden `<input type='file'>` element using `browser_upload`:\n\n```python\n# 1. Open the compose modal as usual\nbrowser_press(\"n\")\nsleep(1.5)\nbrowser_click_coordinate(ta_rect.cx, ta_rect.cy)\nsleep(0.5)\nbrowser_type(\"[data-testid='tweetTextarea_0']\", tweet_text)\n\n# 2. Find the hidden file input X uses for media uploads.\n#    X's input is marked with data-testid='fileInput' and accepts\n#    image/*,video/*. It's hidden (display:none) but still mounted.\ninputs = browser_evaluate(\"\"\"\n  (function(){\n    return Array.from(document.querySelectorAll('input[type=\"file\"]'))\n      .map(el => ({\n        testid: el.getAttribute('data-testid') || '',\n        accept: el.accept || '',\n        multiple: el.multiple,\n      }));\n  })();\n\"\"\")\n# Expect to see: [{testid: 'fileInput', accept: 'image/jpeg,...', multiple: true}]\n\n# 3. Set the file WITHOUT opening any dialog\nbrowser_upload(\n    selector=\"input[data-testid='fileInput']\",\n    file_paths=[\"/absolute/path/to/photo.png\"],\n)\nsleep(2)  # X takes ~1-2s to show the preview thumbnail\n\n# 4. Verify the preview rendered before posting — if not, the upload\n#    didn't land and Post button will fail.\npreview = browser_evaluate(\"\"\"\n  (function(){\n    // X renders uploaded media as an <img> with data-testid='attachments'\n    // (or similar) inside the composer.\n    const att = document.querySelector('[data-testid=\"attachments\"] img');\n    return { hasPreview: !!att };\n  })();\n\"\"\")\nif not preview['hasPreview']:\n    raise Exception(\"Upload didn't render in composer — do NOT click Post\")\n\n# 5. Now click Post as usual\nbrowser_click(\"[data-testid='tweetButton']\")\nsleep(3)  # media upload + post takes longer than text-only\nbrowser_press(\"Escape\")\n```\n\nIf you don't already have the image file on disk, write it first: `write_file(\"/tmp/x_upload.png\", base64_bytes)` or copy from a known location. `browser_upload` requires an absolute file path — relative paths and `~` expansion are not supported.\n\n## Reply to a post flow\n\nThe reply flow is the same shape as posting, with a few scroll / find-and-click steps before.\n\n```\nbrowser_navigate(\"https://x.com/home\", wait_until=\"load\")\nsleep(3)\n\n# Load content by scrolling — X lazy-loads feed items\nbrowser_scroll(direction=\"down\", amount=2000)\nsleep(1.5)\n\n# Find replyable tweets — reply buttons, in visual/feed order\ncandidates = browser_evaluate(\"\"\"\n  (function(){\n    const tweets = document.querySelectorAll('article[data-testid=\"tweet\"]');\n    const out = [];\n    tweets.forEach((t, i) => {\n      const reply = t.querySelector('[data-testid=\"reply\"]');\n      if (!reply) return;\n      const r = reply.getBoundingClientRect();\n      if (r.width <= 0 || r.y < 0 || r.y > window.innerHeight) return;\n      const text = (t.textContent || '').slice(0, 120);\n      out.push({\n        index: i,\n        preview: text,\n        cx: r.x + r.width/2,\n        cy: r.y + r.height/2,\n      });\n    });\n    return out;\n  })();\n\"\"\")\n\n# For each unreplied candidate...\nfor c in candidates:\n    if already_replied(c['preview']):\n        continue  # see dedup pattern below\n\n    # Click reply\n    browser_click_coordinate(c['cx'], c['cy'])\n    sleep(1.5)  # composer slide-in\n\n    # Click the textarea to focus Draft.js\n    ta = browser_get_rect(\"[data-testid='tweetTextarea_0']\")\n    browser_click_coordinate(ta.cx, ta.cy)\n    sleep(0.5)\n\n    # Type the reply\n    browser_type(\"[data-testid='tweetTextarea_0']\", reply_text)\n    sleep(1.5)   # Draft.js state commit takes a beat\n\n    # Verify button enabled\n    state = browser_evaluate(\"\"\"\n      (function(){\n        const b = document.querySelector('[data-testid=\"tweetButton\"]');\n        return b ? {d: b.disabled || b.getAttribute('aria-disabled') === 'true'} : {d: true};\n      })();\n    \"\"\")\n    if state['d']:\n        # Recovery: click the textarea again + one extra character toggles React state\n        browser_click_coordinate(ta.cx, ta.cy)\n        browser_press(\"End\")\n        browser_press(\" \")\n        browser_press(\"Backspace\")\n        sleep(0.5)\n    else:\n        browser_click(\"[data-testid='tweetButton']\")\n        sleep(2)\n        # Mark the task done in progress.db — see hive.colony-progress-tracker\n\n    # Close the composer (press Escape or click the Close button)\n    browser_press(\"Escape\")\n    sleep(random.uniform(10, 20))   # human cadence — see rate limits\n```\n\n## Search-and-engage flow\n\nFor \"daily reply to live posts matching query X\" — e.g. job-market replies.\n\n```\nquery = \"job market\"\nurl = f\"https://x.com/search?q={urllib.parse.quote(query)}&src=typed_query&f=live\"\nbrowser_navigate(url, wait_until=\"load\")\nsleep(3)\nbrowser_scroll(\"down\", 2000)\nsleep(1.5)\n\n# Same replyable-tweets probe as above, then same reply-to-tweet loop\n```\n\n## Delete a post flow\n\n```\nbrowser_navigate(\"https://x.com/<your_username>/with_replies\", wait_until=\"load\")\nsleep(3)\n\n# Find the target article (by text match or index)\ntarget_caret = browser_evaluate(\"\"\"\n  (function(target_text){\n    const tweets = document.querySelectorAll('article[data-testid=\"tweet\"]');\n    for (const t of tweets){\n      if (!(t.textContent || '').includes(target_text)) continue;\n      const caret = t.querySelector('[data-testid=\"caret\"]');\n      if (!caret) continue;\n      const r = caret.getBoundingClientRect();\n      return {cx: r.x + r.width/2, cy: r.y + r.height/2};\n    }\n    return null;\n  })();\n\"\"\", target_text)\n\nbrowser_click_coordinate(target_caret['cx'], target_caret['cy'])\nsleep(0.8)   # menu animation\n\n# The Delete menuitem doesn't have a stable data-testid — find by text\ndelete_rect = browser_evaluate(\"\"\"\n  (function(){\n    const items = document.querySelectorAll('[role=\"menuitem\"]');\n    for (const el of items){\n      if ((el.textContent || '').trim() === 'Delete'){\n        const r = el.getBoundingClientRect();\n        return {cx: r.x + r.width/2, cy: r.y + r.height/2};\n      }\n    }\n    return null;\n  })();\n\"\"\")\nbrowser_click_coordinate(delete_rect['cx'], delete_rect['cy'])\nsleep(0.8)\n\n# Confirmation sheet — this one DOES have a stable testid\nbrowser_click(\"[data-testid='confirmationSheetConfirm']\")\nsleep(1.5)\n```\n\n## Draft.js quirks\n\nX's compose editor is the canonical test case for every rich-text-editor bug the GCU bridge has ever had. What you need to know:\n\n- **Click the textarea first.** Mandatory. Without a native click-sourced focus event, Draft.js's editor state never enters edit mode, and the Post button stays disabled regardless of how much text you type. `browser_type` now does this click automatically.\n\n- **`browser_type` uses CDP `Input.insertText` by default**, which Draft.js accepts cleanly. The older approach — per-character `Input.dispatchKeyEvent` with `delay_ms=20` — *also* works, but insertText is more reliable and faster. Only pass `delay_ms > 0` (which falls back to per-char dispatch) if you're specifically testing the keystroke timing path.\n\n- **First 1–2 characters may be eaten** on the per-char dispatch path (not on insertText). If you see `\"estin\"` instead of `\"testin\"`, prepend a throwaway character or use insertText.\n\n- **Verify `tweetButton`'s `disabled` state** before clicking. Draft.js's internal state can disagree with the DOM text — verify framework state via a targeted `browser_evaluate` on `aria-disabled`.\n\n- **If the button stays disabled after typing**, use the recovery dance: click the textarea again, press `End`, press a space, press `Backspace`. This forces React to recompute `hasRealContent` and usually flips the button on.\n\n- **URL previews take a beat to render.** If your tweet ends with a URL, wait 2–3 s after typing so the link-card preview loads before you post — otherwise the tweet publishes without the card.\n\n## Rate limits and safety\n\n| Action | Limit |\n|---|---|\n| Tweets per hour | ~50 before throttling |\n| Replies per session | **5–10 per run**, randomized 10–20 s delays |\n| DMs per day | Varies by account age; 50–100 for established accounts |\n| Follow/unfollow | <400/day spread over time |\n| Like per day | 1000 max; 200–300 is safer |\n\nSignals you're being rate-limited or flagged:\n- 429 status in network responses (not always visible to the agent)\n- \"You are unable to Tweet\" banner\n- Redirect to `https://x.com/account/access` (anti-bot check)\n- Posts appearing to publish but not visible on your profile\n- Reply button click opens but composer never receives focus\n\nIf any of these appear, **stop the run, screenshot the state, and surface the issue.** Do not retry immediately.\n\n## Deduplication pattern\n\nDedup is handled by the colony progress queue, not a separate JSON file. The queen enqueues one row in the `tasks` table per reply target (keyed by tweet URL); workers claim, reply, and mark done. Already-`done` rows are skipped on the next claim — that's your crash-resume and cross-day dedup, for free. See `hive.colony-progress-tracker` for the full claim/update protocol.\n\nExtract the tweet URL via `browser_evaluate` so the queen can use it as the task key:\n\n```\nurl = browser_evaluate(\"\"\"\n  (function(article_index){\n    const t = document.querySelectorAll('article[data-testid=\"tweet\"]')[article_index];\n    if (!t) return null;\n    const link = t.querySelector('a[href*=\"/status/\"]');\n    return link ? link.href : null;\n  })();\n\"\"\", article_index)\n```\n\nIf you need to check whether a given tweet URL has already been replied to in a prior run (e.g., scanning live search results before enqueuing), query the queue directly:\n\n```bash\nsqlite3 \"<db_path>\" \"SELECT status FROM tasks WHERE payload LIKE '%\\\"tweet_url\\\":\\\"<url>\\\"%';\"\n```\n\nEmpty → not yet enqueued, safe to add. Otherwise honor the existing row's status.\n\n## Reply style guidelines\n\nThese are soft rules derived from the backed-up `x-daily-replies` and `x-job-market-replies` skills — tune per your operator's preference.\n\n**Daily replies (siren_fs persona, dark humorous):**\n- 2 sentences MAX\n- Dark, humorous, insightful, trendy\n- Must feel like a real person with opinions and edge\n- Must NOT sound like AI, use corporate speak, or be corny\n- Tie to current news/culture when possible\n- English only\n- Target: 5–8 replies per run\n- Skip posts that are purely images/video with no text context\n- Prioritize high-engagement accounts\n- Skip ads unless genuinely interesting\n\n**Job-market replies (casual slang + prediction-market CTA):**\n- 2–3 short sentences max\n- Casual slang, alt spellings: \"u\", \"fr\", \"lmao\", \"lol\"\n- Always include a profile-level CTA (\"check my profile if u wanna see…\")\n- Tie the reply to the economic / career angle of the original post\n- Vary templates — never identical text across replies\n- Max 10 replies per session\n\n## Common pitfalls\n\n- **Typing without clicking first → send button stays disabled.** Draft.js only enters edit mode after a native focus event. `browser_type` handles this automatically now, but if you're using raw CDP calls, click first.\n\n- **First 1–2 chars eaten on per-char dispatch.** Stick with `browser_type` default (uses `Input.insertText`). Only use `delay_ms=20` fallback if you need per-keystroke timing.\n\n- **Clicking Post with Draft.js state disagreeing.** Always verify `[data-testid=\"tweetButton\"]`'s `disabled` / `aria-disabled` before clicking. If disabled, run the recovery dance.\n\n- **Anti-bot challenge mid-run.** X occasionally shows a JavaScript challenge or redirects to `/account/access`. Detect by checking the URL after navigation and the presence of the home nav:\n  ```\n  challenged = browser_evaluate(\"\"\"\n    (function(){\n      return window.location.href.includes('/account/access') ||\n             !document.querySelector('a[data-testid=\"AppTabBar_Home_Link\"]');\n    })();\n  \"\"\")\n  ```\n  If challenged, stop and surface to the operator. Do not try to solve it.\n\n- **Composer modal fails to open on rapid clicks.** X debounces the reply button click. Always `sleep(1.5)` after clicking before trying to query the textarea.\n\n- **Navigation inside the SPA is preferred over full page loads.** Clicking a tweet to open its detail view keeps the compose state; using `browser_navigate` reloads everything and slows the run. Use `browser_click` on internal links when possible.\n\n- **X's `window.innerHeight` changes on compose modal open.** The modal takes over most of the viewport. Don't cache viewport dimensions across a compose open; re-query after the modal slide-in.\n\n- **URL-only tweets post without a link card if you click Post too fast.** Wait 2–3 s after typing a URL before clicking Post so the card preview renders.\n\n## Auth wall detection\n\nCheck logged-in state before any action:\n\n```\nlogged_in = browser_evaluate(\"\"\"\n  (function(){\n    return !!document.querySelector('a[data-testid=\"AppTabBar_Home_Link\"]') &&\n           !window.location.href.includes('/i/flow/login');\n  })();\n\"\"\")\n```\n\nIf not logged in, **stop immediately** and surface. Do not attempt to log in via automation.\n\n## See also\n\n- `browser-automation` skill — general CDP/coord/screenshot rules, click-then-type pattern, Input.insertText\n- `linkedin-automation` skill — LinkedIn equivalent\n","core/framework/skills/_preset_skills/terminal-tools-job-control/SKILL.md":"# terminal-tools-job-control\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-job-control/SKILL.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-job-control/SKILL.md)","core/framework/skills/_preset_skills/terminal-tools-fs-search/SKILL.md":"# terminal-tools-fs-search\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-fs-search/SKILL.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-fs-search/SKILL.md)","core/framework/skills/_preset_skills/terminal-tools-foundations/SKILL.md":"# terminal-tools-foundations\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-foundations/SKILL.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-foundations/SKILL.md)","core/framework/skills/_preset_skills/linkedin-automation/SKILL.md":"# linkedin-automation\n\nPath: `core/framework/skills/_preset_skills/linkedin-automation/SKILL.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/linkedin-automation/SKILL.md)","core/framework/skills/_preset_skills/chart-creation-foundations/SKILL.md":"# chart-creation-foundations\n\nPath: `core/framework/skills/_preset_skills/chart-creation-foundations/SKILL.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/chart-creation-foundations/SKILL.md)","core/framework/skills/_preset_skills/browser-automation/SKILL.md":"# browser-automation\n\nPath: `core/framework/skills/_preset_skills/browser-automation/SKILL.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/browser-automation/SKILL.md)","AGENTS.md":"# AI Agent Protocol & Instructions\n\nPath: `AGENTS.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/AGENTS.md)","tools/BROWSER_USE_PATTERNS.md":"# Tools Skill\n\nPath: `tools/BROWSER_USE_PATTERNS.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/BROWSER_USE_PATTERNS.md)","tools/BUILDING_TOOLS.md":"# Tools Skill\n\nPath: `tools/BUILDING_TOOLS.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/BUILDING_TOOLS.md)","tools/mcp_servers.json":"# Tools Skill\n\nPath: `tools/mcp_servers.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/mcp_servers.json)","tools/README.md":"# tools Documentation\n\nPath: `tools/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/README.md)","tools/browser-extension/manifest.json":"# Browser-extension Skill\n\nPath: `tools/browser-extension/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/browser-extension/manifest.json)","tools/browser-extension/README.md":"# browser-extension Documentation\n\nPath: `tools/browser-extension/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/browser-extension/README.md)",".claude/skills/browser-edge-cases/registry.md":"# Browser-edge-cases Skill\n\nPath: `.claude/skills/browser-edge-cases/registry.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/registry.md)",".claude/skills/browser-edge-cases/scripts/test_02_twitter_scroll.py":"# Claude Directive: test_02_twitter_scroll.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_02_twitter_scroll.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_02_twitter_scroll.py)",".claude/skills/browser-edge-cases/scripts/test_03_modal_scroll.py":"# Claude Directive: test_03_modal_scroll.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_03_modal_scroll.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_03_modal_scroll.py)",".claude/skills/browser-edge-cases/scripts/test_04_element_covered.py":"# Claude Directive: test_04_element_covered.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_04_element_covered.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_04_element_covered.py)",".claude/skills/browser-edge-cases/scripts/test_06_shadow_dom.py":"# Claude Directive: test_06_shadow_dom.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_06_shadow_dom.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_06_shadow_dom.py)",".claude/skills/browser-edge-cases/scripts/test_07_contenteditable.py":"# Claude Directive: test_07_contenteditable.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_07_contenteditable.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_07_contenteditable.py)",".claude/skills/browser-edge-cases/scripts/test_08_autocomplete.py":"# Claude Directive: test_08_autocomplete.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_08_autocomplete.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_08_autocomplete.py)",".claude/skills/browser-edge-cases/scripts/test_10_huge_dom.py":"# Claude Directive: test_10_huge_dom.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_10_huge_dom.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_10_huge_dom.py)",".claude/skills/browser-edge-cases/scripts/test_13_spa_navigation.py":"# Claude Directive: test_13_spa_navigation.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_13_spa_navigation.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_13_spa_navigation.py)",".claude/skills/browser-edge-cases/scripts/test_15_screenshot.py":"# Claude Directive: test_15_screenshot.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_15_screenshot.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_15_screenshot.py)",".claude/skills/browser-edge-cases/scripts/test_case.py":"# Claude Directive: test_case.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_case.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_case.py)","core/framework/agents/credential_tester/mcp_servers.json":"# Credential_tester Skill\n\nPath: `core/framework/agents/credential_tester/mcp_servers.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/credential_tester/mcp_servers.json)","core/framework/agents/queen/mcp_registry.json":"# Queen Skill\n\nPath: `core/framework/agents/queen/mcp_registry.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/mcp_registry.json)","core/framework/agents/queen/mcp_servers.json":"# Queen Skill\n\nPath: `core/framework/agents/queen/mcp_servers.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/mcp_servers.json)","core/framework/agents/queen/reference/anti_patterns.md":"# Subagent: anti_patterns\n\nPath: `core/framework/agents/queen/reference/anti_patterns.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/reference/anti_patterns.md)","core/framework/agents/queen/reference/file_templates.md":"# Subagent: file_templates\n\nPath: `core/framework/agents/queen/reference/file_templates.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/reference/file_templates.md)","core/framework/agents/queen/reference/file_templates_declarative.md":"# Subagent: file_templates_declarative\n\nPath: `core/framework/agents/queen/reference/file_templates_declarative.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/reference/file_templates_declarative.md)","core/framework/agents/queen/reference/framework_guide.md":"# Subagent: framework_guide\n\nPath: `core/framework/agents/queen/reference/framework_guide.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/reference/framework_guide.md)","core/framework/agents/queen/reference/gcu_guide.md":"# Subagent: gcu_guide\n\nPath: `core/framework/agents/queen/reference/gcu_guide.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/reference/gcu_guide.md)","tools/src/aden_tools/tools/account_info_tool/README.md":"# account_info_tool Documentation\n\nPath: `tools/src/aden_tools/tools/account_info_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/account_info_tool/README.md)","tools/src/aden_tools/tools/airtable_tool/README.md":"# airtable_tool Documentation\n\nPath: `tools/src/aden_tools/tools/airtable_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/airtable_tool/README.md)","tools/src/aden_tools/tools/apify_tool/README.md":"# apify_tool Documentation\n\nPath: `tools/src/aden_tools/tools/apify_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/apify_tool/README.md)","tools/src/aden_tools/tools/apollo_tool/README.md":"# apollo_tool Documentation\n\nPath: `tools/src/aden_tools/tools/apollo_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/apollo_tool/README.md)","tools/src/aden_tools/tools/arxiv_tool/README.md":"# arxiv_tool Documentation\n\nPath: `tools/src/aden_tools/tools/arxiv_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/arxiv_tool/README.md)","tools/src/aden_tools/tools/asana_tool/README.md":"# asana_tool Documentation\n\nPath: `tools/src/aden_tools/tools/asana_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/asana_tool/README.md)","tools/src/aden_tools/tools/attio_tool/README.md":"# attio_tool Documentation\n\nPath: `tools/src/aden_tools/tools/attio_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/attio_tool/README.md)","tools/src/aden_tools/tools/aws_s3_tool/README.md":"# aws_s3_tool Documentation\n\nPath: `tools/src/aden_tools/tools/aws_s3_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/aws_s3_tool/README.md)","tools/src/aden_tools/tools/azure_sql_tool/README.md":"# azure_sql_tool Documentation\n\nPath: `tools/src/aden_tools/tools/azure_sql_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/azure_sql_tool/README.md)","tools/src/aden_tools/tools/bigquery_tool/README.md":"# bigquery_tool Documentation\n\nPath: `tools/src/aden_tools/tools/bigquery_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/bigquery_tool/README.md)","tools/src/aden_tools/tools/brevo_tool/README.md":"# brevo_tool Documentation\n\nPath: `tools/src/aden_tools/tools/brevo_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/brevo_tool/README.md)","tools/src/aden_tools/tools/calcom_tool/README.md":"# calcom_tool Documentation\n\nPath: `tools/src/aden_tools/tools/calcom_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/calcom_tool/README.md)","tools/src/aden_tools/tools/calendar_tool/README.md":"# calendar_tool Documentation\n\nPath: `tools/src/aden_tools/tools/calendar_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/calendar_tool/README.md)","tools/src/aden_tools/tools/calendly_tool/README.md":"# calendly_tool Documentation\n\nPath: `tools/src/aden_tools/tools/calendly_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/calendly_tool/README.md)","tools/src/aden_tools/tools/cloudflare_tool/README.md":"# cloudflare_tool Documentation\n\nPath: `tools/src/aden_tools/tools/cloudflare_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/cloudflare_tool/README.md)","tools/src/aden_tools/tools/cloudinary_tool/README.md":"# cloudinary_tool Documentation\n\nPath: `tools/src/aden_tools/tools/cloudinary_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/cloudinary_tool/README.md)","tools/src/aden_tools/tools/confluence_tool/README.md":"# confluence_tool Documentation\n\nPath: `tools/src/aden_tools/tools/confluence_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/confluence_tool/README.md)","tools/src/aden_tools/tools/csv_tool/README.md":"# csv_tool Documentation\n\nPath: `tools/src/aden_tools/tools/csv_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/csv_tool/README.md)","tools/src/aden_tools/tools/databricks_tool/README.md":"# databricks_tool Documentation\n\nPath: `tools/src/aden_tools/tools/databricks_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/databricks_tool/README.md)","tools/src/aden_tools/tools/discord_tool/README.md":"# discord_tool Documentation\n\nPath: `tools/src/aden_tools/tools/discord_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/discord_tool/README.md)","tools/src/aden_tools/tools/dns_security_scanner/README.md":"# dns_security_scanner Documentation\n\nPath: `tools/src/aden_tools/tools/dns_security_scanner/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/dns_security_scanner/README.md)","tools/src/aden_tools/tools/docker_hub_tool/README.md":"# docker_hub_tool Documentation\n\nPath: `tools/src/aden_tools/tools/docker_hub_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/docker_hub_tool/README.md)","tools/src/aden_tools/tools/duckduckgo_tool/README.md":"# duckduckgo_tool Documentation\n\nPath: `tools/src/aden_tools/tools/duckduckgo_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/duckduckgo_tool/README.md)","tools/src/aden_tools/tools/email_tool/README.md":"# email_tool Documentation\n\nPath: `tools/src/aden_tools/tools/email_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/email_tool/README.md)","tools/src/aden_tools/tools/exa_search_tool/README.md":"# exa_search_tool Documentation\n\nPath: `tools/src/aden_tools/tools/exa_search_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/exa_search_tool/README.md)","tools/src/aden_tools/tools/excel_tool/README.md":"# excel_tool Documentation\n\nPath: `tools/src/aden_tools/tools/excel_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/excel_tool/README.md)","tools/src/aden_tools/tools/file_system_toolkits/README.md":"# file_system_toolkits Documentation\n\nPath: `tools/src/aden_tools/tools/file_system_toolkits/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/file_system_toolkits/README.md)","tools/src/aden_tools/tools/freshdesk_tool/README.md":"# freshdesk_tool Documentation\n\nPath: `tools/src/aden_tools/tools/freshdesk_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/freshdesk_tool/README.md)","tools/src/aden_tools/tools/github_tool/README.md":"# github_tool Documentation\n\nPath: `tools/src/aden_tools/tools/github_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/github_tool/README.md)","tools/src/aden_tools/tools/gitlab_tool/README.md":"# gitlab_tool Documentation\n\nPath: `tools/src/aden_tools/tools/gitlab_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/gitlab_tool/README.md)","tools/src/aden_tools/tools/gmail_tool/README.md":"# gmail_tool Documentation\n\nPath: `tools/src/aden_tools/tools/gmail_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/gmail_tool/README.md)","tools/src/aden_tools/tools/google_analytics_tool/README.md":"# google_analytics_tool Documentation\n\nPath: `tools/src/aden_tools/tools/google_analytics_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/google_analytics_tool/README.md)","tools/src/aden_tools/tools/google_docs_tool/README.md":"# google_docs_tool Documentation\n\nPath: `tools/src/aden_tools/tools/google_docs_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/google_docs_tool/README.md)","tools/src/aden_tools/tools/google_maps_tool/README.md":"# google_maps_tool Documentation\n\nPath: `tools/src/aden_tools/tools/google_maps_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/google_maps_tool/README.md)","tools/src/aden_tools/tools/google_search_console_tool/README.md":"# google_search_console_tool Documentation\n\nPath: `tools/src/aden_tools/tools/google_search_console_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/google_search_console_tool/README.md)","tools/src/aden_tools/tools/google_sheets_tool/README.md":"# google_sheets_tool Documentation\n\nPath: `tools/src/aden_tools/tools/google_sheets_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/google_sheets_tool/README.md)","tools/src/aden_tools/tools/greenhouse_tool/README.md":"# greenhouse_tool Documentation\n\nPath: `tools/src/aden_tools/tools/greenhouse_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/greenhouse_tool/README.md)","tools/src/aden_tools/tools/http_headers_scanner/README.md":"# http_headers_scanner Documentation\n\nPath: `tools/src/aden_tools/tools/http_headers_scanner/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/http_headers_scanner/README.md)","tools/src/aden_tools/tools/hubspot_tool/README.md":"# hubspot_tool Documentation\n\nPath: `tools/src/aden_tools/tools/hubspot_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/hubspot_tool/README.md)","tools/src/aden_tools/tools/huggingface_tool/README.md":"# huggingface_tool Documentation\n\nPath: `tools/src/aden_tools/tools/huggingface_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/huggingface_tool/README.md)","tools/src/aden_tools/tools/intercom_tool/README.md":"# intercom_tool Documentation\n\nPath: `tools/src/aden_tools/tools/intercom_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/intercom_tool/README.md)","tools/src/aden_tools/tools/jira_tool/README.md":"# jira_tool Documentation\n\nPath: `tools/src/aden_tools/tools/jira_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/jira_tool/README.md)","tools/src/aden_tools/tools/kafka_tool/README.md":"# kafka_tool Documentation\n\nPath: `tools/src/aden_tools/tools/kafka_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/kafka_tool/README.md)","tools/src/aden_tools/tools/langfuse_tool/README.md":"# langfuse_tool Documentation\n\nPath: `tools/src/aden_tools/tools/langfuse_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/langfuse_tool/README.md)","tools/src/aden_tools/tools/linear_tool/README.md":"# linear_tool Documentation\n\nPath: `tools/src/aden_tools/tools/linear_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/linear_tool/README.md)","tools/src/aden_tools/tools/lusha_tool/README.md":"# lusha_tool Documentation\n\nPath: `tools/src/aden_tools/tools/lusha_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/lusha_tool/README.md)","tools/src/aden_tools/tools/microsoft_graph_tool/README.md":"# microsoft_graph_tool Documentation\n\nPath: `tools/src/aden_tools/tools/microsoft_graph_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/microsoft_graph_tool/README.md)","tools/src/aden_tools/tools/mongodb_tool/README.md":"# mongodb_tool Documentation\n\nPath: `tools/src/aden_tools/tools/mongodb_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/mongodb_tool/README.md)","tools/src/aden_tools/tools/mssql_tool/README.md":"# mssql_tool Documentation\n\nPath: `tools/src/aden_tools/tools/mssql_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/mssql_tool/README.md)","tools/src/aden_tools/tools/n8n_tool/README.md":"# n8n_tool Documentation\n\nPath: `tools/src/aden_tools/tools/n8n_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/n8n_tool/README.md)","tools/src/aden_tools/tools/news_tool/README.md":"# news_tool Documentation\n\nPath: `tools/src/aden_tools/tools/news_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/news_tool/README.md)","tools/src/aden_tools/tools/notion_tool/README.md":"# notion_tool Documentation\n\nPath: `tools/src/aden_tools/tools/notion_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/notion_tool/README.md)","tools/src/aden_tools/tools/obsidian_tool/README.md":"# obsidian_tool Documentation\n\nPath: `tools/src/aden_tools/tools/obsidian_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/obsidian_tool/README.md)","tools/src/aden_tools/tools/openmeteo_tool/README.md":"# openmeteo_tool Documentation\n\nPath: `tools/src/aden_tools/tools/openmeteo_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/openmeteo_tool/README.md)","tools/src/aden_tools/tools/pagerduty_tool/README.md":"# pagerduty_tool Documentation\n\nPath: `tools/src/aden_tools/tools/pagerduty_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/pagerduty_tool/README.md)","tools/src/aden_tools/tools/pdf_read_tool/README.md":"# pdf_read_tool Documentation\n\nPath: `tools/src/aden_tools/tools/pdf_read_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/pdf_read_tool/README.md)","tools/src/aden_tools/tools/pinecone_tool/README.md":"# pinecone_tool Documentation\n\nPath: `tools/src/aden_tools/tools/pinecone_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/pinecone_tool/README.md)","tools/src/aden_tools/tools/pipedrive_tool/README.md":"# pipedrive_tool Documentation\n\nPath: `tools/src/aden_tools/tools/pipedrive_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/pipedrive_tool/README.md)","tools/src/aden_tools/tools/plaid_tool/README.md":"# plaid_tool Documentation\n\nPath: `tools/src/aden_tools/tools/plaid_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/plaid_tool/README.md)","tools/src/aden_tools/tools/port_scanner/README.md":"# port_scanner Documentation\n\nPath: `tools/src/aden_tools/tools/port_scanner/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/port_scanner/README.md)","tools/src/aden_tools/tools/postgres_tool/README.md":"# postgres_tool Documentation\n\nPath: `tools/src/aden_tools/tools/postgres_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/postgres_tool/README.md)","tools/src/aden_tools/tools/powerbi_tool/README.md":"# powerbi_tool Documentation\n\nPath: `tools/src/aden_tools/tools/powerbi_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/powerbi_tool/README.md)","tools/src/aden_tools/tools/prometheus_tool/README.md":"# prometheus_tool Documentation\n\nPath: `tools/src/aden_tools/tools/prometheus_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/prometheus_tool/README.md)","tools/src/aden_tools/tools/pushover_tool/README.md":"# pushover_tool Documentation\n\nPath: `tools/src/aden_tools/tools/pushover_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/pushover_tool/README.md)","tools/src/aden_tools/tools/quickbooks_tool/README.md":"# quickbooks_tool Documentation\n\nPath: `tools/src/aden_tools/tools/quickbooks_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/quickbooks_tool/README.md)","tools/src/aden_tools/tools/razorpay_tool/README.md":"# razorpay_tool Documentation\n\nPath: `tools/src/aden_tools/tools/razorpay_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/razorpay_tool/README.md)","tools/src/aden_tools/tools/reddit_tool/README.md":"# reddit_tool Documentation\n\nPath: `tools/src/aden_tools/tools/reddit_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/reddit_tool/README.md)","tools/src/aden_tools/tools/redis_tool/README.md":"# redis_tool Documentation\n\nPath: `tools/src/aden_tools/tools/redis_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/redis_tool/README.md)","tools/src/aden_tools/tools/redshift_tool/README.md":"# redshift_tool Documentation\n\nPath: `tools/src/aden_tools/tools/redshift_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/redshift_tool/README.md)","tools/src/aden_tools/tools/risk_scorer/README.md":"# risk_scorer Documentation\n\nPath: `tools/src/aden_tools/tools/risk_scorer/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/risk_scorer/README.md)","tools/src/aden_tools/tools/salesforce_tool/README.md":"# salesforce_tool Documentation\n\nPath: `tools/src/aden_tools/tools/salesforce_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/salesforce_tool/README.md)","tools/src/aden_tools/tools/sap_tool/README.md":"# sap_tool Documentation\n\nPath: `tools/src/aden_tools/tools/sap_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/sap_tool/README.md)","tools/src/aden_tools/tools/serpapi_tool/README.md":"# serpapi_tool Documentation\n\nPath: `tools/src/aden_tools/tools/serpapi_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/serpapi_tool/README.md)","tools/src/aden_tools/tools/shopify_tool/README.md":"# shopify_tool Documentation\n\nPath: `tools/src/aden_tools/tools/shopify_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/shopify_tool/README.md)","tools/src/aden_tools/tools/similarweb_tool/README.md":"# similarweb_tool Documentation\n\nPath: `tools/src/aden_tools/tools/similarweb_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/similarweb_tool/README.md)","tools/src/aden_tools/tools/slack_tool/README.md":"# slack_tool Documentation\n\nPath: `tools/src/aden_tools/tools/slack_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/slack_tool/README.md)","tools/src/aden_tools/tools/snowflake_tool/README.md":"# snowflake_tool Documentation\n\nPath: `tools/src/aden_tools/tools/snowflake_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/snowflake_tool/README.md)","tools/src/aden_tools/tools/ssl_tls_scanner/README.md":"# ssl_tls_scanner Documentation\n\nPath: `tools/src/aden_tools/tools/ssl_tls_scanner/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/ssl_tls_scanner/README.md)","tools/src/aden_tools/tools/stripe_tool/README.md":"# stripe_tool Documentation\n\nPath: `tools/src/aden_tools/tools/stripe_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/stripe_tool/README.md)","tools/src/aden_tools/tools/subdomain_enumerator/README.md":"# subdomain_enumerator Documentation\n\nPath: `tools/src/aden_tools/tools/subdomain_enumerator/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/subdomain_enumerator/README.md)","tools/src/aden_tools/tools/supabase_tool/README.md":"# supabase_tool Documentation\n\nPath: `tools/src/aden_tools/tools/supabase_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/supabase_tool/README.md)","tools/src/aden_tools/tools/tech_stack_detector/README.md":"# tech_stack_detector Documentation\n\nPath: `tools/src/aden_tools/tools/tech_stack_detector/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/tech_stack_detector/README.md)","tools/src/aden_tools/tools/telegram_tool/README.md":"# telegram_tool Documentation\n\nPath: `tools/src/aden_tools/tools/telegram_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/telegram_tool/README.md)","tools/src/aden_tools/tools/terraform_tool/README.md":"# terraform_tool Documentation\n\nPath: `tools/src/aden_tools/tools/terraform_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/terraform_tool/README.md)","tools/src/aden_tools/tools/time_tool/README.md":"# time_tool Documentation\n\nPath: `tools/src/aden_tools/tools/time_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/time_tool/README.md)","tools/src/aden_tools/tools/tines_tool/README.md":"# tines_tool Documentation\n\nPath: `tools/src/aden_tools/tools/tines_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/tines_tool/README.md)","tools/src/aden_tools/tools/trello_tool/README.md":"# trello_tool Documentation\n\nPath: `tools/src/aden_tools/tools/trello_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/trello_tool/README.md)","tools/src/aden_tools/tools/twilio_tool/README.md":"# twilio_tool Documentation\n\nPath: `tools/src/aden_tools/tools/twilio_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/twilio_tool/README.md)","tools/src/aden_tools/tools/twitter_tool/README.md":"# twitter_tool Documentation\n\nPath: `tools/src/aden_tools/tools/twitter_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/twitter_tool/README.md)","tools/src/aden_tools/tools/vercel_tool/README.md":"# vercel_tool Documentation\n\nPath: `tools/src/aden_tools/tools/vercel_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/vercel_tool/README.md)","tools/src/aden_tools/tools/vision_tool/README.md":"# vision_tool Documentation\n\nPath: `tools/src/aden_tools/tools/vision_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/vision_tool/README.md)","tools/src/aden_tools/tools/wandb_tool/README.md":"# wandb_tool Documentation\n\nPath: `tools/src/aden_tools/tools/wandb_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/wandb_tool/README.md)","tools/src/aden_tools/tools/web_scrape_tool/README.md":"# web_scrape_tool Documentation\n\nPath: `tools/src/aden_tools/tools/web_scrape_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/web_scrape_tool/README.md)","tools/src/aden_tools/tools/web_search_tool/README.md":"# web_search_tool Documentation\n\nPath: `tools/src/aden_tools/tools/web_search_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/web_search_tool/README.md)","tools/src/aden_tools/tools/wikipedia_tool/README.md":"# wikipedia_tool Documentation\n\nPath: `tools/src/aden_tools/tools/wikipedia_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/wikipedia_tool/README.md)","tools/src/aden_tools/tools/yahoo_finance_tool/README.md":"# yahoo_finance_tool Documentation\n\nPath: `tools/src/aden_tools/tools/yahoo_finance_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/yahoo_finance_tool/README.md)","tools/src/aden_tools/tools/youtube_tool/README.md":"# youtube_tool Documentation\n\nPath: `tools/src/aden_tools/tools/youtube_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/youtube_tool/README.md)","tools/src/aden_tools/tools/youtube_transcript_tool/README.md":"# youtube_transcript_tool Documentation\n\nPath: `tools/src/aden_tools/tools/youtube_transcript_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/youtube_transcript_tool/README.md)","tools/src/aden_tools/tools/zendesk_tool/README.md":"# zendesk_tool Documentation\n\nPath: `tools/src/aden_tools/tools/zendesk_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/zendesk_tool/README.md)","tools/src/aden_tools/tools/zoho_crm_tool/README.md":"# zoho_crm_tool Documentation\n\nPath: `tools/src/aden_tools/tools/zoho_crm_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/zoho_crm_tool/README.md)","tools/src/aden_tools/tools/zoom_tool/README.md":"# zoom_tool Documentation\n\nPath: `tools/src/aden_tools/tools/zoom_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/zoom_tool/README.md)","core/framework/skills/_preset_skills/terminal-tools-job-control/references/signals.md":"# References Skill\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-job-control/references/signals.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-job-control/references/signals.md)","core/framework/skills/_preset_skills/terminal-tools-fs-search/references/find_predicates.md":"# References Skill\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-fs-search/references/find_predicates.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-fs-search/references/find_predicates.md)","core/framework/skills/_preset_skills/terminal-tools-fs-search/references/ripgrep_cheatsheet.md":"# References Skill\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-fs-search/references/ripgrep_cheatsheet.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-fs-search/references/ripgrep_cheatsheet.md)","core/framework/skills/_preset_skills/terminal-tools-foundations/references/exit_codes.md":"# References Skill\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-foundations/references/exit_codes.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-foundations/references/exit_codes.md)"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/AGENTS.md","title":"AI Agent Protocol & Instructions","category":"root-instruction","format":"markdown","content":"# AI Agent Protocol & Instructions\n\nPath: `AGENTS.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/AGENTS.md)","tokens":300,"sizeBytes":148},{"name":"registry.md","path":".claude/skills/browser-edge-cases/registry.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/registry.md","title":"Browser-edge-cases Skill","category":"anthropic-skill","format":"markdown","content":"# Browser-edge-cases Skill\n\nPath: `.claude/skills/browser-edge-cases/registry.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/registry.md)","tokens":300,"sizeBytes":212},{"name":"SKILL.md","path":".claude/skills/browser-edge-cases/SKILL.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/SKILL.md","title":"browser-edge-cases","category":"anthropic-skill","format":"markdown","content":"---\nname: browser-edge-cases\ndescription: SOP for debugging browser automation failures on complex websites. Use when browser tools fail on specific sites like LinkedIn, Twitter/X, SPAs, or sites with Shadow DOM.\nlicense: MIT\n---\n\n# Browser Tool Edge Cases\n\nStandard Operating Procedure for debugging and fixing browser automation failures on complex websites.\n\n## When to Use This Skill\n\n- `browser_interact(action=\"scroll\")` succeeds but page doesn't move\n- `browser_interact(action=\"left_click\")` succeeds but no action triggered\n- `browser_interact(action=\"type\")` text disappears or doesn't work\n- `browser_snapshot` hangs or returns stale content\n- `browser_navigate` loads wrong content\n\n## SOP: Debugging Browser Tool Failures\n\n### Phase 1: Reproduce & Isolate\n\n```\n1. Create minimal test case demonstrating failure\n2. Test against simple site (example.com) to verify tool works\n3. Test against problematic site to confirm issue\n```\n\n**Quick isolation test:**\n```python\n# Test 1: Does the tool work at all?\nawait browser_navigate(tab_id, \"https://example.com\")\nresult = await browser_interact(action=\"scroll\", tab_id=tab_id, scroll_direction=\"down\", scroll_amount=100)\n# Should work on simple sites\n\n# Test 2: Does it fail on the problematic site?\nawait browser_navigate(tab_id, \"https://linkedin.com/feed\")\nresult = await browser_interact(action=\"scroll\", tab_id=tab_id, scroll_direction=\"down\", scroll_amount=100)\n# If this fails but example.com works → site-specific edge case\n```\n\n### Phase 2: Analyze Root Cause\n\n**Step 2a: Check console for errors**\n```python\nconsole = await browser_console(tab_id)\n# Look for: CSP violations, React errors, JavaScript exceptions\n```\n\n**Step 2b: Inspect DOM structure**\n```python\nhtml = await browser_html(tab_id)\nsnapshot = await browser_snapshot(tab_id)\n# Look for:\n# - Nested scrollable divs (overflow: scroll/auto)\n# - Shadow DOM roots\n# - iframes\n# - Custom widgets\n```\n\n**Step 2c: Identify the pattern**\n\n| Symptom | Likely Cause | Check |\n|---------|--------------|-------|\n| Scroll doesn't move | Nested scroll container | Look for `overflow: scroll` divs |\n| Click no effect | Element covered | Check `getBoundingClientRect` vs viewport |\n| Type clears | Autocomplete/React | Check for event listeners on input; try a `type` action with no selector |\n| Snapshot hangs | Huge DOM | Check node count in snapshot |\n| Snapshot stale | SPA hydration | Wait after navigation |\n\n### Phase 3: Implement Multi-Layer Fix\n\n**Pattern: Always have fallbacks**\n\n```python\nasync def robust_operation(tab_id):\n    # Method 1: Primary approach\n    try:\n        result = await primary_method(tab_id)\n        if verify_success(result):\n            return result\n    except Exception:\n        pass\n\n    # Method 2: CDP fallback\n    try:\n        result = await cdp_fallback(tab_id)\n        if verify_success(result):\n            return result\n    except Exception:\n        pass\n\n    # Method 3: JavaScript fallback\n    return await javascript_fallback(tab_id)\n```\n\n**Pattern: Always add timeouts**\n\n```python\n# Bad - can hang forever\nresult = await browser_snapshot(tab_id)\n\n# Good - fails fast with useful error\ntry:\n    result = await browser_snapshot(tab_id, timeout_s=10.0)\nexcept asyncio.TimeoutError:\n    # Handle timeout gracefully\n    result = await fallback_snapshot(tab_id)\n```\n\n### Phase 4: Verify Fix\n\n```\n1. Run against problematic site → should work\n2. Run against simple site → should still work (regression check)\n3. Document in registry.md\n```\n\n## Pattern Library\n\n### P1: Nested Scrollable Containers\n\n**Sites:** LinkedIn, Twitter/X, any SPA with scrollable feeds\n\n**Detection:**\n```javascript\n// Find largest scrollable container\nconst candidates = [];\ndocument.querySelectorAll('*').forEach(el => {\n    const style = getComputedStyle(el);\n    if (style.overflow.includes('scroll') || style.overflow.includes('auto')) {\n        const rect = el.getBoundingClientRect();\n        if (rect.width > 100 && rect.height > 100) {\n            candidates.push({el, area: rect.width * rect.height});\n        }\n    }\n});\ncandidates.sort((a, b) => b.area - a.area);\nreturn candidates[0]?.el;\n```\n\n**Fix:** Dispatch scroll events at container's center, not viewport center.\n\n### P2: Element Covered by Overlay\n\n**Sites:** Modals, tooltips, SPAs with loading overlays\n\n**Detection:**\n```javascript\nconst rect = element.getBoundingClientRect();\nconst centerX = rect.left + rect.width / 2;\nconst centerY = rect.top + rect.height / 2;\nconst topElement = document.elementFromPoint(centerX, centerY);\nreturn topElement === element || element.contains(topElement);\n```\n\n**Fix:** Wait for overlay to disappear, or use JavaScript click.\n\n### P3: React Synthetic Events\n\n**Sites:** React SPAs, modern web apps\n\n**Detection:** If CDP click doesn't trigger handler but manual click works.\n\n**Fix:** Use JavaScript click as primary:\n```javascript\nelement.click();\n```\n\n### P4: Huge DOM / Accessibility Tree\n\n**Sites:** LinkedIn, Facebook, Twitter (feeds with 1000s of nodes)\n\n**Detection:**\n```javascript\ndocument.querySelectorAll('*').length > 5000\n```\n\n**Fix:**\n1. Add timeout to snapshot operation\n2. Truncate tree at 2000 nodes\n3. Fall back to DOM-based snapshot if accessibility tree too large\n\n### P5: SPA Hydration Delay\n\n**Sites:** React, Vue, Angular SPAs after navigation\n\n**Detection:**\n```javascript\n// Check if React app has hydrated\ndocument.querySelector('[data-reactroot]') ||\ndocument.querySelector('[data-reactid]')\n```\n\n**Fix:** Wait for specific selector after navigation:\n```python\nawait browser_navigate(tab_id, url, wait_until=\"load\")\nawait browser_interact(action=\"wait\", tab_id=tab_id, wait_for_selector='[data-testid=\"content\"]', timeout_ms=5000)\n```\n\n### P6: Shadow DOM\n\n**Sites:** Components using Shadow DOM, Lit elements\n\n**Detection:**\n```javascript\ndocument.querySelectorAll('*').some(el => el.shadowRoot)\n```\n\n**Fix:** Pierce shadow root:\n```javascript\nfunction queryShadow(selector) {\n    const parts = selector.split('>>>');\n    let node = document;\n    for (const part of parts) {\n        if (node.shadowRoot) {\n            node = node.shadowRoot.querySelector(part.trim());\n        } else {\n            node = node.querySelector(part.trim());\n        }\n    }\n    return node;\n}\n```\n\n## Quick Reference\n\n| Issue | Primary Fix | Fallback |\n|-------|-------------|----------|\n| Scroll not working | Find scrollable container | Mouse wheel at container center |\n| Click no effect | JavaScript click() | CDP mouse events |\n| Type clears | `use_insert_text=False` (per-keystroke) | Use a `type` action (Input.insertText) |\n| Snapshot hangs | Add timeout_s | DOM snapshot fallback |\n| Stale content | Wait for selector | Increase wait_until timeout |\n| Shadow DOM | Pierce selector | JavaScript traversal |\n\n## References\n\n- [registry.md](registry.md) - Full list of known edge cases\n- [scripts/test_case.py](scripts/test_case.py) - Template for testing new cases\n- [BROWSER_USE_PATTERNS.md](../../tools/BROWSER_USE_PATTERNS.md) - Implementation patterns from browser-use\n","frontmatter":{"name":"browser-edge-cases","description":"SOP for debugging browser automation failures on complex websites. Use when browser tools fail on specific sites like LinkedIn, Twitter/X, SPAs, or sites with Shadow DOM.","license":"MIT"},"isInternal":false,"tokens":1622,"sizeBytes":7036},{"name":"SKILL.md","path":".claude/skills/triage-issue/SKILL.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/triage-issue/SKILL.md","title":"triage-issue","category":"anthropic-skill","format":"markdown","content":"# Triage Issue Skill\n\nAnalyze a GitHub issue, verify claims against the codebase, and close invalid issues with a technical response.\n\n## Trigger\n\nUser provides a GitHub issue URL or number, e.g.:\n- `/triage-issue 1970`\n- `/triage-issue https://github.com/adenhq/hive/issues/1970`\n\n## Workflow\n\n### Step 1: Fetch Issue Details\n\n```bash\ngh issue view <number> --repo adenhq/hive --json title,body,state,labels,author\n```\n\nExtract:\n- Title\n- Body (the claim/bug report)\n- Current state\n- Labels\n- Author\n\nIf issue is already closed, inform user and stop.\n\n### Step 2: Analyze the Claim\n\nRead the issue body and identify:\n1. **The core claim** - What is the user asserting?\n2. **Technical specifics** - File paths, function names, code snippets mentioned\n3. **Expected behavior** - What do they think should happen?\n4. **Severity claimed** - Security issue? Bug? Feature request?\n\n### Step 3: Investigate the Codebase\n\nFor each technical claim:\n1. Find the referenced code using Grep/Glob/Read\n2. Understand the actual implementation\n3. Check if the claim accurately describes the behavior\n4. Look for related tests, documentation, or design decisions\n\n### Step 4: Evaluate Validity\n\nCategorize the issue as one of:\n\n| Category | Action |\n|----------|--------|\n| **Valid Bug** | Do NOT close. Inform user this is a real issue. |\n| **Valid Feature Request** | Do NOT close. Suggest labeling appropriately. |\n| **Misunderstanding** | Prepare technical explanation for why behavior is correct. |\n| **Fundamentally Flawed** | Prepare critique explaining the technical impossibility or design rationale. |\n| **Duplicate** | Find the original issue and prepare duplicate notice. |\n| **Incomplete** | Prepare request for more information. |\n\n### Step 5: Draft Response\n\nFor issues to be closed, draft a response that:\n\n1. **Acknowledges the concern** - Don't be dismissive\n2. **Explains the actual behavior** - With code references\n3. **Provides technical rationale** - Why it works this way\n4. **References industry standards** - If applicable\n5. **Offers alternatives** - If there's a better approach for the user\n\nUse this template:\n\n```markdown\n## Analysis\n\n[Brief summary of what was investigated]\n\n## Technical Details\n\n[Explanation with code references]\n\n## Why This Is Working As Designed\n\n[Rationale]\n\n## Recommendation\n\n[What the user should do instead, if applicable]\n\n---\n*This issue was reviewed and closed by the maintainers.*\n```\n\n### Step 6: User Review\n\nPresent the draft to the user with:\n\n```\n## Issue #<number>: <title>\n\n**Claim:** <summary of claim>\n\n**Finding:** <valid/invalid/misunderstanding/etc>\n\n**Draft Response:**\n<the markdown response>\n\n---\nDo you want me to post this comment and close the issue?\n```\n\nUse AskUserQuestion with options:\n- \"Post and close\" - Post comment, close issue\n- \"Edit response\" - Let user modify the response\n- \"Skip\" - Don't take action\n\n### Step 7: Execute Action\n\nIf user approves:\n\n```bash\n# Post comment\ngh issue comment <number> --repo adenhq/hive --body \"<response>\"\n\n# Close issue\ngh issue close <number> --repo adenhq/hive --reason \"not planned\"\n```\n\nReport success with link to the issue.\n\n## Important Guidelines\n\n1. **Never close valid issues** - If there's any merit to the claim, don't close it\n2. **Be respectful** - The reporter took time to file the issue\n3. **Be technical** - Provide code references and evidence\n4. **Be educational** - Help them understand, don't just dismiss\n5. **Check twice** - Make sure you understand the code before declaring something invalid\n6. **Consider edge cases** - Maybe their environment reveals a real issue\n\n## Example Critiques\n\n### Security Misunderstanding\n> \"The claim that secrets are exposed in plaintext misunderstands the encryption architecture. While `SecretStr` is used for logging protection, actual encryption is provided by Fernet (AES-128-CBC) at the storage layer. The code path is: serialize → encrypt → write. Only encrypted bytes touch disk.\"\n\n### Impossible Request\n> \"The requested feature would require [X] which violates [fundamental constraint]. This is not a limitation of our implementation but a fundamental property of [technology/protocol].\"\n\n### Already Handled\n> \"This scenario is already handled by [code reference]. The reporter may be using an older version or misconfigured environment.\"\n","isInternal":false,"tokens":1010,"sizeBytes":4326},{"name":"mcp_servers.json","path":"core/framework/agents/credential_tester/mcp_servers.json","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/credential_tester/mcp_servers.json","title":"Credential_tester Skill","category":"anthropic-skill","format":"json","content":"# Credential_tester Skill\n\nPath: `core/framework/agents/credential_tester/mcp_servers.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/credential_tester/mcp_servers.json)","tokens":300,"sizeBytes":233},{"name":"mcp_registry.json","path":"core/framework/agents/queen/mcp_registry.json","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/mcp_registry.json","title":"Queen Skill","category":"anthropic-skill","format":"json","content":"# Queen Skill\n\nPath: `core/framework/agents/queen/mcp_registry.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/mcp_registry.json)","tokens":300,"sizeBytes":199},{"name":"mcp_servers.json","path":"core/framework/agents/queen/mcp_servers.json","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/mcp_servers.json","title":"Queen Skill","category":"anthropic-skill","format":"json","content":"# Queen Skill\n\nPath: `core/framework/agents/queen/mcp_servers.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/mcp_servers.json)","tokens":300,"sizeBytes":197},{"name":"SKILL.md","path":"core/framework/skills/_default_skills/colony-progress-tracker/SKILL.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_default_skills/colony-progress-tracker/SKILL.md","title":"hive.colony-progress-tracker","category":"anthropic-skill","format":"markdown","content":"---\nname: hive.colony-progress-tracker\ndescription: Claim tasks, record step progress, and verify SOP gates in the colony SQLite queue. Applies when your spawn message includes a db_path field.\nmetadata:\n  author: hive\n  type: default-skill\n  visibility: [worker]\n---\n\n## Operational Protocol: Colony Progress Tracker\n\n**Applies when** your spawn message has `db_path:` and `colony_id:` fields. The DB is your durable working memory — tells you what's done, what to skip, which SOP gates you owe.\n\nAccess via `terminal_exec` running `sqlite3 \"<db_path>\" \"...\"`. Tables: `tasks` (queue), `steps` (per-task decomposition), `sop_checklist` (hard gates).\n\n### Claim: assigned task (check this FIRST)\n\nIf your spawn message includes a `task_id:` field, the queen pre-assigned a specific row to you. Claim that row by id — **do not** use the generic next-pending pattern below:\n\n```bash\nsqlite3 \"<db_path>\" <<'SQL'\nUPDATE tasks SET status='claimed', worker_id='<worker-id>',\n  claim_token=lower(hex(randomblob(8))),\n  claimed_at=datetime('now'), updated_at=datetime('now')\nWHERE id='<task_id>' AND status='pending'\nRETURNING id, goal, payload;\nSQL\n```\n\nEmpty output → another worker raced you or the row is already done. Stop and report.  Non-empty → that row is yours, proceed to \"Load the plan\".\n\n### Claim: next pending (fallback when no task_id is assigned)\n\nIf your spawn message did NOT include `task_id:` — you are a generic fan-out worker racing on a shared queue. Use the generic next-pending claim:\n\n```bash\nsqlite3 \"<db_path>\" <<'SQL'\nUPDATE tasks SET status='claimed', worker_id='<worker-id>',\n  claim_token=lower(hex(randomblob(8))),\n  claimed_at=datetime('now'), updated_at=datetime('now')\nWHERE id=(SELECT id FROM tasks WHERE status='pending'\n  ORDER BY priority DESC, seq, created_at LIMIT 1)\nRETURNING id, goal, payload;\nSQL\n```\n\nEmpty output → queue drained, exit. Otherwise the returned `id` is yours. **Never SELECT-then-UPDATE** — races.\n\n### Load the plan\n\n```bash\nsqlite3 \"<db_path>\" \"SELECT seq, id, title, status FROM steps WHERE task_id='<task-id>' ORDER BY seq;\"\nsqlite3 \"<db_path>\" \"SELECT key, description, required, done_at FROM sop_checklist WHERE task_id='<task-id>';\"\n```\n\n**Skip any step where status='done'.** That's the point — don't redo completed work.\n\n### Execute a step\n\nBefore tool calls:\n```bash\nsqlite3 \"<db_path>\" \"UPDATE steps SET status='in_progress', worker_id='<worker-id>', started_at=datetime('now') WHERE id='<step-id>';\"\n```\nAfter success (one-line evidence: path, URL, key result):\n```bash\nsqlite3 \"<db_path>\" \"UPDATE steps SET status='done', evidence='<what you did>', completed_at=datetime('now') WHERE id='<step-id>';\"\n```\n\n### MANDATORY: SOP gate check before marking task done\n\n```bash\nsqlite3 \"<db_path>\" \"SELECT key, description FROM sop_checklist WHERE task_id='<task-id>' AND required=1 AND done_at IS NULL;\"\n```\n\n- Empty → proceed to \"Mark task done\".\n- Non-empty → each row is work you still owe. Do it, then check it off:\n\n```bash\nsqlite3 \"<db_path>\" \"UPDATE sop_checklist SET done_at=datetime('now'), done_by='<worker-id>', note='<why>' WHERE task_id='<task-id>' AND key='<key>';\"\n```\n\n**Never mark a task done while this SELECT returns rows.** This gate exists specifically to stop you from declaring success while skipping required steps.\n\n### Mark task done / failed\n\n```bash\n# Success:\nsqlite3 \"<db_path>\" \"UPDATE tasks SET status='done', completed_at=datetime('now'), updated_at=datetime('now') WHERE id='<task-id>' AND worker_id='<worker-id>';\"\n\n# Unrecoverable failure:\nsqlite3 \"<db_path>\" \"UPDATE tasks SET status='failed', last_error='<one sentence>', completed_at=datetime('now'), updated_at=datetime('now') WHERE id='<task-id>' AND worker_id='<worker-id>';\"\n```\n\nThe `AND worker_id=?` guard means a reclaimed row won't accept your write — treat zero rows affected as \"your claim was revoked, stop.\"\n\n### Loop\n\nAfter done/failed → claim the next task. Exit only when claim returns empty.\n\n### Errors + debug\n\n- **\"database is locked\"**: retry with 100ms → 1s backoff, max 5 attempts. `busy_timeout=5000` handles most contention silently.\n- **Queue health**: `SELECT status, count(*) FROM tasks GROUP BY status;`\n- **Your in-flight work**: `SELECT id, goal, status FROM tasks WHERE worker_id='<worker-id>';`\n\n### Anti-patterns (will break the queue)\n\n- Don't DDL (CREATE/ALTER/DROP).\n- Don't DELETE — failed tasks stay as `failed` for audit.\n- Don't skip Protocol 4 (SOP gate) before marking done.\n- Don't hold a task >15min without updates — the stale-claim reclaimer revokes your claim.\n- Don't invent task IDs. Workers update existing rows; only the queen enqueues new ones.\n","frontmatter":{"name":"hive.colony-progress-tracker","description":"Claim tasks, record step progress, and verify SOP gates in the colony SQLite queue. Applies when your spawn message includes a db_path field.","metadata":{"author":"hive","type":"default-skill","visibility":["worker"]}},"isInternal":false,"tokens":1158,"sizeBytes":4678},{"name":"SKILL.md","path":"core/framework/skills/_default_skills/context-preservation/SKILL.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_default_skills/context-preservation/SKILL.md","title":"hive.context-preservation","category":"anthropic-skill","format":"markdown","content":"---\nname: hive.context-preservation\ndescription: Proactively extract critical values from tool results into working notes before automatic context pruning destroys them.\nmetadata:\n  author: hive\n  type: default-skill\n  visibility: [worker]\n---\n\n## Operational Protocol: Context Preservation\n\nYou operate under a finite context window. Older tool results WILL be pruned. Extract what you need while it's still in context.\n\n**Save-as-you-go.** After any tool call producing information you'll need later, immediately extract the key data into `_working_notes` or `_preserved_data`. Do not rely on referring back to old tool results — once they're pruned they're gone.\n\n**What to extract:**\n- URLs and key snippets (not full pages)\n- Relevant API fields (not raw JSON blobs)\n- Specific lines, values, or IDs (not entire files)\n- Analysis conclusions (not raw data)\n\n**Handoffs between tasks** happen through `progress.db`, not through shared-buffer handoff blobs. When you finish a task, any state the next worker needs goes into the task row itself (`steps.evidence`, `tasks.last_error`, `sop_checklist.note`) — see `hive.colony-progress-tracker`. Use `_working_notes` for things the DB schema doesn't cover.\n\nYou will receive an alert when context reaches {{warn_at_usage_ratio_pct}}% — preserve immediately.\n","frontmatter":{"name":"hive.context-preservation","description":"Proactively extract critical values from tool results into working notes before automatic context pruning destroys them.","metadata":{"author":"hive","type":"default-skill","visibility":["worker"]}},"isInternal":false,"tokens":283,"sizeBytes":1314},{"name":"SKILL.md","path":"core/framework/skills/_default_skills/error-recovery/SKILL.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_default_skills/error-recovery/SKILL.md","title":"hive.error-recovery","category":"anthropic-skill","format":"markdown","content":"---\nname: hive.error-recovery\ndescription: Follow a structured recovery decision tree when tool calls fail instead of blindly retrying or giving up.\nmetadata:\n  author: hive\n  type: default-skill\n  visibility: [worker]\n---\n\n## Operational Protocol: Error Recovery\n\nWhen a tool call fails:\n\n1. **Diagnose** — classify the failure as *transient* (network blip, rate limit, timeout) or *structural* (wrong selector, missing auth, invalid schema, permission denied).\n\n2. **Decide:**\n   - Transient → retry once.\n   - Structural + fixable → fix the input and retry.\n   - Structural + unfixable → record the failure and move to the next item.\n   - Blocking all progress → escalate.\n\n3. **Adapt** — if the same tool has failed {{max_retries_per_tool}}+ times in a row, stop using it and find an alternative approach.\n\n**Never silently drop a failed item.** If the item is a task in the colony queue, write the failure to the DB instead of an in-memory buffer:\n\n```bash\nsqlite3 \"$DB_PATH\" \"UPDATE tasks SET status='failed', last_error='<one-sentence reason>', completed_at=datetime('now'), updated_at=datetime('now') WHERE id='<task-id>' AND worker_id='<your-worker-id>';\"\n```\n\nThe `tasks.retry_count` column and the stale-claim reclaimer handle auto-retry for crashes; your job is the within-run decision tree above. See `hive.colony-progress-tracker` for the full queue protocol.\n","frontmatter":{"name":"hive.error-recovery","description":"Follow a structured recovery decision tree when tool calls fail instead of blindly retrying or giving up.","metadata":{"author":"hive","type":"default-skill","visibility":["worker"]}},"isInternal":false,"tokens":328,"sizeBytes":1386},{"name":"SKILL.md","path":"core/framework/skills/_default_skills/note-taking/SKILL.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_default_skills/note-taking/SKILL.md","title":"hive.note-taking","category":"anthropic-skill","format":"markdown","content":"---\nname: hive.note-taking\ndescription: Maintain a free-form scratchpad of decisions, extracted values, and open questions so context pruning doesn't lose anything you still need.\nmetadata:\n  author: hive\n  type: default-skill\n  visibility: [worker]\n---\n\n## Operational Protocol: Structured Note-Taking\n\nMaintain free-form working notes in shared buffer key `_working_notes` for data that *you* need to remember but that isn't captured by the colony task queue.\n\n**Do not duplicate the queue in here.** Per-task goal, ordered steps, and SOP gates live in `progress.db` — use `hive.colony-progress-tracker` for those. These notes are for things the DB schema doesn't cover.\n\nUpdate at these checkpoints:\n\n- After receiving new information that changes how you plan to approach the current step\n- Before any tool call that will produce substantial output you'll need to reference later\n- When you make a non-obvious decision whose *why* would be lost if the tool call history gets pruned\n\nStructure:\n\n### Key Decisions — decisions made and WHY\n### Working Data — intermediate results, extracted values (URLs, IDs, key snippets — not full pages)\n### Open Questions — uncertainties you plan to verify\n### Blockers — anything preventing progress that isn't already captured in `tasks.last_error`\n\nUpdate incrementally — do not rewrite from scratch each time.\n","frontmatter":{"name":"hive.note-taking","description":"Maintain a free-form scratchpad of decisions, extracted values, and open questions so context pruning doesn't lose anything you still need.","metadata":{"author":"hive","type":"default-skill","visibility":["worker"]}},"isInternal":false,"tokens":288,"sizeBytes":1368},{"name":"SKILL.md","path":"core/framework/skills/_default_skills/quality-monitor/SKILL.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_default_skills/quality-monitor/SKILL.md","title":"hive.quality-monitor","category":"anthropic-skill","format":"markdown","content":"---\nname: hive.quality-monitor\ndescription: Periodically self-assess output quality to catch degradation before the judge does.\nmetadata:\n  author: hive\n  type: default-skill\n  visibility: [worker]\n---\n\n## Operational Protocol: Quality Self-Assessment\n\nEvery {{assessment_interval}} iterations, self-assess:\n\n1. On-task? Still working toward the stated objective?\n2. Thorough? Cutting corners compared to earlier?\n3. Non-repetitive? Producing new value or rehashing?\n4. Consistent? Latest output contradict earlier decisions?\n5. Complete? Tracking all items, or silently dropped some?\n\nIf degrading: write assessment to `_quality_log`, re-read `_working_notes`,\nchange approach explicitly. If acceptable: brief note in `_quality_log`.\n","frontmatter":{"name":"hive.quality-monitor","description":"Periodically self-assess output quality to catch degradation before the judge does.","metadata":{"author":"hive","type":"default-skill","visibility":["worker"]}},"isInternal":false,"tokens":159,"sizeBytes":735},{"name":"SKILL.md","path":"core/framework/skills/_default_skills/writing-hive-skills/SKILL.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_default_skills/writing-hive-skills/SKILL.md","title":"hive.writing-hive-skills","category":"anthropic-skill","format":"markdown","content":"---\nname: hive.writing-hive-skills\ndescription: Author a new Agent Skill for a Hive agent that conforms to the Agent Skills specification (SKILL.md with YAML frontmatter, optional scripts/references/assets directories). Use when the user asks to create, scaffold, add, or package a new skill for a Hive agent.\nmetadata:\n  author: hive\n  type: default-skill\n  spec-source: https://agentskills.io/specification\n---\n\n## Operational Protocol: Writing Hive Skills\n\nHive agents discover skills by scanning several roots, in precedence order:\n\n1. `<project>/.hive/skills/` — project, Hive-specific\n2. `<project>/.agents/skills/` — project, cross-client\n3. `~/.hive/skills/` — user, Hive-specific\n4. `~/.agents/skills/` — user, cross-client\n5. Framework defaults shipped in `core/framework/skills/_default_skills/`\n\nEach skill is a directory containing a `SKILL.md`. At startup, only the frontmatter `name` + `description` of every skill is loaded; the body is loaded only when the agent activates the skill. Design for that.\n\n### Choosing where to put a new skill\n\n- **Colony-scoped (via `write_skill` inside colony mode)**: when the skill is the operational protocol a single colony needs — its API auth, DOM selectors, DB schema, task-queue conventions — do NOT place it under `~/.hive/skills/` or `<project>/.hive/skills/` yourself. Those roots are SHARED and every colony on the machine will see it. Instead, once you're inside the colony (post-fork), call `write_skill(skill_name, skill_description, skill_body, skill_files?)` and the skill is materialized under `~/.hive/colonies/<colony_name>/skills/<skill-name>/` where only that colony's workers discover it. See the subsection below.\n- **Project-scoped**: put under `<project>/.hive/skills/` when the skill is tied to that codebase's APIs, conventions, or infra and multiple agents in the project should share it.\n- **User-scoped**: put under `~/.hive/skills/` when the skill is reusable across projects for this machine/user and all agents should see it.\n- **Framework default**: add under `core/framework/skills/_default_skills/` AND register in `framework/skills/defaults.py::SKILL_REGISTRY` only when the skill is a universal operational protocol shipped with Hive. Default skills use the `hive.<name>` naming convention and include `type: default-skill` in metadata.\n\n### Colony-scoped skills via `write_skill`\n\nA colony-scoped skill is one that belongs to exactly ONE colony — e.g. it encodes the HoneyComb staging API the `honeycomb_research` colony polls, or the LinkedIn outbound flow the `linkedin_outbound_campaign` colony runs. Writing such a skill at `~/.hive/skills/` or `<project>/.hive/skills/` leaks it to every other colony, which will then see it at selection time.\n\n**Do not create the folder yourself with the terminal.** Once the colony has been forked (via `suggest_colony` → user confirms the Create Colony popup), call `write_skill` inside the colony:\n\n```\nwrite_skill(\n    skill_name=\"honeycomb-api-protocol\",\n    skill_description=\"How to query the HoneyComb staging API…\",\n    skill_body=\"## Operational Protocol\\n\\nAuth: …\",\n    skill_files=[{\"path\": \"scripts/fetch_tickers.py\", \"content\": \"…\"}],  # optional\n)\n```\n\nThe tool writes `~/.hive/colonies/<this_colony>/skills/honeycomb-api-protocol/SKILL.md` (plus any `skill_files`), which `SkillDiscovery` picks up as project scope when that colony's workers start — and ONLY that colony's workers. No cross-colony leakage.\n\nDo not write colony-bound skill folders by hand under `~/.hive/skills/`. A skill placed there is user-scoped and becomes visible to every colony on the machine — defeating the isolation you wanted.\n\n### Directory layout\n\n```\n<skill-name>/\n├── SKILL.md          # Required\n├── scripts/          # Optional — executable helpers\n├── references/       # Optional — on-demand docs\n└── assets/           # Optional — templates, data, images\n```\n\nRules:\n- The directory name **must** equal the `name` frontmatter field (for framework defaults, the directory is the unprefixed name, e.g. `writing-hive-skills/` for `hive.writing-hive-skills`).\n- Keep `SKILL.md` under ~500 lines. Move long reference material into `references/`.\n- Reference other files with relative paths from the skill root (`scripts/foo.py`, `references/API.md`). Keep references one level deep.\n\n### SKILL.md frontmatter\n\nRequired fields:\n\n| Field | Constraints |\n|-------|-------------|\n| `name` | 1–64 chars, `[a-z0-9-]`, no leading/trailing/consecutive hyphens. Must match the directory name. Framework defaults prefix with `hive.` |\n| `description` | 1–1024 chars. Must describe **what** the skill does **and when to use it**. Include trigger keywords the user is likely to say. |\n\nOptional fields:\n\n| Field | Notes |\n|-------|-------|\n| `license` | License name or reference to a bundled file |\n| `compatibility` | ≤500 chars. Only include if env requirements are non-trivial (network, tools, runtime) |\n| `metadata` | Free-form string→string map. Namespace keys to avoid collisions. Default skills set `type: default-skill`. |\n| `allowed-tools` | Experimental. Space-separated pre-approved tools, e.g. `Bash(curl:*) Bash(jq:*) Read` |\n\nMinimal template:\n\n```markdown\n---\nname: my-skill\ndescription: One sentence on what it does. One sentence on when to use it, with concrete trigger words the agent will see in user requests.\n---\n\n# My Skill\n\n<body>\n```\n\n### Writing a good `description`\n\nThis is the single most important field — it's the only thing the agent sees at skill-selection time.\n\n- **Bad**: `Helps with trading.`\n- **Good**: `Buy and sell shares on the HoneyComb exchange. Handles auth, slippage-protected orders, idempotent retries, and AMM output estimation. Use when placing trades or interacting with the AMM.`\n\nInclude verbs the user is likely to say (`buy`, `sell`, `place trade`) and proper nouns (`HoneyComb`, `AMM`).\n\n### Writing the body\n\nStructure the body for the agent, not a human reader:\n\n1. **Lead with what the agent can't guess** — API base URLs, auth shape, project conventions, specific function names. Skip generic background (\"PDFs are a document format\").\n2. **Show exact request/response shapes** — include JSON payloads, headers, status codes. Copy real examples rather than paraphrasing.\n3. **Document failure modes** — error codes, retry rules, rate limits. This is where skills earn their keep vs. a generic agent.\n4. **Give a short end-to-end example** — a \"typical flow\" section at the bottom anchors everything above.\n\nRecommended sections (adapt to the domain):\n- Authentication / setup\n- Core operations (one per endpoint or action)\n- Error reference table\n- Rate limits / gotchas\n- End-to-end example pattern\n\n### Progressive disclosure\n\nThree tiers of context cost:\n\n1. **Always loaded** (~100 tokens per skill): `name` + `description`. Keep tight.\n2. **Loaded on activation** (<5k tokens target): body of `SKILL.md`.\n3. **Loaded on demand**: files under `scripts/`, `references/`, `assets/`. The agent reads these only when the body points to them.\n\nIf a section is long and only needed sometimes (e.g., a full schema dump, rarely-used edge cases), move it to `references/SOMETHING.md` and link to it from the body: `See [the error catalog](references/ERRORS.md) for the full list.`\n\n### Scripts\n\nPut executable helpers in `scripts/`. They should:\n- Be self-contained or document dependencies in a comment header.\n- Print human-readable errors to stderr and exit non-zero on failure.\n- Accept arguments via CLI flags, not env vars (easier for the agent to invoke).\n\nReference them from the body by relative path:\n\n```markdown\nEstimate buy output with `scripts/estimate_buy.py --v-hc 1000000 --v-shares 1000000 --hc 500`.\n```\n\nFor Python scripts in a Hive project, prefer `uv run scripts/foo.py ...`.\n\n### Creating a new skill — workflow\n\n1. Pick a `<skill-name>` (lowercase-hyphenated).\n2. Decide scope: **colony** (pass content INLINE to `create_colony` — STOP here, do not hand-author the folder), project (`<project>/.hive/skills/`), user (`~/.hive/skills/`), or framework default (`core/framework/skills/_default_skills/` + registry entry).\n3. For the non-colony scopes: create the directory and write `SKILL.md` with frontmatter + body.\n4. Add `scripts/`, `references/`, `assets/` only if needed.\n5. Validate the frontmatter: name matches dir, description is specific, no forbidden characters.\n6. Validate using the Hive CLI:\n   ```bash\n   uv run hive skill validate <path-to-skill-dir>\n   uv run hive skill doctor\n   ```\n7. Confirm discovery with `uv run hive skill list`.\n8. Test by invoking a Hive agent on a task the skill should match — confirm it activates and follows the instructions.\n\n### Registering as a framework default\n\nWhen adding a skill as a shipped default:\n\n1. Place the directory under `core/framework/skills/_default_skills/<unprefixed-name>/`.\n2. Set frontmatter `name: hive.<unprefixed-name>` and `metadata.type: default-skill`.\n3. Add the mapping to `SKILL_REGISTRY` in `core/framework/skills/defaults.py`:\n   ```python\n   SKILL_REGISTRY: dict[str, str] = {\n       ...\n       \"hive.<unprefixed-name>\": \"<unprefixed-name>\",\n   }\n   ```\n4. If the skill uses `{{placeholder}}` substitution, add defaults to `_SKILL_DEFAULTS` in the same file.\n5. If the skill reads/writes shared buffer keys, list them in `DATA_BUFFER_KEYS`.\n\n### What NOT to put in a skill\n\n- Generic programming knowledge the agent already has.\n- Conversation-specific state (use memory or plans instead).\n- Secrets or credentials (skills are plaintext; reference env vars or credential stores).\n- Deeply nested reference chains — keep everything one hop from `SKILL.md`.\n","frontmatter":{"name":"hive.writing-hive-skills","description":"Author a new Agent Skill for a Hive agent that conforms to the Agent Skills specification (SKILL.md with YAML frontmatter, optional scripts/references/assets directories). Use when the user asks to create, scaffold, add, or package a new skill for a Hive agent.","metadata":{"author":"hive","type":"default-skill","spec-source":"https://agentskills.io/specification"}},"isInternal":false,"tokens":2329,"sizeBytes":9719},{"name":"SKILL.md","path":"core/framework/skills/_preset_skills/browser-automation/SKILL.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/browser-automation/SKILL.md","title":"browser-automation","category":"anthropic-skill","format":"markdown","content":"# browser-automation\n\nPath: `core/framework/skills/_preset_skills/browser-automation/SKILL.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/browser-automation/SKILL.md)","tokens":300,"sizeBytes":244},{"name":"SKILL.md","path":"core/framework/skills/_preset_skills/chart-creation-foundations/SKILL.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/chart-creation-foundations/SKILL.md","title":"chart-creation-foundations","category":"anthropic-skill","format":"markdown","content":"# chart-creation-foundations\n\nPath: `core/framework/skills/_preset_skills/chart-creation-foundations/SKILL.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/chart-creation-foundations/SKILL.md)","tokens":300,"sizeBytes":268},{"name":"SKILL.md","path":"core/framework/skills/_preset_skills/linkedin-automation/SKILL.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/linkedin-automation/SKILL.md","title":"linkedin-automation","category":"anthropic-skill","format":"markdown","content":"# linkedin-automation\n\nPath: `core/framework/skills/_preset_skills/linkedin-automation/SKILL.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/linkedin-automation/SKILL.md)","tokens":300,"sizeBytes":247},{"name":"exit_codes.md","path":"core/framework/skills/_preset_skills/terminal-tools-foundations/references/exit_codes.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-foundations/references/exit_codes.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-foundations/references/exit_codes.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-foundations/references/exit_codes.md)","tokens":300,"sizeBytes":290},{"name":"SKILL.md","path":"core/framework/skills/_preset_skills/terminal-tools-foundations/SKILL.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-foundations/SKILL.md","title":"terminal-tools-foundations","category":"anthropic-skill","format":"markdown","content":"# terminal-tools-foundations\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-foundations/SKILL.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-foundations/SKILL.md)","tokens":300,"sizeBytes":268},{"name":"find_predicates.md","path":"core/framework/skills/_preset_skills/terminal-tools-fs-search/references/find_predicates.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-fs-search/references/find_predicates.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-fs-search/references/find_predicates.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-fs-search/references/find_predicates.md)","tokens":300,"sizeBytes":296},{"name":"ripgrep_cheatsheet.md","path":"core/framework/skills/_preset_skills/terminal-tools-fs-search/references/ripgrep_cheatsheet.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-fs-search/references/ripgrep_cheatsheet.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-fs-search/references/ripgrep_cheatsheet.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-fs-search/references/ripgrep_cheatsheet.md)","tokens":300,"sizeBytes":302},{"name":"SKILL.md","path":"core/framework/skills/_preset_skills/terminal-tools-fs-search/SKILL.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-fs-search/SKILL.md","title":"terminal-tools-fs-search","category":"anthropic-skill","format":"markdown","content":"# terminal-tools-fs-search\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-fs-search/SKILL.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-fs-search/SKILL.md)","tokens":300,"sizeBytes":262},{"name":"signals.md","path":"core/framework/skills/_preset_skills/terminal-tools-job-control/references/signals.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-job-control/references/signals.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-job-control/references/signals.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-job-control/references/signals.md)","tokens":300,"sizeBytes":284},{"name":"SKILL.md","path":"core/framework/skills/_preset_skills/terminal-tools-job-control/SKILL.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-job-control/SKILL.md","title":"terminal-tools-job-control","category":"anthropic-skill","format":"markdown","content":"# terminal-tools-job-control\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-job-control/SKILL.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-job-control/SKILL.md)","tokens":300,"sizeBytes":268},{"name":"SKILL.md","path":"core/framework/skills/_preset_skills/terminal-tools-pty-sessions/SKILL.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-pty-sessions/SKILL.md","title":"hive.terminal-tools-pty-sessions","category":"anthropic-skill","format":"markdown","content":"---\nname: hive.terminal-tools-pty-sessions\ndescription: Use when you need state across calls — building env vars, navigating with cd, driving REPLs (python -i, mysql, psql, node), or responding to interactive prompts (sudo password, ssh host-key confirmation, mysql connection). Teaches the prompt-sentinel exec pattern (default mode), raw I/O for REPLs (raw_send=True then read_only=True), the one-in-flight-per-session rule, and the close-or-leak-against-the-cap discipline. Bash on macOS — never zsh; explicit shell=/bin/zsh is rejected. Read before calling terminal_pty_open.\nmetadata:\n  author: hive\n  type: preset-skill\n  version: \"1.0\"\n---\n\n# Persistent PTY sessions\n\nPTY sessions are how you talk to interactive programs — programs that detect a terminal (`isatty()`) and behave differently when they don't see one. Use a session when:\n\n- You need state to persist across calls (`cd`, env vars, sourced scripts)\n- You're driving a REPL (`python -i`, `mysql`, `psql`, `node`, `irb`)\n- A program demands an interactive prompt (`sudo`, `ssh`, `npm login`, `gh auth login`)\n\nFor everything else, `terminal_exec` is simpler. Sessions cost more (per-session bash process, ring buffer, idle-reaping bookkeeping) and have a hard cap (`TERMINAL_TOOLS_MAX_PTY`, default 8).\n\n## Why PTY (and not subprocess pipes)\n\nSubprocess pipes break on every interactive program. The moment a program calls `isatty()` and sees False, it disables prompts, color, line-editing, password masking, progress bars — sometimes refuses to start. PTY makes us look like a real terminal so these programs work the same as in your shell.\n\nThe cost: PTY output includes terminal escape codes (cursor moves, color codes). The session captures them as-is; if you need clean text, strip ANSI escapes in your processing layer.\n\n## Bash on macOS — by deliberate policy\n\n`terminal_pty_open` always invokes `/bin/bash`, regardless of the user's `$SHELL`. macOS users: yes, even when zsh is your interactive default. This is the **terminal-tools-foundations** policy applied to PTYs.\n\nReasons:\n- zsh has command/builtin classes (`zmodload`, `=cmd` expansion, `zpty`, `ztcp`) that bypass bash-shaped security checks\n- One shell behavior across platforms eliminates \"works on Linux, breaks on macOS\" surprises\n- Bash is universal: any shell you've used will accept the bash subset\n\nThe bash invocation uses `--norc --noprofile` so user dotfiles don't leak in. PS1 is set to a unique sentinel for prompt detection. PS2 is empty. PROMPT_COMMAND is empty.\n\n## Three modes of `terminal_pty_run`\n\n### 1. Default: send command, wait for prompt sentinel\n\n```\nterminal_pty_run(session_id, command=\"ls -la\")\n  → { output, prompt_after: True, ... }\n```\n\nThe session writes `ls -la\\n`, waits for the sentinel that its custom PS1 emits, returns the slice between submission and prompt. **One in-flight call per session** — a concurrent call returns a `\"session busy\"` error.\n\n### 2. raw_send: send raw input, no waiting\n\n```\nterminal_pty_run(session_id, command=\"print('hi')\\n\", raw_send=True)\n  → { bytes_sent: 12 }\n```\n\nFor REPLs, vim keystrokes, password prompts. The session writes the bytes and returns immediately — it doesn't wait for a prompt (REPLs don't print bash's prompt; they print their own).\n\nAfter a `raw_send`, you typically follow with:\n\n### 3. read_only: drain currently-buffered output\n\n```\nterminal_pty_run(session_id, read_only=True, timeout_sec=2)\n  → { output: \"hi\\n\", more: False, ... }\n```\n\nReads whatever the session has accumulated since the last drain, with a brief settle window. Use after raw_send to capture the REPL's response.\n\n## Custom prompt detection (`expect`)\n\nWhen the command launches a program with its own prompt (Python REPL's `>>> `, mysql's `mysql> `, sudo's password prompt), the bash sentinel won't appear until the program exits. Override:\n\n```\nterminal_pty_run(session_id, command=\"python3\", expect=r\">>>\\s*$\", timeout_sec=10)\n  → output up to and including \">>>\", then control returns\n```\n\nFor sudo:\n\n```\nterminal_pty_run(session_id, command=\"sudo -k && sudo whoami\", expect=r\"[Pp]assword:\")\nterminal_pty_run(session_id, command=\"<password>\", raw_send=True, command=\"<password>\\n\")\nterminal_pty_run(session_id, read_only=True, timeout_sec=5)\n```\n\n(Treat passwords carefully — they end up in the ring buffer.)\n\n## Always close\n\n```\nterminal_pty_close(session_id)\n```\n\nLeaked sessions count against `TERMINAL_TOOLS_MAX_PTY` (default 8). Idle reaping happens lazily on every `_open` call (sessions inactive longer than `idle_timeout_sec`, default 1800s, are dropped) — but don't rely on it. Close when you're done.\n\nFor unresponsive sessions, `force=True` skips the graceful \"exit\" attempt and goes straight to SIGTERM/SIGKILL.\n\n## Common patterns\n\n### Stateful navigation\n\n```\nsid = terminal_pty_open(cwd=\"/\")\nterminal_pty_run(sid, command=\"cd /var/log\")\nterminal_pty_run(sid, command=\"ls -la *.log | head\")\nterminal_pty_close(sid)\n```\n\n### Python REPL\n\n```\nsid = terminal_pty_open()\nterminal_pty_run(sid, command=\"python3\", expect=r\">>>\\s*$\")\nterminal_pty_run(sid, command=\"x = 42\", raw_send=True)\nterminal_pty_run(sid, command=\"print(x*x)\\n\", raw_send=True)\nresult = terminal_pty_run(sid, read_only=True)  # → \"1764\\n>>> \"\nterminal_pty_run(sid, command=\"exit()\", raw_send=True)\nterminal_pty_close(sid)\n```\n\n### ssh with host-key prompt\n\n```\nsid = terminal_pty_open()\nterminal_pty_run(sid, command=\"ssh user@new-host\", expect=r\"\\(yes/no.*\\)\\?\")\nterminal_pty_run(sid, command=\"yes\\n\", raw_send=True)\nterminal_pty_run(sid, read_only=True, timeout_sec=10)  # password prompt or login\n```\n","frontmatter":{"name":"hive.terminal-tools-pty-sessions","description":"Use when you need state across calls — building env vars, navigating with cd, driving REPLs (python -i, mysql, psql, node), or responding to interactive prompts (sudo password, ssh host-key confirmation, mysql connection). Teaches the prompt-sentinel exec pattern (default mode), raw I/O for REPLs (raw_send=True then read_only=True), the one-in-flight-per-session rule, and the close-or-leak-against-the-cap discipline. Bash on macOS — never zsh; explicit shell=/bin/zsh is rejected. Read before calling terminal_pty_open.","metadata":{"author":"hive","type":"preset-skill","version":"1.0"}},"isInternal":false,"tokens":1406,"sizeBytes":5616},{"name":"SKILL.md","path":"core/framework/skills/_preset_skills/terminal-tools-troubleshooting/SKILL.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-troubleshooting/SKILL.md","title":"hive.terminal-tools-troubleshooting","category":"anthropic-skill","format":"markdown","content":"---\nname: hive.terminal-tools-troubleshooting\ndescription: Read when a terminal-tools call returned something surprising — empty stdout despite no error, exit_code is null, output_handle came back expired, \"too many jobs\" / \"session busy\" / \"too many PTYs\", warning was set unexpectedly, semantic_status disagrees with exit_code. Diagnostic recipes only — load on demand. Don't preload; the foundational skill covers the happy path.\nmetadata:\n  author: hive\n  type: preset-skill\n  version: \"1.0\"\n---\n\n# Troubleshooting terminal-tools\n\nRecipes for surprising results. Match the symptom to the section.\n\n## Empty `stdout` despite the command \"should have\" produced output\n\nPossible causes:\n1. Output went to **stderr** instead. Check `stderr` in the envelope (or use `merge_stderr=True` for jobs).\n2. Output was **fully truncated** because `max_output_kb` is too small. Check `stdout_truncated_bytes > 0`. Bump `max_output_kb` or paginate via `output_handle`.\n3. Command produced no output (correct, just unexpected — `silent` flags, no matches).\n4. Pipeline issue: the last stage of a pipe ran but stdout went elsewhere (`> /dev/null`, redirected via `2>&1`).\n5. Process is buffering its output and didn't flush before exit. Add `stdbuf -oL` (line-buffered) or `unbuffer` to the command.\n\n## `exit_code: null`\n\n| Cause | Other field |\n|---|---|\n| Auto-backgrounded | `auto_backgrounded: true, job_id: <X>` |\n| Hard timeout, process killed | `timed_out: true` |\n| Pre-spawn failure (command not found) | `error: ...` set, `pid: null` |\n| Still running (in `terminal_job_logs`) | `status: \"running\"` |\n\n## `output_handle` returned `expired: true`\n\n5-minute TTL. Either (a) you waited too long, or (b) the store evicted it under memory pressure (64 MB total cap, LRU eviction). Re-run the command.\n\nTo reduce risk: paginate the handle as soon as you receive it, or use `terminal_job_*` for huge outputs (4 MB ring buffer with offsets — no expiry).\n\n## \"too many jobs\" / `JobLimitExceeded`\n\n`TERMINAL_TOOLS_MAX_JOBS` (default 32) hit. Either:\n- Wait for jobs to exit (poll with `terminal_job_logs(wait_until_exit=True)`)\n- Kill old jobs: `terminal_job_manage(action=\"list\")` to see what's running, then `signal_term` the abandoned ones\n- Raise the cap via env (rare)\n\n## \"session busy\"\n\nA `terminal_pty_run` was issued while another `_run` is in flight on the same session. PTY sessions are single-threaded conversations. Wait for the prior call to return, or open a second session.\n\n## \"PTY cap reached\"\n\n`TERMINAL_TOOLS_MAX_PTY` (default 8) hit. Close idle sessions (`terminal_pty_close`). Idle reaping is lazy; force it by opening — no, actually, opening throws when the cap is hit. Just close manually.\n\n## `warning` is set, the command worked\n\nInformational only. The pattern matched (e.g. `rm -rf` literally appears, or `git push --force` was used). The command ran. The warning is your \"did I mean to do that?\" prompt — verify the side effect was intended before continuing.\n\n## `semantic_status: \"ok\"` but `exit_code: 1`\n\nWorking as designed. Some commands use exit 1 for legitimate non-error states:\n- `grep` / `rg` exit 1 when **no matches** found\n- `find` exit 1 when **some directories were unreadable** (typical on `/proc`, etc.)\n- `diff` exit 1 when **files differ**\n- `test` / `[` exit 1 when **condition is false**\n\nThe `semantic_message` field explains. Trust `semantic_status`, not raw `exit_code`.\n\n## `semantic_status: \"error\"` but `exit_code: 0`\n\nShouldn't happen. If it does, file a bug.\n\n## `truncated_bytes_dropped > 0` in `terminal_job_logs`\n\nYour `since_offset` was older than the ring buffer's floor — bytes evicted before you could read them. Either:\n- Poll faster (lower latency between calls)\n- Use `merge_stderr=True` (single 4 MB ring instead of 4 MB × 2)\n- Accept the gap and move forward from `next_offset`\n\n## `terminal_pty_open` succeeds but the first `_run` times out\n\nThe session may not have produced its first prompt sentinel within the 2-second startup window. Try:\n- A `terminal_pty_run(sid, read_only=True, timeout_sec=2)` to drain whatever's accumulated\n- A noop command (`terminal_pty_run(sid, command=\"true\")`) to force a prompt cycle\n\nCould also indicate the bash process died at startup — `terminal_pty_run(sid, ...)` would then return `\"session has exited\"`.\n\n## `shell=\"/bin/zsh\"` returned an error\n\nBy design. terminal-tools is bash-only on POSIX. Use `shell=True` (default `/bin/bash`) or omit `shell=` to exec directly.\n\n## A command in `shell=True` is interpreted differently than expected\n\nBash, not zsh, semantics. `**/*` doesn't recurse without `shopt -s globstar`; `=cmd` expansion doesn't work; arrays use `arr[idx]` not `${arr[idx]}` differently than zsh. When in doubt, the foundational skill's \"bash, not zsh\" section is the canonical statement.\n","frontmatter":{"name":"hive.terminal-tools-troubleshooting","description":"Read when a terminal-tools call returned something surprising — empty stdout despite no error, exit_code is null, output_handle came back expired, \"too many jobs\" / \"session busy\" / \"too many PTYs\", warning was set unexpectedly, semantic_status disagrees with exit_code. Diagnostic recipes only — load on demand. Don't preload; the foundational skill covers the happy path.","metadata":{"author":"hive","type":"preset-skill","version":"1.0"}},"isInternal":false,"tokens":1228,"sizeBytes":4820},{"name":"SKILL.md","path":"core/framework/skills/_preset_skills/x-automation/SKILL.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/x-automation/SKILL.md","title":"hive.x-automation","category":"anthropic-skill","format":"markdown","content":"---\nname: hive.x-automation\ndescription: Read before automating X / Twitter with browser_* tools. Verified flows for post, reply, delete, search-and-engage, plus the Draft.js compose quirks that silently disable the send button. Includes the daily-reply and job-market-reply playbooks. Requires hive.browser-automation for the underlying screenshot + coordinate workflow. Verified 2026-04-11.\nmetadata:\n  author: hive\n  type: default-skill\n  version: \"1.0\"\n  verified: 2026-04-11\n  requires_skill: hive.browser-automation\n---\n\n# X / Twitter Automation\n\nX uses **Draft.js** (the original Facebook rich-text editor) for the compose text area, which was the original canary for all the rich-text editor quirks the `browser-automation` skill now documents. Most of the site is otherwise stable — `data-testid` attributes have held up for years, the SPA is reasonably honest about what it renders, and shadow DOM is minimal. The hard parts are the composer, rate limiting, and the occasional anti-bot challenge.\n\n**Always activate `browser-automation` first.** This skill assumes you already know about CSS-px coordinates, click-first typing, and `Input.insertText`. The guidance below is X-specific.\n\n## Timing expectations\n\n- `browser_navigate(wait_until=\"load\")` returns in **1.3–1.6 s** on a warm cache.\n- After navigation, **`sleep(2–3)`** for SPA hydration before querying selectors.\n- Compose modal slide-in: **~1.5 s** after clicking reply / compose.\n- First 1–2 characters typed into the compose editor **may be dropped** — see \"Draft.js quirks\" below.\n\n## Verified selectors (2026-04-11)\n\n| Target | Selector |\n|---|---|\n| Home nav link | `a[data-testid='AppTabBar_Home_Link']` |\n| Explore nav link | `a[data-testid='AppTabBar_Explore_Link']` |\n| Notifications | `a[data-testid='AppTabBar_Notifications_Link']` |\n| Main search input | `input[data-testid='SearchBox_Search_Input']` |\n| Compose text area | `[data-testid='tweetTextarea_0']` (Draft.js contenteditable) |\n| Post / Tweet submit button | `[data-testid='tweetButton']` |\n| Reply button (on feed / tweet detail) | `[data-testid='reply']` |\n| Like button | `[data-testid='like']` |\n| Retweet / repost button | `[data-testid='retweet']` |\n| Caret (⋯) menu on a post | `[data-testid='caret']` |\n| Confirmation sheet confirm button | `[data-testid='confirmationSheetConfirm']` |\n| Tweet article wrapper | `article[data-testid='tweet']` |\n| Close modal / composer | `[aria-label='Close']` or press `Escape` |\n\nAll of these are light-DOM `data-testid` attributes — `wait_for_selector` and `browser_type(selector=...)` work on them directly, no shadow piercing needed.\n\n## Post new tweet flow\n\n```\nbrowser_navigate(\"https://x.com/home\", wait_until=\"load\")\nsleep(3)\n\n# Open the compose UI (click the post-new-tweet nav or use shortcut N)\nbrowser_press(\"n\")   # keyboard shortcut — opens compose modal\nsleep(1.5)\n\n# Click the textarea to make sure Draft.js is in edit mode\nta_rect = browser_get_rect(\"[data-testid='tweetTextarea_0']\")\nbrowser_click_coordinate(ta_rect.cx, ta_rect.cy)\nsleep(0.5)\n\n# Type — browser_type handles Draft.js correctly now via Input.insertText\nbrowser_type(\"[data-testid='tweetTextarea_0']\", tweet_text)\nsleep(1.0)  # let Draft.js commit state\n\n# Verify the Post button is enabled — never click blindly, Draft.js sometimes\n# doesn't register the input even with a prior click.\nstate = browser_evaluate(\"\"\"\n  (function(){\n    const btn = document.querySelector('[data-testid=\"tweetButton\"]');\n    if (!btn) return {found: false};\n    return {\n      found: true,\n      disabled: btn.disabled || btn.getAttribute('aria-disabled') === 'true',\n    };\n  })();\n\"\"\")\nif state['found'] and not state['disabled']:\n    browser_click(\"[data-testid='tweetButton']\")\n    sleep(2)\n    browser_press(\"Escape\")  # close any leftover modal\n```\n\n## Posting a tweet WITH an image\n\n**Critical: NEVER click the photo button.** On `x.com/compose/post` the media button is a styled `<button>` that triggers Chrome's native OS file picker when clicked — that dialog is unreachable via CDP and will wedge the automation. Instead, set the file directly on the hidden `<input type='file'>` element using `browser_upload`:\n\n```python\n# 1. Open the compose modal as usual\nbrowser_press(\"n\")\nsleep(1.5)\nbrowser_click_coordinate(ta_rect.cx, ta_rect.cy)\nsleep(0.5)\nbrowser_type(\"[data-testid='tweetTextarea_0']\", tweet_text)\n\n# 2. Find the hidden file input X uses for media uploads.\n#    X's input is marked with data-testid='fileInput' and accepts\n#    image/*,video/*. It's hidden (display:none) but still mounted.\ninputs = browser_evaluate(\"\"\"\n  (function(){\n    return Array.from(document.querySelectorAll('input[type=\"file\"]'))\n      .map(el => ({\n        testid: el.getAttribute('data-testid') || '',\n        accept: el.accept || '',\n        multiple: el.multiple,\n      }));\n  })();\n\"\"\")\n# Expect to see: [{testid: 'fileInput', accept: 'image/jpeg,...', multiple: true}]\n\n# 3. Set the file WITHOUT opening any dialog\nbrowser_upload(\n    selector=\"input[data-testid='fileInput']\",\n    file_paths=[\"/absolute/path/to/photo.png\"],\n)\nsleep(2)  # X takes ~1-2s to show the preview thumbnail\n\n# 4. Verify the preview rendered before posting — if not, the upload\n#    didn't land and Post button will fail.\npreview = browser_evaluate(\"\"\"\n  (function(){\n    // X renders uploaded media as an <img> with data-testid='attachments'\n    // (or similar) inside the composer.\n    const att = document.querySelector('[data-testid=\"attachments\"] img');\n    return { hasPreview: !!att };\n  })();\n\"\"\")\nif not preview['hasPreview']:\n    raise Exception(\"Upload didn't render in composer — do NOT click Post\")\n\n# 5. Now click Post as usual\nbrowser_click(\"[data-testid='tweetButton']\")\nsleep(3)  # media upload + post takes longer than text-only\nbrowser_press(\"Escape\")\n```\n\nIf you don't already have the image file on disk, write it first: `write_file(\"/tmp/x_upload.png\", base64_bytes)` or copy from a known location. `browser_upload` requires an absolute file path — relative paths and `~` expansion are not supported.\n\n## Reply to a post flow\n\nThe reply flow is the same shape as posting, with a few scroll / find-and-click steps before.\n\n```\nbrowser_navigate(\"https://x.com/home\", wait_until=\"load\")\nsleep(3)\n\n# Load content by scrolling — X lazy-loads feed items\nbrowser_scroll(direction=\"down\", amount=2000)\nsleep(1.5)\n\n# Find replyable tweets — reply buttons, in visual/feed order\ncandidates = browser_evaluate(\"\"\"\n  (function(){\n    const tweets = document.querySelectorAll('article[data-testid=\"tweet\"]');\n    const out = [];\n    tweets.forEach((t, i) => {\n      const reply = t.querySelector('[data-testid=\"reply\"]');\n      if (!reply) return;\n      const r = reply.getBoundingClientRect();\n      if (r.width <= 0 || r.y < 0 || r.y > window.innerHeight) return;\n      const text = (t.textContent || '').slice(0, 120);\n      out.push({\n        index: i,\n        preview: text,\n        cx: r.x + r.width/2,\n        cy: r.y + r.height/2,\n      });\n    });\n    return out;\n  })();\n\"\"\")\n\n# For each unreplied candidate...\nfor c in candidates:\n    if already_replied(c['preview']):\n        continue  # see dedup pattern below\n\n    # Click reply\n    browser_click_coordinate(c['cx'], c['cy'])\n    sleep(1.5)  # composer slide-in\n\n    # Click the textarea to focus Draft.js\n    ta = browser_get_rect(\"[data-testid='tweetTextarea_0']\")\n    browser_click_coordinate(ta.cx, ta.cy)\n    sleep(0.5)\n\n    # Type the reply\n    browser_type(\"[data-testid='tweetTextarea_0']\", reply_text)\n    sleep(1.5)   # Draft.js state commit takes a beat\n\n    # Verify button enabled\n    state = browser_evaluate(\"\"\"\n      (function(){\n        const b = document.querySelector('[data-testid=\"tweetButton\"]');\n        return b ? {d: b.disabled || b.getAttribute('aria-disabled') === 'true'} : {d: true};\n      })();\n    \"\"\")\n    if state['d']:\n        # Recovery: click the textarea again + one extra character toggles React state\n        browser_click_coordinate(ta.cx, ta.cy)\n        browser_press(\"End\")\n        browser_press(\" \")\n        browser_press(\"Backspace\")\n        sleep(0.5)\n    else:\n        browser_click(\"[data-testid='tweetButton']\")\n        sleep(2)\n        # Mark the task done in progress.db — see hive.colony-progress-tracker\n\n    # Close the composer (press Escape or click the Close button)\n    browser_press(\"Escape\")\n    sleep(random.uniform(10, 20))   # human cadence — see rate limits\n```\n\n## Search-and-engage flow\n\nFor \"daily reply to live posts matching query X\" — e.g. job-market replies.\n\n```\nquery = \"job market\"\nurl = f\"https://x.com/search?q={urllib.parse.quote(query)}&src=typed_query&f=live\"\nbrowser_navigate(url, wait_until=\"load\")\nsleep(3)\nbrowser_scroll(\"down\", 2000)\nsleep(1.5)\n\n# Same replyable-tweets probe as above, then same reply-to-tweet loop\n```\n\n## Delete a post flow\n\n```\nbrowser_navigate(\"https://x.com/<your_username>/with_replies\", wait_until=\"load\")\nsleep(3)\n\n# Find the target article (by text match or index)\ntarget_caret = browser_evaluate(\"\"\"\n  (function(target_text){\n    const tweets = document.querySelectorAll('article[data-testid=\"tweet\"]');\n    for (const t of tweets){\n      if (!(t.textContent || '').includes(target_text)) continue;\n      const caret = t.querySelector('[data-testid=\"caret\"]');\n      if (!caret) continue;\n      const r = caret.getBoundingClientRect();\n      return {cx: r.x + r.width/2, cy: r.y + r.height/2};\n    }\n    return null;\n  })();\n\"\"\", target_text)\n\nbrowser_click_coordinate(target_caret['cx'], target_caret['cy'])\nsleep(0.8)   # menu animation\n\n# The Delete menuitem doesn't have a stable data-testid — find by text\ndelete_rect = browser_evaluate(\"\"\"\n  (function(){\n    const items = document.querySelectorAll('[role=\"menuitem\"]');\n    for (const el of items){\n      if ((el.textContent || '').trim() === 'Delete'){\n        const r = el.getBoundingClientRect();\n        return {cx: r.x + r.width/2, cy: r.y + r.height/2};\n      }\n    }\n    return null;\n  })();\n\"\"\")\nbrowser_click_coordinate(delete_rect['cx'], delete_rect['cy'])\nsleep(0.8)\n\n# Confirmation sheet — this one DOES have a stable testid\nbrowser_click(\"[data-testid='confirmationSheetConfirm']\")\nsleep(1.5)\n```\n\n## Draft.js quirks\n\nX's compose editor is the canonical test case for every rich-text-editor bug the GCU bridge has ever had. What you need to know:\n\n- **Click the textarea first.** Mandatory. Without a native click-sourced focus event, Draft.js's editor state never enters edit mode, and the Post button stays disabled regardless of how much text you type. `browser_type` now does this click automatically.\n\n- **`browser_type` uses CDP `Input.insertText` by default**, which Draft.js accepts cleanly. The older approach — per-character `Input.dispatchKeyEvent` with `delay_ms=20` — *also* works, but insertText is more reliable and faster. Only pass `delay_ms > 0` (which falls back to per-char dispatch) if you're specifically testing the keystroke timing path.\n\n- **First 1–2 characters may be eaten** on the per-char dispatch path (not on insertText). If you see `\"estin\"` instead of `\"testin\"`, prepend a throwaway character or use insertText.\n\n- **Verify `tweetButton`'s `disabled` state** before clicking. Draft.js's internal state can disagree with the DOM text — verify framework state via a targeted `browser_evaluate` on `aria-disabled`.\n\n- **If the button stays disabled after typing**, use the recovery dance: click the textarea again, press `End`, press a space, press `Backspace`. This forces React to recompute `hasRealContent` and usually flips the button on.\n\n- **URL previews take a beat to render.** If your tweet ends with a URL, wait 2–3 s after typing so the link-card preview loads before you post — otherwise the tweet publishes without the card.\n\n## Rate limits and safety\n\n| Action | Limit |\n|---|---|\n| Tweets per hour | ~50 before throttling |\n| Replies per session | **5–10 per run**, randomized 10–20 s delays |\n| DMs per day | Varies by account age; 50–100 for established accounts |\n| Follow/unfollow | <400/day spread over time |\n| Like per day | 1000 max; 200–300 is safer |\n\nSignals you're being rate-limited or flagged:\n- 429 status in network responses (not always visible to the agent)\n- \"You are unable to Tweet\" banner\n- Redirect to `https://x.com/account/access` (anti-bot check)\n- Posts appearing to publish but not visible on your profile\n- Reply button click opens but composer never receives focus\n\nIf any of these appear, **stop the run, screenshot the state, and surface the issue.** Do not retry immediately.\n\n## Deduplication pattern\n\nDedup is handled by the colony progress queue, not a separate JSON file. The queen enqueues one row in the `tasks` table per reply target (keyed by tweet URL); workers claim, reply, and mark done. Already-`done` rows are skipped on the next claim — that's your crash-resume and cross-day dedup, for free. See `hive.colony-progress-tracker` for the full claim/update protocol.\n\nExtract the tweet URL via `browser_evaluate` so the queen can use it as the task key:\n\n```\nurl = browser_evaluate(\"\"\"\n  (function(article_index){\n    const t = document.querySelectorAll('article[data-testid=\"tweet\"]')[article_index];\n    if (!t) return null;\n    const link = t.querySelector('a[href*=\"/status/\"]');\n    return link ? link.href : null;\n  })();\n\"\"\", article_index)\n```\n\nIf you need to check whether a given tweet URL has already been replied to in a prior run (e.g., scanning live search results before enqueuing), query the queue directly:\n\n```bash\nsqlite3 \"<db_path>\" \"SELECT status FROM tasks WHERE payload LIKE '%\\\"tweet_url\\\":\\\"<url>\\\"%';\"\n```\n\nEmpty → not yet enqueued, safe to add. Otherwise honor the existing row's status.\n\n## Reply style guidelines\n\nThese are soft rules derived from the backed-up `x-daily-replies` and `x-job-market-replies` skills — tune per your operator's preference.\n\n**Daily replies (siren_fs persona, dark humorous):**\n- 2 sentences MAX\n- Dark, humorous, insightful, trendy\n- Must feel like a real person with opinions and edge\n- Must NOT sound like AI, use corporate speak, or be corny\n- Tie to current news/culture when possible\n- English only\n- Target: 5–8 replies per run\n- Skip posts that are purely images/video with no text context\n- Prioritize high-engagement accounts\n- Skip ads unless genuinely interesting\n\n**Job-market replies (casual slang + prediction-market CTA):**\n- 2–3 short sentences max\n- Casual slang, alt spellings: \"u\", \"fr\", \"lmao\", \"lol\"\n- Always include a profile-level CTA (\"check my profile if u wanna see…\")\n- Tie the reply to the economic / career angle of the original post\n- Vary templates — never identical text across replies\n- Max 10 replies per session\n\n## Common pitfalls\n\n- **Typing without clicking first → send button stays disabled.** Draft.js only enters edit mode after a native focus event. `browser_type` handles this automatically now, but if you're using raw CDP calls, click first.\n\n- **First 1–2 chars eaten on per-char dispatch.** Stick with `browser_type` default (uses `Input.insertText`). Only use `delay_ms=20` fallback if you need per-keystroke timing.\n\n- **Clicking Post with Draft.js state disagreeing.** Always verify `[data-testid=\"tweetButton\"]`'s `disabled` / `aria-disabled` before clicking. If disabled, run the recovery dance.\n\n- **Anti-bot challenge mid-run.** X occasionally shows a JavaScript challenge or redirects to `/account/access`. Detect by checking the URL after navigation and the presence of the home nav:\n  ```\n  challenged = browser_evaluate(\"\"\"\n    (function(){\n      return window.location.href.includes('/account/access') ||\n             !document.querySelector('a[data-testid=\"AppTabBar_Home_Link\"]');\n    })();\n  \"\"\")\n  ```\n  If challenged, stop and surface to the operator. Do not try to solve it.\n\n- **Composer modal fails to open on rapid clicks.** X debounces the reply button click. Always `sleep(1.5)` after clicking before trying to query the textarea.\n\n- **Navigation inside the SPA is preferred over full page loads.** Clicking a tweet to open its detail view keeps the compose state; using `browser_navigate` reloads everything and slows the run. Use `browser_click` on internal links when possible.\n\n- **X's `window.innerHeight` changes on compose modal open.** The modal takes over most of the viewport. Don't cache viewport dimensions across a compose open; re-query after the modal slide-in.\n\n- **URL-only tweets post without a link card if you click Post too fast.** Wait 2–3 s after typing a URL before clicking Post so the card preview renders.\n\n## Auth wall detection\n\nCheck logged-in state before any action:\n\n```\nlogged_in = browser_evaluate(\"\"\"\n  (function(){\n    return !!document.querySelector('a[data-testid=\"AppTabBar_Home_Link\"]') &&\n           !window.location.href.includes('/i/flow/login');\n  })();\n\"\"\")\n```\n\nIf not logged in, **stop immediately** and surface. Do not attempt to log in via automation.\n\n## See also\n\n- `browser-automation` skill — general CDP/coord/screenshot rules, click-then-type pattern, Input.insertText\n- `linkedin-automation` skill — LinkedIn equivalent\n","frontmatter":{"name":"hive.x-automation","description":"Read before automating X / Twitter with browser_* tools. Verified flows for post, reply, delete, search-and-engage, plus the Draft.js compose quirks that silently disable the send button. Includes the daily-reply and job-market-reply playbooks. Requires hive.browser-automation for the underlying screenshot + coordinate workflow. Verified 2026-04-11.","metadata":{"author":"hive","type":"default-skill","version":"1.0","verified":"2026-04-11","requires_skill":"hive.browser-automation"}},"isInternal":false,"tokens":4129,"sizeBytes":17171},{"name":"BROWSER_USE_PATTERNS.md","path":"tools/BROWSER_USE_PATTERNS.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/BROWSER_USE_PATTERNS.md","title":"Tools Skill","category":"anthropic-skill","format":"markdown","content":"# Tools Skill\n\nPath: `tools/BROWSER_USE_PATTERNS.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/BROWSER_USE_PATTERNS.md)","tokens":300,"sizeBytes":167},{"name":"manifest.json","path":"tools/browser-extension/manifest.json","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/browser-extension/manifest.json","title":"Browser-extension Skill","category":"anthropic-skill","format":"json","content":"# Browser-extension Skill\n\nPath: `tools/browser-extension/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/browser-extension/manifest.json)","tokens":300,"sizeBytes":195},{"name":"BUILDING_TOOLS.md","path":"tools/BUILDING_TOOLS.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/BUILDING_TOOLS.md","title":"Tools Skill","category":"anthropic-skill","format":"markdown","content":"# Tools Skill\n\nPath: `tools/BUILDING_TOOLS.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/BUILDING_TOOLS.md)","tokens":300,"sizeBytes":155},{"name":"mcp_servers.json","path":"tools/mcp_servers.json","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/mcp_servers.json","title":"Tools Skill","category":"anthropic-skill","format":"json","content":"# Tools Skill\n\nPath: `tools/mcp_servers.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/mcp_servers.json)","tokens":300,"sizeBytes":153},{"name":"test_02_twitter_scroll.py","path":".claude/skills/browser-edge-cases/scripts/test_02_twitter_scroll.py","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_02_twitter_scroll.py","title":"Claude Directive: test_02_twitter_scroll.py","category":"claude-rule","format":"markdown","content":"# Claude Directive: test_02_twitter_scroll.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_02_twitter_scroll.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_02_twitter_scroll.py)","tokens":300,"sizeBytes":275},{"name":"test_03_modal_scroll.py","path":".claude/skills/browser-edge-cases/scripts/test_03_modal_scroll.py","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_03_modal_scroll.py","title":"Claude Directive: test_03_modal_scroll.py","category":"claude-rule","format":"markdown","content":"# Claude Directive: test_03_modal_scroll.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_03_modal_scroll.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_03_modal_scroll.py)","tokens":300,"sizeBytes":269},{"name":"test_04_element_covered.py","path":".claude/skills/browser-edge-cases/scripts/test_04_element_covered.py","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_04_element_covered.py","title":"Claude Directive: test_04_element_covered.py","category":"claude-rule","format":"markdown","content":"# Claude Directive: test_04_element_covered.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_04_element_covered.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_04_element_covered.py)","tokens":300,"sizeBytes":278},{"name":"test_06_shadow_dom.py","path":".claude/skills/browser-edge-cases/scripts/test_06_shadow_dom.py","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_06_shadow_dom.py","title":"Claude Directive: test_06_shadow_dom.py","category":"claude-rule","format":"markdown","content":"# Claude Directive: test_06_shadow_dom.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_06_shadow_dom.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_06_shadow_dom.py)","tokens":300,"sizeBytes":263},{"name":"test_07_contenteditable.py","path":".claude/skills/browser-edge-cases/scripts/test_07_contenteditable.py","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_07_contenteditable.py","title":"Claude Directive: test_07_contenteditable.py","category":"claude-rule","format":"markdown","content":"# Claude Directive: test_07_contenteditable.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_07_contenteditable.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_07_contenteditable.py)","tokens":300,"sizeBytes":278},{"name":"test_08_autocomplete.py","path":".claude/skills/browser-edge-cases/scripts/test_08_autocomplete.py","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_08_autocomplete.py","title":"Claude Directive: test_08_autocomplete.py","category":"claude-rule","format":"markdown","content":"# Claude Directive: test_08_autocomplete.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_08_autocomplete.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_08_autocomplete.py)","tokens":300,"sizeBytes":269},{"name":"test_10_huge_dom.py","path":".claude/skills/browser-edge-cases/scripts/test_10_huge_dom.py","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_10_huge_dom.py","title":"Claude Directive: test_10_huge_dom.py","category":"claude-rule","format":"markdown","content":"# Claude Directive: test_10_huge_dom.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_10_huge_dom.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_10_huge_dom.py)","tokens":300,"sizeBytes":257},{"name":"test_13_spa_navigation.py","path":".claude/skills/browser-edge-cases/scripts/test_13_spa_navigation.py","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_13_spa_navigation.py","title":"Claude Directive: test_13_spa_navigation.py","category":"claude-rule","format":"markdown","content":"# Claude Directive: test_13_spa_navigation.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_13_spa_navigation.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_13_spa_navigation.py)","tokens":300,"sizeBytes":275},{"name":"test_15_screenshot.py","path":".claude/skills/browser-edge-cases/scripts/test_15_screenshot.py","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_15_screenshot.py","title":"Claude Directive: test_15_screenshot.py","category":"claude-rule","format":"markdown","content":"# Claude Directive: test_15_screenshot.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_15_screenshot.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_15_screenshot.py)","tokens":300,"sizeBytes":263},{"name":"test_case.py","path":".claude/skills/browser-edge-cases/scripts/test_case.py","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_case.py","title":"Claude Directive: test_case.py","category":"claude-rule","format":"markdown","content":"# Claude Directive: test_case.py\n\nPath: `.claude/skills/browser-edge-cases/scripts/test_case.py`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/scripts/test_case.py)","tokens":300,"sizeBytes":236},{"name":"README.md","path":"tools/browser-extension/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/browser-extension/README.md","title":"browser-extension Documentation","category":"plugin-manifest","format":"markdown","content":"# browser-extension Documentation\n\nPath: `tools/browser-extension/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/browser-extension/README.md)","tokens":300,"sizeBytes":195},{"name":"README.md","path":"tools/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/README.md","title":"tools Documentation","category":"plugin-manifest","format":"markdown","content":"# tools Documentation\n\nPath: `tools/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/README.md)","tokens":300,"sizeBytes":147},{"name":"README.md","path":"tools/src/aden_tools/tools/account_info_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/account_info_tool/README.md","title":"account_info_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# account_info_tool Documentation\n\nPath: `tools/src/aden_tools/tools/account_info_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/account_info_tool/README.md)","tokens":300,"sizeBytes":237},{"name":"README.md","path":"tools/src/aden_tools/tools/airtable_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/airtable_tool/README.md","title":"airtable_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# airtable_tool Documentation\n\nPath: `tools/src/aden_tools/tools/airtable_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/airtable_tool/README.md)","tokens":300,"sizeBytes":225},{"name":"README.md","path":"tools/src/aden_tools/tools/apify_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/apify_tool/README.md","title":"apify_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# apify_tool Documentation\n\nPath: `tools/src/aden_tools/tools/apify_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/apify_tool/README.md)","tokens":300,"sizeBytes":216},{"name":"README.md","path":"tools/src/aden_tools/tools/apollo_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/apollo_tool/README.md","title":"apollo_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# apollo_tool Documentation\n\nPath: `tools/src/aden_tools/tools/apollo_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/apollo_tool/README.md)","tokens":300,"sizeBytes":219},{"name":"README.md","path":"tools/src/aden_tools/tools/arxiv_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/arxiv_tool/README.md","title":"arxiv_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# arxiv_tool Documentation\n\nPath: `tools/src/aden_tools/tools/arxiv_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/arxiv_tool/README.md)","tokens":300,"sizeBytes":216},{"name":"README.md","path":"tools/src/aden_tools/tools/asana_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/asana_tool/README.md","title":"asana_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# asana_tool Documentation\n\nPath: `tools/src/aden_tools/tools/asana_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/asana_tool/README.md)","tokens":300,"sizeBytes":216},{"name":"README.md","path":"tools/src/aden_tools/tools/attio_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/attio_tool/README.md","title":"attio_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# attio_tool Documentation\n\nPath: `tools/src/aden_tools/tools/attio_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/attio_tool/README.md)","tokens":300,"sizeBytes":216},{"name":"README.md","path":"tools/src/aden_tools/tools/aws_s3_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/aws_s3_tool/README.md","title":"aws_s3_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# aws_s3_tool Documentation\n\nPath: `tools/src/aden_tools/tools/aws_s3_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/aws_s3_tool/README.md)","tokens":300,"sizeBytes":219},{"name":"README.md","path":"tools/src/aden_tools/tools/azure_sql_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/azure_sql_tool/README.md","title":"azure_sql_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# azure_sql_tool Documentation\n\nPath: `tools/src/aden_tools/tools/azure_sql_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/azure_sql_tool/README.md)","tokens":300,"sizeBytes":228},{"name":"README.md","path":"tools/src/aden_tools/tools/bigquery_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/bigquery_tool/README.md","title":"bigquery_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# bigquery_tool Documentation\n\nPath: `tools/src/aden_tools/tools/bigquery_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/bigquery_tool/README.md)","tokens":300,"sizeBytes":225},{"name":"README.md","path":"tools/src/aden_tools/tools/brevo_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/brevo_tool/README.md","title":"brevo_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# brevo_tool Documentation\n\nPath: `tools/src/aden_tools/tools/brevo_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/brevo_tool/README.md)","tokens":300,"sizeBytes":216},{"name":"README.md","path":"tools/src/aden_tools/tools/calcom_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/calcom_tool/README.md","title":"calcom_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# calcom_tool Documentation\n\nPath: `tools/src/aden_tools/tools/calcom_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/calcom_tool/README.md)","tokens":300,"sizeBytes":219},{"name":"README.md","path":"tools/src/aden_tools/tools/calendar_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/calendar_tool/README.md","title":"calendar_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# calendar_tool Documentation\n\nPath: `tools/src/aden_tools/tools/calendar_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/calendar_tool/README.md)","tokens":300,"sizeBytes":225},{"name":"README.md","path":"tools/src/aden_tools/tools/calendly_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/calendly_tool/README.md","title":"calendly_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# calendly_tool Documentation\n\nPath: `tools/src/aden_tools/tools/calendly_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/calendly_tool/README.md)","tokens":300,"sizeBytes":225},{"name":"README.md","path":"tools/src/aden_tools/tools/cloudflare_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/cloudflare_tool/README.md","title":"cloudflare_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# cloudflare_tool Documentation\n\nPath: `tools/src/aden_tools/tools/cloudflare_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/cloudflare_tool/README.md)","tokens":300,"sizeBytes":231},{"name":"README.md","path":"tools/src/aden_tools/tools/cloudinary_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/cloudinary_tool/README.md","title":"cloudinary_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# cloudinary_tool Documentation\n\nPath: `tools/src/aden_tools/tools/cloudinary_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/cloudinary_tool/README.md)","tokens":300,"sizeBytes":231},{"name":"README.md","path":"tools/src/aden_tools/tools/confluence_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/confluence_tool/README.md","title":"confluence_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# confluence_tool Documentation\n\nPath: `tools/src/aden_tools/tools/confluence_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/confluence_tool/README.md)","tokens":300,"sizeBytes":231},{"name":"README.md","path":"tools/src/aden_tools/tools/csv_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/csv_tool/README.md","title":"csv_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# csv_tool Documentation\n\nPath: `tools/src/aden_tools/tools/csv_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/csv_tool/README.md)","tokens":300,"sizeBytes":210},{"name":"README.md","path":"tools/src/aden_tools/tools/databricks_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/databricks_tool/README.md","title":"databricks_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# databricks_tool Documentation\n\nPath: `tools/src/aden_tools/tools/databricks_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/databricks_tool/README.md)","tokens":300,"sizeBytes":231},{"name":"README.md","path":"tools/src/aden_tools/tools/discord_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/discord_tool/README.md","title":"discord_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# discord_tool Documentation\n\nPath: `tools/src/aden_tools/tools/discord_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/discord_tool/README.md)","tokens":300,"sizeBytes":222},{"name":"README.md","path":"tools/src/aden_tools/tools/dns_security_scanner/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/dns_security_scanner/README.md","title":"dns_security_scanner Documentation","category":"plugin-manifest","format":"markdown","content":"# dns_security_scanner Documentation\n\nPath: `tools/src/aden_tools/tools/dns_security_scanner/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/dns_security_scanner/README.md)","tokens":300,"sizeBytes":246},{"name":"README.md","path":"tools/src/aden_tools/tools/docker_hub_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/docker_hub_tool/README.md","title":"docker_hub_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# docker_hub_tool Documentation\n\nPath: `tools/src/aden_tools/tools/docker_hub_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/docker_hub_tool/README.md)","tokens":300,"sizeBytes":231},{"name":"README.md","path":"tools/src/aden_tools/tools/duckduckgo_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/duckduckgo_tool/README.md","title":"duckduckgo_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# duckduckgo_tool Documentation\n\nPath: `tools/src/aden_tools/tools/duckduckgo_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/duckduckgo_tool/README.md)","tokens":300,"sizeBytes":231},{"name":"README.md","path":"tools/src/aden_tools/tools/email_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/email_tool/README.md","title":"email_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# email_tool Documentation\n\nPath: `tools/src/aden_tools/tools/email_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/email_tool/README.md)","tokens":300,"sizeBytes":216},{"name":"README.md","path":"tools/src/aden_tools/tools/exa_search_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/exa_search_tool/README.md","title":"exa_search_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# exa_search_tool Documentation\n\nPath: `tools/src/aden_tools/tools/exa_search_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/exa_search_tool/README.md)","tokens":300,"sizeBytes":231},{"name":"README.md","path":"tools/src/aden_tools/tools/excel_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/excel_tool/README.md","title":"excel_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# excel_tool Documentation\n\nPath: `tools/src/aden_tools/tools/excel_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/excel_tool/README.md)","tokens":300,"sizeBytes":216},{"name":"README.md","path":"tools/src/aden_tools/tools/file_system_toolkits/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/file_system_toolkits/README.md","title":"file_system_toolkits Documentation","category":"plugin-manifest","format":"markdown","content":"# file_system_toolkits Documentation\n\nPath: `tools/src/aden_tools/tools/file_system_toolkits/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/file_system_toolkits/README.md)","tokens":300,"sizeBytes":246},{"name":"README.md","path":"tools/src/aden_tools/tools/freshdesk_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/freshdesk_tool/README.md","title":"freshdesk_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# freshdesk_tool Documentation\n\nPath: `tools/src/aden_tools/tools/freshdesk_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/freshdesk_tool/README.md)","tokens":300,"sizeBytes":228},{"name":"README.md","path":"tools/src/aden_tools/tools/github_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/github_tool/README.md","title":"github_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# github_tool Documentation\n\nPath: `tools/src/aden_tools/tools/github_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/github_tool/README.md)","tokens":300,"sizeBytes":219},{"name":"README.md","path":"tools/src/aden_tools/tools/gitlab_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/gitlab_tool/README.md","title":"gitlab_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# gitlab_tool Documentation\n\nPath: `tools/src/aden_tools/tools/gitlab_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/gitlab_tool/README.md)","tokens":300,"sizeBytes":219},{"name":"README.md","path":"tools/src/aden_tools/tools/gmail_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/gmail_tool/README.md","title":"gmail_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# gmail_tool Documentation\n\nPath: `tools/src/aden_tools/tools/gmail_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/gmail_tool/README.md)","tokens":300,"sizeBytes":216},{"name":"README.md","path":"tools/src/aden_tools/tools/google_analytics_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/google_analytics_tool/README.md","title":"google_analytics_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# google_analytics_tool Documentation\n\nPath: `tools/src/aden_tools/tools/google_analytics_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/google_analytics_tool/README.md)","tokens":300,"sizeBytes":249},{"name":"README.md","path":"tools/src/aden_tools/tools/google_docs_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/google_docs_tool/README.md","title":"google_docs_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# google_docs_tool Documentation\n\nPath: `tools/src/aden_tools/tools/google_docs_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/google_docs_tool/README.md)","tokens":300,"sizeBytes":234},{"name":"README.md","path":"tools/src/aden_tools/tools/google_maps_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/google_maps_tool/README.md","title":"google_maps_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# google_maps_tool Documentation\n\nPath: `tools/src/aden_tools/tools/google_maps_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/google_maps_tool/README.md)","tokens":300,"sizeBytes":234},{"name":"README.md","path":"tools/src/aden_tools/tools/google_search_console_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/google_search_console_tool/README.md","title":"google_search_console_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# google_search_console_tool Documentation\n\nPath: `tools/src/aden_tools/tools/google_search_console_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/google_search_console_tool/README.md)","tokens":300,"sizeBytes":264},{"name":"README.md","path":"tools/src/aden_tools/tools/google_sheets_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/google_sheets_tool/README.md","title":"google_sheets_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# google_sheets_tool Documentation\n\nPath: `tools/src/aden_tools/tools/google_sheets_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/google_sheets_tool/README.md)","tokens":300,"sizeBytes":240},{"name":"README.md","path":"tools/src/aden_tools/tools/greenhouse_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/greenhouse_tool/README.md","title":"greenhouse_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# greenhouse_tool Documentation\n\nPath: `tools/src/aden_tools/tools/greenhouse_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/greenhouse_tool/README.md)","tokens":300,"sizeBytes":231},{"name":"README.md","path":"tools/src/aden_tools/tools/http_headers_scanner/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/http_headers_scanner/README.md","title":"http_headers_scanner Documentation","category":"plugin-manifest","format":"markdown","content":"# http_headers_scanner Documentation\n\nPath: `tools/src/aden_tools/tools/http_headers_scanner/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/http_headers_scanner/README.md)","tokens":300,"sizeBytes":246},{"name":"README.md","path":"tools/src/aden_tools/tools/hubspot_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/hubspot_tool/README.md","title":"hubspot_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# hubspot_tool Documentation\n\nPath: `tools/src/aden_tools/tools/hubspot_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/hubspot_tool/README.md)","tokens":300,"sizeBytes":222},{"name":"README.md","path":"tools/src/aden_tools/tools/huggingface_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/huggingface_tool/README.md","title":"huggingface_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# huggingface_tool Documentation\n\nPath: `tools/src/aden_tools/tools/huggingface_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/huggingface_tool/README.md)","tokens":300,"sizeBytes":234},{"name":"README.md","path":"tools/src/aden_tools/tools/intercom_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/intercom_tool/README.md","title":"intercom_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# intercom_tool Documentation\n\nPath: `tools/src/aden_tools/tools/intercom_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/intercom_tool/README.md)","tokens":300,"sizeBytes":225},{"name":"README.md","path":"tools/src/aden_tools/tools/jira_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/jira_tool/README.md","title":"jira_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# jira_tool Documentation\n\nPath: `tools/src/aden_tools/tools/jira_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/jira_tool/README.md)","tokens":300,"sizeBytes":213},{"name":"README.md","path":"tools/src/aden_tools/tools/kafka_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/kafka_tool/README.md","title":"kafka_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# kafka_tool Documentation\n\nPath: `tools/src/aden_tools/tools/kafka_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/kafka_tool/README.md)","tokens":300,"sizeBytes":216},{"name":"README.md","path":"tools/src/aden_tools/tools/langfuse_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/langfuse_tool/README.md","title":"langfuse_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# langfuse_tool Documentation\n\nPath: `tools/src/aden_tools/tools/langfuse_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/langfuse_tool/README.md)","tokens":300,"sizeBytes":225},{"name":"README.md","path":"tools/src/aden_tools/tools/linear_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/linear_tool/README.md","title":"linear_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# linear_tool Documentation\n\nPath: `tools/src/aden_tools/tools/linear_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/linear_tool/README.md)","tokens":300,"sizeBytes":219},{"name":"README.md","path":"tools/src/aden_tools/tools/lusha_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/lusha_tool/README.md","title":"lusha_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# lusha_tool Documentation\n\nPath: `tools/src/aden_tools/tools/lusha_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/lusha_tool/README.md)","tokens":300,"sizeBytes":216},{"name":"README.md","path":"tools/src/aden_tools/tools/microsoft_graph_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/microsoft_graph_tool/README.md","title":"microsoft_graph_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# microsoft_graph_tool Documentation\n\nPath: `tools/src/aden_tools/tools/microsoft_graph_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/microsoft_graph_tool/README.md)","tokens":300,"sizeBytes":246},{"name":"README.md","path":"tools/src/aden_tools/tools/mongodb_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/mongodb_tool/README.md","title":"mongodb_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# mongodb_tool Documentation\n\nPath: `tools/src/aden_tools/tools/mongodb_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/mongodb_tool/README.md)","tokens":300,"sizeBytes":222},{"name":"README.md","path":"tools/src/aden_tools/tools/mssql_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/mssql_tool/README.md","title":"mssql_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# mssql_tool Documentation\n\nPath: `tools/src/aden_tools/tools/mssql_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/mssql_tool/README.md)","tokens":300,"sizeBytes":216},{"name":"README.md","path":"tools/src/aden_tools/tools/n8n_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/n8n_tool/README.md","title":"n8n_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# n8n_tool Documentation\n\nPath: `tools/src/aden_tools/tools/n8n_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/n8n_tool/README.md)","tokens":300,"sizeBytes":210},{"name":"README.md","path":"tools/src/aden_tools/tools/news_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/news_tool/README.md","title":"news_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# news_tool Documentation\n\nPath: `tools/src/aden_tools/tools/news_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/news_tool/README.md)","tokens":300,"sizeBytes":213},{"name":"README.md","path":"tools/src/aden_tools/tools/notion_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/notion_tool/README.md","title":"notion_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# notion_tool Documentation\n\nPath: `tools/src/aden_tools/tools/notion_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/notion_tool/README.md)","tokens":300,"sizeBytes":219},{"name":"README.md","path":"tools/src/aden_tools/tools/obsidian_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/obsidian_tool/README.md","title":"obsidian_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# obsidian_tool Documentation\n\nPath: `tools/src/aden_tools/tools/obsidian_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/obsidian_tool/README.md)","tokens":300,"sizeBytes":225},{"name":"README.md","path":"tools/src/aden_tools/tools/openmeteo_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/openmeteo_tool/README.md","title":"openmeteo_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# openmeteo_tool Documentation\n\nPath: `tools/src/aden_tools/tools/openmeteo_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/openmeteo_tool/README.md)","tokens":300,"sizeBytes":228},{"name":"README.md","path":"tools/src/aden_tools/tools/pagerduty_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/pagerduty_tool/README.md","title":"pagerduty_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# pagerduty_tool Documentation\n\nPath: `tools/src/aden_tools/tools/pagerduty_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/pagerduty_tool/README.md)","tokens":300,"sizeBytes":228},{"name":"README.md","path":"tools/src/aden_tools/tools/pdf_read_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/pdf_read_tool/README.md","title":"pdf_read_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# pdf_read_tool Documentation\n\nPath: `tools/src/aden_tools/tools/pdf_read_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/pdf_read_tool/README.md)","tokens":300,"sizeBytes":225},{"name":"README.md","path":"tools/src/aden_tools/tools/pinecone_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/pinecone_tool/README.md","title":"pinecone_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# pinecone_tool Documentation\n\nPath: `tools/src/aden_tools/tools/pinecone_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/pinecone_tool/README.md)","tokens":300,"sizeBytes":225},{"name":"README.md","path":"tools/src/aden_tools/tools/pipedrive_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/pipedrive_tool/README.md","title":"pipedrive_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# pipedrive_tool Documentation\n\nPath: `tools/src/aden_tools/tools/pipedrive_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/pipedrive_tool/README.md)","tokens":300,"sizeBytes":228},{"name":"README.md","path":"tools/src/aden_tools/tools/plaid_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/plaid_tool/README.md","title":"plaid_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# plaid_tool Documentation\n\nPath: `tools/src/aden_tools/tools/plaid_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/plaid_tool/README.md)","tokens":300,"sizeBytes":216},{"name":"README.md","path":"tools/src/aden_tools/tools/port_scanner/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/port_scanner/README.md","title":"port_scanner Documentation","category":"plugin-manifest","format":"markdown","content":"# port_scanner Documentation\n\nPath: `tools/src/aden_tools/tools/port_scanner/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/port_scanner/README.md)","tokens":300,"sizeBytes":222},{"name":"README.md","path":"tools/src/aden_tools/tools/postgres_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/postgres_tool/README.md","title":"postgres_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# postgres_tool Documentation\n\nPath: `tools/src/aden_tools/tools/postgres_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/postgres_tool/README.md)","tokens":300,"sizeBytes":225},{"name":"README.md","path":"tools/src/aden_tools/tools/powerbi_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/powerbi_tool/README.md","title":"powerbi_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# powerbi_tool Documentation\n\nPath: `tools/src/aden_tools/tools/powerbi_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/powerbi_tool/README.md)","tokens":300,"sizeBytes":222},{"name":"README.md","path":"tools/src/aden_tools/tools/prometheus_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/prometheus_tool/README.md","title":"prometheus_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# prometheus_tool Documentation\n\nPath: `tools/src/aden_tools/tools/prometheus_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/prometheus_tool/README.md)","tokens":300,"sizeBytes":231},{"name":"README.md","path":"tools/src/aden_tools/tools/pushover_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/pushover_tool/README.md","title":"pushover_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# pushover_tool Documentation\n\nPath: `tools/src/aden_tools/tools/pushover_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/pushover_tool/README.md)","tokens":300,"sizeBytes":225},{"name":"README.md","path":"tools/src/aden_tools/tools/quickbooks_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/quickbooks_tool/README.md","title":"quickbooks_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# quickbooks_tool Documentation\n\nPath: `tools/src/aden_tools/tools/quickbooks_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/quickbooks_tool/README.md)","tokens":300,"sizeBytes":231},{"name":"README.md","path":"tools/src/aden_tools/tools/razorpay_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/razorpay_tool/README.md","title":"razorpay_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# razorpay_tool Documentation\n\nPath: `tools/src/aden_tools/tools/razorpay_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/razorpay_tool/README.md)","tokens":300,"sizeBytes":225},{"name":"README.md","path":"tools/src/aden_tools/tools/reddit_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/reddit_tool/README.md","title":"reddit_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# reddit_tool Documentation\n\nPath: `tools/src/aden_tools/tools/reddit_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/reddit_tool/README.md)","tokens":300,"sizeBytes":219},{"name":"README.md","path":"tools/src/aden_tools/tools/redis_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/redis_tool/README.md","title":"redis_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# redis_tool Documentation\n\nPath: `tools/src/aden_tools/tools/redis_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/redis_tool/README.md)","tokens":300,"sizeBytes":216},{"name":"README.md","path":"tools/src/aden_tools/tools/redshift_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/redshift_tool/README.md","title":"redshift_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# redshift_tool Documentation\n\nPath: `tools/src/aden_tools/tools/redshift_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/redshift_tool/README.md)","tokens":300,"sizeBytes":225},{"name":"README.md","path":"tools/src/aden_tools/tools/risk_scorer/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/risk_scorer/README.md","title":"risk_scorer Documentation","category":"plugin-manifest","format":"markdown","content":"# risk_scorer Documentation\n\nPath: `tools/src/aden_tools/tools/risk_scorer/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/risk_scorer/README.md)","tokens":300,"sizeBytes":219},{"name":"README.md","path":"tools/src/aden_tools/tools/salesforce_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/salesforce_tool/README.md","title":"salesforce_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# salesforce_tool Documentation\n\nPath: `tools/src/aden_tools/tools/salesforce_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/salesforce_tool/README.md)","tokens":300,"sizeBytes":231},{"name":"README.md","path":"tools/src/aden_tools/tools/sap_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/sap_tool/README.md","title":"sap_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# sap_tool Documentation\n\nPath: `tools/src/aden_tools/tools/sap_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/sap_tool/README.md)","tokens":300,"sizeBytes":210},{"name":"README.md","path":"tools/src/aden_tools/tools/serpapi_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/serpapi_tool/README.md","title":"serpapi_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# serpapi_tool Documentation\n\nPath: `tools/src/aden_tools/tools/serpapi_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/serpapi_tool/README.md)","tokens":300,"sizeBytes":222},{"name":"README.md","path":"tools/src/aden_tools/tools/shopify_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/shopify_tool/README.md","title":"shopify_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# shopify_tool Documentation\n\nPath: `tools/src/aden_tools/tools/shopify_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/shopify_tool/README.md)","tokens":300,"sizeBytes":222},{"name":"README.md","path":"tools/src/aden_tools/tools/similarweb_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/similarweb_tool/README.md","title":"similarweb_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# similarweb_tool Documentation\n\nPath: `tools/src/aden_tools/tools/similarweb_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/similarweb_tool/README.md)","tokens":300,"sizeBytes":231},{"name":"README.md","path":"tools/src/aden_tools/tools/slack_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/slack_tool/README.md","title":"slack_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# slack_tool Documentation\n\nPath: `tools/src/aden_tools/tools/slack_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/slack_tool/README.md)","tokens":300,"sizeBytes":216},{"name":"README.md","path":"tools/src/aden_tools/tools/snowflake_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/snowflake_tool/README.md","title":"snowflake_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# snowflake_tool Documentation\n\nPath: `tools/src/aden_tools/tools/snowflake_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/snowflake_tool/README.md)","tokens":300,"sizeBytes":228},{"name":"README.md","path":"tools/src/aden_tools/tools/ssl_tls_scanner/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/ssl_tls_scanner/README.md","title":"ssl_tls_scanner Documentation","category":"plugin-manifest","format":"markdown","content":"# ssl_tls_scanner Documentation\n\nPath: `tools/src/aden_tools/tools/ssl_tls_scanner/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/ssl_tls_scanner/README.md)","tokens":300,"sizeBytes":231},{"name":"README.md","path":"tools/src/aden_tools/tools/stripe_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/stripe_tool/README.md","title":"stripe_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# stripe_tool Documentation\n\nPath: `tools/src/aden_tools/tools/stripe_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/stripe_tool/README.md)","tokens":300,"sizeBytes":219},{"name":"README.md","path":"tools/src/aden_tools/tools/subdomain_enumerator/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/subdomain_enumerator/README.md","title":"subdomain_enumerator Documentation","category":"plugin-manifest","format":"markdown","content":"# subdomain_enumerator Documentation\n\nPath: `tools/src/aden_tools/tools/subdomain_enumerator/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/subdomain_enumerator/README.md)","tokens":300,"sizeBytes":246},{"name":"README.md","path":"tools/src/aden_tools/tools/supabase_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/supabase_tool/README.md","title":"supabase_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# supabase_tool Documentation\n\nPath: `tools/src/aden_tools/tools/supabase_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/supabase_tool/README.md)","tokens":300,"sizeBytes":225},{"name":"README.md","path":"tools/src/aden_tools/tools/tech_stack_detector/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/tech_stack_detector/README.md","title":"tech_stack_detector Documentation","category":"plugin-manifest","format":"markdown","content":"# tech_stack_detector Documentation\n\nPath: `tools/src/aden_tools/tools/tech_stack_detector/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/tech_stack_detector/README.md)","tokens":300,"sizeBytes":243},{"name":"README.md","path":"tools/src/aden_tools/tools/telegram_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/telegram_tool/README.md","title":"telegram_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# telegram_tool Documentation\n\nPath: `tools/src/aden_tools/tools/telegram_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/telegram_tool/README.md)","tokens":300,"sizeBytes":225},{"name":"README.md","path":"tools/src/aden_tools/tools/terraform_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/terraform_tool/README.md","title":"terraform_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# terraform_tool Documentation\n\nPath: `tools/src/aden_tools/tools/terraform_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/terraform_tool/README.md)","tokens":300,"sizeBytes":228},{"name":"README.md","path":"tools/src/aden_tools/tools/time_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/time_tool/README.md","title":"time_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# time_tool Documentation\n\nPath: `tools/src/aden_tools/tools/time_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/time_tool/README.md)","tokens":300,"sizeBytes":213},{"name":"README.md","path":"tools/src/aden_tools/tools/tines_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/tines_tool/README.md","title":"tines_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# tines_tool Documentation\n\nPath: `tools/src/aden_tools/tools/tines_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/tines_tool/README.md)","tokens":300,"sizeBytes":216},{"name":"README.md","path":"tools/src/aden_tools/tools/trello_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/trello_tool/README.md","title":"trello_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# trello_tool Documentation\n\nPath: `tools/src/aden_tools/tools/trello_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/trello_tool/README.md)","tokens":300,"sizeBytes":219},{"name":"README.md","path":"tools/src/aden_tools/tools/twilio_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/twilio_tool/README.md","title":"twilio_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# twilio_tool Documentation\n\nPath: `tools/src/aden_tools/tools/twilio_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/twilio_tool/README.md)","tokens":300,"sizeBytes":219},{"name":"README.md","path":"tools/src/aden_tools/tools/twitter_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/twitter_tool/README.md","title":"twitter_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# twitter_tool Documentation\n\nPath: `tools/src/aden_tools/tools/twitter_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/twitter_tool/README.md)","tokens":300,"sizeBytes":222},{"name":"README.md","path":"tools/src/aden_tools/tools/vercel_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/vercel_tool/README.md","title":"vercel_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# vercel_tool Documentation\n\nPath: `tools/src/aden_tools/tools/vercel_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/vercel_tool/README.md)","tokens":300,"sizeBytes":219},{"name":"README.md","path":"tools/src/aden_tools/tools/vision_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/vision_tool/README.md","title":"vision_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# vision_tool Documentation\n\nPath: `tools/src/aden_tools/tools/vision_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/vision_tool/README.md)","tokens":300,"sizeBytes":219},{"name":"README.md","path":"tools/src/aden_tools/tools/wandb_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/wandb_tool/README.md","title":"wandb_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# wandb_tool Documentation\n\nPath: `tools/src/aden_tools/tools/wandb_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/wandb_tool/README.md)","tokens":300,"sizeBytes":216},{"name":"README.md","path":"tools/src/aden_tools/tools/web_scrape_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/web_scrape_tool/README.md","title":"web_scrape_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# web_scrape_tool Documentation\n\nPath: `tools/src/aden_tools/tools/web_scrape_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/web_scrape_tool/README.md)","tokens":300,"sizeBytes":231},{"name":"README.md","path":"tools/src/aden_tools/tools/web_search_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/web_search_tool/README.md","title":"web_search_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# web_search_tool Documentation\n\nPath: `tools/src/aden_tools/tools/web_search_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/web_search_tool/README.md)","tokens":300,"sizeBytes":231},{"name":"README.md","path":"tools/src/aden_tools/tools/wikipedia_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/wikipedia_tool/README.md","title":"wikipedia_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# wikipedia_tool Documentation\n\nPath: `tools/src/aden_tools/tools/wikipedia_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/wikipedia_tool/README.md)","tokens":300,"sizeBytes":228},{"name":"README.md","path":"tools/src/aden_tools/tools/yahoo_finance_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/yahoo_finance_tool/README.md","title":"yahoo_finance_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# yahoo_finance_tool Documentation\n\nPath: `tools/src/aden_tools/tools/yahoo_finance_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/yahoo_finance_tool/README.md)","tokens":300,"sizeBytes":240},{"name":"README.md","path":"tools/src/aden_tools/tools/youtube_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/youtube_tool/README.md","title":"youtube_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# youtube_tool Documentation\n\nPath: `tools/src/aden_tools/tools/youtube_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/youtube_tool/README.md)","tokens":300,"sizeBytes":222},{"name":"README.md","path":"tools/src/aden_tools/tools/youtube_transcript_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/youtube_transcript_tool/README.md","title":"youtube_transcript_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# youtube_transcript_tool Documentation\n\nPath: `tools/src/aden_tools/tools/youtube_transcript_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/youtube_transcript_tool/README.md)","tokens":300,"sizeBytes":255},{"name":"README.md","path":"tools/src/aden_tools/tools/zendesk_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/zendesk_tool/README.md","title":"zendesk_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# zendesk_tool Documentation\n\nPath: `tools/src/aden_tools/tools/zendesk_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/zendesk_tool/README.md)","tokens":300,"sizeBytes":222},{"name":"README.md","path":"tools/src/aden_tools/tools/zoho_crm_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/zoho_crm_tool/README.md","title":"zoho_crm_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# zoho_crm_tool Documentation\n\nPath: `tools/src/aden_tools/tools/zoho_crm_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/zoho_crm_tool/README.md)","tokens":300,"sizeBytes":225},{"name":"README.md","path":"tools/src/aden_tools/tools/zoom_tool/README.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/zoom_tool/README.md","title":"zoom_tool Documentation","category":"plugin-manifest","format":"markdown","content":"# zoom_tool Documentation\n\nPath: `tools/src/aden_tools/tools/zoom_tool/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/src/aden_tools/tools/zoom_tool/README.md)","tokens":300,"sizeBytes":213},{"name":"anti_patterns.md","path":"core/framework/agents/queen/reference/anti_patterns.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/reference/anti_patterns.md","title":"Subagent: anti_patterns","category":"subagent-persona","format":"markdown","content":"# Subagent: anti_patterns\n\nPath: `core/framework/agents/queen/reference/anti_patterns.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/reference/anti_patterns.md)","tokens":300,"sizeBytes":229},{"name":"file_templates_declarative.md","path":"core/framework/agents/queen/reference/file_templates_declarative.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/reference/file_templates_declarative.md","title":"Subagent: file_templates_declarative","category":"subagent-persona","format":"markdown","content":"# Subagent: file_templates_declarative\n\nPath: `core/framework/agents/queen/reference/file_templates_declarative.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/reference/file_templates_declarative.md)","tokens":300,"sizeBytes":268},{"name":"file_templates.md","path":"core/framework/agents/queen/reference/file_templates.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/reference/file_templates.md","title":"Subagent: file_templates","category":"subagent-persona","format":"markdown","content":"# Subagent: file_templates\n\nPath: `core/framework/agents/queen/reference/file_templates.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/reference/file_templates.md)","tokens":300,"sizeBytes":232},{"name":"framework_guide.md","path":"core/framework/agents/queen/reference/framework_guide.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/reference/framework_guide.md","title":"Subagent: framework_guide","category":"subagent-persona","format":"markdown","content":"# Subagent: framework_guide\n\nPath: `core/framework/agents/queen/reference/framework_guide.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/reference/framework_guide.md)","tokens":300,"sizeBytes":235},{"name":"gcu_guide.md","path":"core/framework/agents/queen/reference/gcu_guide.md","rawUrl":"https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/reference/gcu_guide.md","title":"Subagent: gcu_guide","category":"subagent-persona","format":"markdown","content":"# Subagent: gcu_guide\n\nPath: `core/framework/agents/queen/reference/gcu_guide.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/reference/gcu_guide.md)","tokens":300,"sizeBytes":217}],"systemPromptSnippet":"<yakaai_skills repo=\"aden-hive/hive\">\n<!-- File: AGENTS.md (Tokens: ~300 | Category: root-instruction) -->\n# AI Agent Protocol & Instructions\n\nPath: `AGENTS.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/AGENTS.md)\n\n<!-- File: .claude/skills/browser-edge-cases/registry.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Browser-edge-cases Skill\n\nPath: `.claude/skills/browser-edge-cases/registry.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/.claude/skills/browser-edge-cases/registry.md)\n\n<!-- File: .claude/skills/browser-edge-cases/SKILL.md (Tokens: ~1622 | Category: anthropic-skill) -->\n---\nname: browser-edge-cases\ndescription: SOP for debugging browser automation failures on complex websites. Use when browser tools fail on specific sites like LinkedIn, Twitter/X, SPAs, or sites with Shadow DOM.\nlicense: MIT\n---\n\n# Browser Tool Edge Cases\n\nStandard Operating Procedure for debugging and fixing browser automation failures on complex websites.\n\n## When to Use This Skill\n\n- `browser_interact(action=\"scroll\")` succeeds but page doesn't move\n- `browser_interact(action=\"left_click\")` succeeds but no action triggered\n- `browser_interact(action=\"type\")` text disappears or doesn't work\n- `browser_snapshot` hangs or returns stale content\n- `browser_navigate` loads wrong content\n\n## SOP: Debugging Browser Tool Failures\n\n### Phase 1: Reproduce & Isolate\n\n```\n1. Create minimal test case demonstrating failure\n2. Test against simple site (example.com) to verify tool works\n3. Test against problematic site to confirm issue\n```\n\n**Quick isolation test:**\n```python\n# Test 1: Does the tool work at all?\nawait browser_navigate(tab_id, \"https://example.com\")\nresult = await browser_interact(action=\"scroll\", tab_id=tab_id, scroll_direction=\"down\", scroll_amount=100)\n# Should work on simple sites\n\n# Test 2: Does it fail on the problematic site?\nawait browser_navigate(tab_id, \"https://linkedin.com/feed\")\nresult = await browser_interact(action=\"scroll\", tab_id=tab_id, scroll_direction=\"down\", scroll_amount=100)\n# If this fails but example.com works → site-specific edge case\n```\n\n### Phase 2: Analyze Root Cause\n\n**Step 2a: Check console for errors**\n```python\nconsole = await browser_console(tab_id)\n# Look for: CSP violations, React errors, JavaScript exceptions\n```\n\n**Step 2b: Inspect DOM structure**\n```python\nhtml = await browser_html(tab_id)\nsnapshot = await browser_snapshot(tab_id)\n# Look for:\n# - Nested scrollable divs (overflow: scroll/auto)\n# - Shadow DOM roots\n# - iframes\n# - Custom widgets\n```\n\n**Step 2c: Identify the pattern**\n\n| Symptom | Likely Cause | Check |\n|---------|--------------|-------|\n| Scroll doesn't move | Nested scroll container | Look for `overflow: scroll` divs |\n| Click no effect | Element covered | Check `getBoundingClientRect` vs viewport |\n| Type clears | Autocomplete/React | Check for event listeners on input; try a `type` action with no selector |\n| Snapshot hangs | Huge DOM | Check node count in snapshot |\n| Snapshot stale | SPA hydration | Wait after navigation |\n\n### Phase 3: Implement Multi-Layer Fix\n\n**Pattern: Always have fallbacks**\n\n```python\nasync def robust_operation(tab_id):\n    # Method 1: Primary approach\n    try:\n        result = await primary_method(tab_id)\n        if verify_success(result):\n            return result\n    except Exception:\n        pass\n\n    # Method 2: CDP fallback\n    try:\n        result = await cdp_fallback(tab_id)\n        if verify_success(result):\n            return result\n    except Exception:\n        pass\n\n    # Method 3: JavaScript fallback\n    return await javascript_fallback(tab_id)\n```\n\n**Pattern: Always add timeouts**\n\n```python\n# Bad - can hang forever\nresult = await browser_snapshot(tab_id)\n\n# Good - fails fast with useful error\ntry:\n    result = await browser_snapshot(tab_id, timeout_s=10.0)\nexcept asyncio.TimeoutError:\n    # Handle timeout gracefully\n    result = await fallback_snapshot(tab_id)\n```\n\n### Phase 4: Verify Fix\n\n```\n1. Run against problematic site → should work\n2. Run against simple site → should still work (regression check)\n3. Document in registry.md\n```\n\n## Pattern Library\n\n### P1: Nested Scrollable Containers\n\n**Sites:** LinkedIn, Twitter/X, any SPA with scrollable feeds\n\n**Detection:**\n```javascript\n// Find largest scrollable container\nconst candidates = [];\ndocument.querySelectorAll('*').forEach(el => {\n    const style = getComputedStyle(el);\n    if (style.overflow.includes('scroll') || style.overflow.includes('auto')) {\n        const rect = el.getBoundingClientRect();\n        if (rect.width > 100 && rect.height > 100) {\n            candidates.push({el, area: rect.width * rect.height});\n        }\n    }\n});\ncandidates.sort((a, b) => b.area - a.area);\nreturn candidates[0]?.el;\n```\n\n**Fix:** Dispatch scroll events at container's center, not viewport center.\n\n### P2: Element Covered by Overlay\n\n**Sites:** Modals, tooltips, SPAs with loading overlays\n\n**Detection:**\n```javascript\nconst rect = element.getBoundingClientRect();\nconst centerX = rect.left + rect.width / 2;\nconst centerY = rect.top + rect.height / 2;\nconst topElement = document.elementFromPoint(centerX, centerY);\nreturn topElement === element || element.contains(topElement);\n```\n\n**Fix:** Wait for overlay to disappear, or use JavaScript click.\n\n### P3: React Synthetic Events\n\n**Sites:** React SPAs, modern web apps\n\n**Detection:** If CDP click doesn't trigger handler but manual click works.\n\n**Fix:** Use JavaScript click as primary:\n```javascript\nelement.click();\n```\n\n### P4: Huge DOM / Accessibility Tree\n\n**Sites:** LinkedIn, Facebook, Twitter (feeds with 1000s of nodes)\n\n**Detection:**\n```javascript\ndocument.querySelectorAll('*').length > 5000\n```\n\n**Fix:**\n1. Add timeout to snapshot operation\n2. Truncate tree at 2000 nodes\n3. Fall back to DOM-based snapshot if accessibility tree too large\n\n### P5: SPA Hydration Delay\n\n**Sites:** React, Vue, Angular SPAs after navigation\n\n**Detection:**\n```javascript\n// Check if React app has hydrated\ndocument.querySelector('[data-reactroot]') ||\ndocument.querySelector('[data-reactid]')\n```\n\n**Fix:** Wait for specific selector after navigation:\n```python\nawait browser_navigate(tab_id, url, wait_until=\"load\")\nawait browser_interact(action=\"wait\", tab_id=tab_id, wait_for_selector='[data-testid=\"content\"]', timeout_ms=5000)\n```\n\n### P6: Shadow DOM\n\n**Sites:** Components using Shadow DOM, Lit elements\n\n**Detection:**\n```javascript\ndocument.querySelectorAll('*').some(el => el.shadowRoot)\n```\n\n**Fix:** Pierce shadow root:\n```javascript\nfunction queryShadow(selector) {\n    const parts = selector.split('>>>');\n    let node = document;\n    for (const part of parts) {\n        if (node.shadowRoot) {\n            node = node.shadowRoot.querySelector(part.trim());\n        } else {\n            node = node.querySelector(part.trim());\n        }\n    }\n    return node;\n}\n```\n\n## Quick Reference\n\n| Issue | Primary Fix | Fallback |\n|-------|-------------|----------|\n| Scroll not working | Find scrollable container | Mouse wheel at container center |\n| Click no effect | JavaScript click() | CDP mouse events |\n| Type clears | `use_insert_text=False` (per-keystroke) | Use a `type` action (Input.insertText) |\n| Snapshot hangs | Add timeout_s | DOM snapshot fallback |\n| Stale content | Wait for selector | Increase wait_until timeout |\n| Shadow DOM | Pierce selector | JavaScript traversal |\n\n## References\n\n- [registry.md](registry.md) - Full list of known edge cases\n- [scripts/test_case.py](scripts/test_case.py) - Template for testing new cases\n- [BROWSER_USE_PATTERNS.md](../../tools/BROWSER_USE_PATTERNS.md) - Implementation patterns from browser-use\n\n<!-- File: .claude/skills/triage-issue/SKILL.md (Tokens: ~1010 | Category: anthropic-skill) -->\n# Triage Issue Skill\n\nAnalyze a GitHub issue, verify claims against the codebase, and close invalid issues with a technical response.\n\n## Trigger\n\nUser provides a GitHub issue URL or number, e.g.:\n- `/triage-issue 1970`\n- `/triage-issue https://github.com/adenhq/hive/issues/1970`\n\n## Workflow\n\n### Step 1: Fetch Issue Details\n\n```bash\ngh issue view <number> --repo adenhq/hive --json title,body,state,labels,author\n```\n\nExtract:\n- Title\n- Body (the claim/bug report)\n- Current state\n- Labels\n- Author\n\nIf issue is already closed, inform user and stop.\n\n### Step 2: Analyze the Claim\n\nRead the issue body and identify:\n1. **The core claim** - What is the user asserting?\n2. **Technical specifics** - File paths, function names, code snippets mentioned\n3. **Expected behavior** - What do they think should happen?\n4. **Severity claimed** - Security issue? Bug? Feature request?\n\n### Step 3: Investigate the Codebase\n\nFor each technical claim:\n1. Find the referenced code using Grep/Glob/Read\n2. Understand the actual implementation\n3. Check if the claim accurately describes the behavior\n4. Look for related tests, documentation, or design decisions\n\n### Step 4: Evaluate Validity\n\nCategorize the issue as one of:\n\n| Category | Action |\n|----------|--------|\n| **Valid Bug** | Do NOT close. Inform user this is a real issue. |\n| **Valid Feature Request** | Do NOT close. Suggest labeling appropriately. |\n| **Misunderstanding** | Prepare technical explanation for why behavior is correct. |\n| **Fundamentally Flawed** | Prepare critique explaining the technical impossibility or design rationale. |\n| **Duplicate** | Find the original issue and prepare duplicate notice. |\n| **Incomplete** | Prepare request for more information. |\n\n### Step 5: Draft Response\n\nFor issues to be closed, draft a response that:\n\n1. **Acknowledges the concern** - Don't be dismissive\n2. **Explains the actual behavior** - With code references\n3. **Provides technical rationale** - Why it works this way\n4. **References industry standards** - If applicable\n5. **Offers alternatives** - If there's a better approach for the user\n\nUse this template:\n\n```markdown\n## Analysis\n\n[Brief summary of what was investigated]\n\n## Technical Details\n\n[Explanation with code references]\n\n## Why This Is Working As Designed\n\n[Rationale]\n\n## Recommendation\n\n[What the user should do instead, if applicable]\n\n---\n*This issue was reviewed and closed by the maintainers.*\n```\n\n### Step 6: User Review\n\nPresent the draft to the user with:\n\n```\n## Issue #<number>: <title>\n\n**Claim:** <summary of claim>\n\n**Finding:** <valid/invalid/misunderstanding/etc>\n\n**Draft Response:**\n<the markdown response>\n\n---\nDo you want me to post this comment and close the issue?\n```\n\nUse AskUserQuestion with options:\n- \"Post and close\" - Post comment, close issue\n- \"Edit response\" - Let user modify the response\n- \"Skip\" - Don't take action\n\n### Step 7: Execute Action\n\nIf user approves:\n\n```bash\n# Post comment\ngh issue comment <number> --repo adenhq/hive --body \"<response>\"\n\n# Close issue\ngh issue close <number> --repo adenhq/hive --reason \"not planned\"\n```\n\nReport success with link to the issue.\n\n## Important Guidelines\n\n1. **Never close valid issues** - If there's any merit to the claim, don't close it\n2. **Be respectful** - The reporter took time to file the issue\n3. **Be technical** - Provide code references and evidence\n4. **Be educational** - Help them understand, don't just dismiss\n5. **Check twice** - Make sure you understand the code before declaring something invalid\n6. **Consider edge cases** - Maybe their environment reveals a real issue\n\n## Example Critiques\n\n### Security Misunderstanding\n> \"The claim that secrets are exposed in plaintext misunderstands the encryption architecture. While `SecretStr` is used for logging protection, actual encryption is provided by Fernet (AES-128-CBC) at the storage layer. The code path is: serialize → encrypt → write. Only encrypted bytes touch disk.\"\n\n### Impossible Request\n> \"The requested feature would require [X] which violates [fundamental constraint]. This is not a limitation of our implementation but a fundamental property of [technology/protocol].\"\n\n### Already Handled\n> \"This scenario is already handled by [code reference]. The reporter may be using an older version or misconfigured environment.\"\n\n<!-- File: core/framework/agents/credential_tester/mcp_servers.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Credential_tester Skill\n\nPath: `core/framework/agents/credential_tester/mcp_servers.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/credential_tester/mcp_servers.json)\n\n<!-- File: core/framework/agents/queen/mcp_registry.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Queen Skill\n\nPath: `core/framework/agents/queen/mcp_registry.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/mcp_registry.json)\n\n<!-- File: core/framework/agents/queen/mcp_servers.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Queen Skill\n\nPath: `core/framework/agents/queen/mcp_servers.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/agents/queen/mcp_servers.json)\n\n<!-- File: core/framework/skills/_default_skills/colony-progress-tracker/SKILL.md (Tokens: ~1158 | Category: anthropic-skill) -->\n---\nname: hive.colony-progress-tracker\ndescription: Claim tasks, record step progress, and verify SOP gates in the colony SQLite queue. Applies when your spawn message includes a db_path field.\nmetadata:\n  author: hive\n  type: default-skill\n  visibility: [worker]\n---\n\n## Operational Protocol: Colony Progress Tracker\n\n**Applies when** your spawn message has `db_path:` and `colony_id:` fields. The DB is your durable working memory — tells you what's done, what to skip, which SOP gates you owe.\n\nAccess via `terminal_exec` running `sqlite3 \"<db_path>\" \"...\"`. Tables: `tasks` (queue), `steps` (per-task decomposition), `sop_checklist` (hard gates).\n\n### Claim: assigned task (check this FIRST)\n\nIf your spawn message includes a `task_id:` field, the queen pre-assigned a specific row to you. Claim that row by id — **do not** use the generic next-pending pattern below:\n\n```bash\nsqlite3 \"<db_path>\" <<'SQL'\nUPDATE tasks SET status='claimed', worker_id='<worker-id>',\n  claim_token=lower(hex(randomblob(8))),\n  claimed_at=datetime('now'), updated_at=datetime('now')\nWHERE id='<task_id>' AND status='pending'\nRETURNING id, goal, payload;\nSQL\n```\n\nEmpty output → another worker raced you or the row is already done. Stop and report.  Non-empty → that row is yours, proceed to \"Load the plan\".\n\n### Claim: next pending (fallback when no task_id is assigned)\n\nIf your spawn message did NOT include `task_id:` — you are a generic fan-out worker racing on a shared queue. Use the generic next-pending claim:\n\n```bash\nsqlite3 \"<db_path>\" <<'SQL'\nUPDATE tasks SET status='claimed', worker_id='<worker-id>',\n  claim_token=lower(hex(randomblob(8))),\n  claimed_at=datetime('now'), updated_at=datetime('now')\nWHERE id=(SELECT id FROM tasks WHERE status='pending'\n  ORDER BY priority DESC, seq, created_at LIMIT 1)\nRETURNING id, goal, payload;\nSQL\n```\n\nEmpty output → queue drained, exit. Otherwise the returned `id` is yours. **Never SELECT-then-UPDATE** — races.\n\n### Load the plan\n\n```bash\nsqlite3 \"<db_path>\" \"SELECT seq, id, title, status FROM steps WHERE task_id='<task-id>' ORDER BY seq;\"\nsqlite3 \"<db_path>\" \"SELECT key, description, required, done_at FROM sop_checklist WHERE task_id='<task-id>';\"\n```\n\n**Skip any step where status='done'.** That's the point — don't redo completed work.\n\n### Execute a step\n\nBefore tool calls:\n```bash\nsqlite3 \"<db_path>\" \"UPDATE steps SET status='in_progress', worker_id='<worker-id>', started_at=datetime('now') WHERE id='<step-id>';\"\n```\nAfter success (one-line evidence: path, URL, key result):\n```bash\nsqlite3 \"<db_path>\" \"UPDATE steps SET status='done', evidence='<what you did>', completed_at=datetime('now') WHERE id='<step-id>';\"\n```\n\n### MANDATORY: SOP gate check before marking task done\n\n```bash\nsqlite3 \"<db_path>\" \"SELECT key, description FROM sop_checklist WHERE task_id='<task-id>' AND required=1 AND done_at IS NULL;\"\n```\n\n- Empty → proceed to \"Mark task done\".\n- Non-empty → each row is work you still owe. Do it, then check it off:\n\n```bash\nsqlite3 \"<db_path>\" \"UPDATE sop_checklist SET done_at=datetime('now'), done_by='<worker-id>', note='<why>' WHERE task_id='<task-id>' AND key='<key>';\"\n```\n\n**Never mark a task done while this SELECT returns rows.** This gate exists specifically to stop you from declaring success while skipping required steps.\n\n### Mark task done / failed\n\n```bash\n# Success:\nsqlite3 \"<db_path>\" \"UPDATE tasks SET status='done', completed_at=datetime('now'), updated_at=datetime('now') WHERE id='<task-id>' AND worker_id='<worker-id>';\"\n\n# Unrecoverable failure:\nsqlite3 \"<db_path>\" \"UPDATE tasks SET status='failed', last_error='<one sentence>', completed_at=datetime('now'), updated_at=datetime('now') WHERE id='<task-id>' AND worker_id='<worker-id>';\"\n```\n\nThe `AND worker_id=?` guard means a reclaimed row won't accept your write — treat zero rows affected as \"your claim was revoked, stop.\"\n\n### Loop\n\nAfter done/failed → claim the next task. Exit only when claim returns empty.\n\n### Errors + debug\n\n- **\"database is locked\"**: retry with 100ms → 1s backoff, max 5 attempts. `busy_timeout=5000` handles most contention silently.\n- **Queue health**: `SELECT status, count(*) FROM tasks GROUP BY status;`\n- **Your in-flight work**: `SELECT id, goal, status FROM tasks WHERE worker_id='<worker-id>';`\n\n### Anti-patterns (will break the queue)\n\n- Don't DDL (CREATE/ALTER/DROP).\n- Don't DELETE — failed tasks stay as `failed` for audit.\n- Don't skip Protocol 4 (SOP gate) before marking done.\n- Don't hold a task >15min without updates — the stale-claim reclaimer revokes your claim.\n- Don't invent task IDs. Workers update existing rows; only the queen enqueues new ones.\n\n<!-- File: core/framework/skills/_default_skills/context-preservation/SKILL.md (Tokens: ~283 | Category: anthropic-skill) -->\n---\nname: hive.context-preservation\ndescription: Proactively extract critical values from tool results into working notes before automatic context pruning destroys them.\nmetadata:\n  author: hive\n  type: default-skill\n  visibility: [worker]\n---\n\n## Operational Protocol: Context Preservation\n\nYou operate under a finite context window. Older tool results WILL be pruned. Extract what you need while it's still in context.\n\n**Save-as-you-go.** After any tool call producing information you'll need later, immediately extract the key data into `_working_notes` or `_preserved_data`. Do not rely on referring back to old tool results — once they're pruned they're gone.\n\n**What to extract:**\n- URLs and key snippets (not full pages)\n- Relevant API fields (not raw JSON blobs)\n- Specific lines, values, or IDs (not entire files)\n- Analysis conclusions (not raw data)\n\n**Handoffs between tasks** happen through `progress.db`, not through shared-buffer handoff blobs. When you finish a task, any state the next worker needs goes into the task row itself (`steps.evidence`, `tasks.last_error`, `sop_checklist.note`) — see `hive.colony-progress-tracker`. Use `_working_notes` for things the DB schema doesn't cover.\n\nYou will receive an alert when context reaches {{warn_at_usage_ratio_pct}}% — preserve immediately.\n\n<!-- File: core/framework/skills/_default_skills/error-recovery/SKILL.md (Tokens: ~328 | Category: anthropic-skill) -->\n---\nname: hive.error-recovery\ndescription: Follow a structured recovery decision tree when tool calls fail instead of blindly retrying or giving up.\nmetadata:\n  author: hive\n  type: default-skill\n  visibility: [worker]\n---\n\n## Operational Protocol: Error Recovery\n\nWhen a tool call fails:\n\n1. **Diagnose** — classify the failure as *transient* (network blip, rate limit, timeout) or *structural* (wrong selector, missing auth, invalid schema, permission denied).\n\n2. **Decide:**\n   - Transient → retry once.\n   - Structural + fixable → fix the input and retry.\n   - Structural + unfixable → record the failure and move to the next item.\n   - Blocking all progress → escalate.\n\n3. **Adapt** — if the same tool has failed {{max_retries_per_tool}}+ times in a row, stop using it and find an alternative approach.\n\n**Never silently drop a failed item.** If the item is a task in the colony queue, write the failure to the DB instead of an in-memory buffer:\n\n```bash\nsqlite3 \"$DB_PATH\" \"UPDATE tasks SET status='failed', last_error='<one-sentence reason>', completed_at=datetime('now'), updated_at=datetime('now') WHERE id='<task-id>' AND worker_id='<your-worker-id>';\"\n```\n\nThe `tasks.retry_count` column and the stale-claim reclaimer handle auto-retry for crashes; your job is the within-run decision tree above. See `hive.colony-progress-tracker` for the full queue protocol.\n\n<!-- File: core/framework/skills/_default_skills/note-taking/SKILL.md (Tokens: ~288 | Category: anthropic-skill) -->\n---\nname: hive.note-taking\ndescription: Maintain a free-form scratchpad of decisions, extracted values, and open questions so context pruning doesn't lose anything you still need.\nmetadata:\n  author: hive\n  type: default-skill\n  visibility: [worker]\n---\n\n## Operational Protocol: Structured Note-Taking\n\nMaintain free-form working notes in shared buffer key `_working_notes` for data that *you* need to remember but that isn't captured by the colony task queue.\n\n**Do not duplicate the queue in here.** Per-task goal, ordered steps, and SOP gates live in `progress.db` — use `hive.colony-progress-tracker` for those. These notes are for things the DB schema doesn't cover.\n\nUpdate at these checkpoints:\n\n- After receiving new information that changes how you plan to approach the current step\n- Before any tool call that will produce substantial output you'll need to reference later\n- When you make a non-obvious decision whose *why* would be lost if the tool call history gets pruned\n\nStructure:\n\n### Key Decisions — decisions made and WHY\n### Working Data — intermediate results, extracted values (URLs, IDs, key snippets — not full pages)\n### Open Questions — uncertainties you plan to verify\n### Blockers — anything preventing progress that isn't already captured in `tasks.last_error`\n\nUpdate incrementally — do not rewrite from scratch each time.\n\n<!-- File: core/framework/skills/_default_skills/quality-monitor/SKILL.md (Tokens: ~159 | Category: anthropic-skill) -->\n---\nname: hive.quality-monitor\ndescription: Periodically self-assess output quality to catch degradation before the judge does.\nmetadata:\n  author: hive\n  type: default-skill\n  visibility: [worker]\n---\n\n## Operational Protocol: Quality Self-Assessment\n\nEvery {{assessment_interval}} iterations, self-assess:\n\n1. On-task? Still working toward the stated objective?\n2. Thorough? Cutting corners compared to earlier?\n3. Non-repetitive? Producing new value or rehashing?\n4. Consistent? Latest output contradict earlier decisions?\n5. Complete? Tracking all items, or silently dropped some?\n\nIf degrading: write assessment to `_quality_log`, re-read `_working_notes`,\nchange approach explicitly. If acceptable: brief note in `_quality_log`.\n\n<!-- File: core/framework/skills/_default_skills/writing-hive-skills/SKILL.md (Tokens: ~2329 | Category: anthropic-skill) -->\n---\nname: hive.writing-hive-skills\ndescription: Author a new Agent Skill for a Hive agent that conforms to the Agent Skills specification (SKILL.md with YAML frontmatter, optional scripts/references/assets directories). Use when the user asks to create, scaffold, add, or package a new skill for a Hive agent.\nmetadata:\n  author: hive\n  type: default-skill\n  spec-source: https://agentskills.io/specification\n---\n\n## Operational Protocol: Writing Hive Skills\n\nHive agents discover skills by scanning several roots, in precedence order:\n\n1. `<project>/.hive/skills/` — project, Hive-specific\n2. `<project>/.agents/skills/` — project, cross-client\n3. `~/.hive/skills/` — user, Hive-specific\n4. `~/.agents/skills/` — user, cross-client\n5. Framework defaults shipped in `core/framework/skills/_default_skills/`\n\nEach skill is a directory containing a `SKILL.md`. At startup, only the frontmatter `name` + `description` of every skill is loaded; the body is loaded only when the agent activates the skill. Design for that.\n\n### Choosing where to put a new skill\n\n- **Colony-scoped (via `write_skill` inside colony mode)**: when the skill is the operational protocol a single colony needs — its API auth, DOM selectors, DB schema, task-queue conventions — do NOT place it under `~/.hive/skills/` or `<project>/.hive/skills/` yourself. Those roots are SHARED and every colony on the machine will see it. Instead, once you're inside the colony (post-fork), call `write_skill(skill_name, skill_description, skill_body, skill_files?)` and the skill is materialized under `~/.hive/colonies/<colony_name>/skills/<skill-name>/` where only that colony's workers discover it. See the subsection below.\n- **Project-scoped**: put under `<project>/.hive/skills/` when the skill is tied to that codebase's APIs, conventions, or infra and multiple agents in the project should share it.\n- **User-scoped**: put under `~/.hive/skills/` when the skill is reusable across projects for this machine/user and all agents should see it.\n- **Framework default**: add under `core/framework/skills/_default_skills/` AND register in `framework/skills/defaults.py::SKILL_REGISTRY` only when the skill is a universal operational protocol shipped with Hive. Default skills use the `hive.<name>` naming convention and include `type: default-skill` in metadata.\n\n### Colony-scoped skills via `write_skill`\n\nA colony-scoped skill is one that belongs to exactly ONE colony — e.g. it encodes the HoneyComb staging API the `honeycomb_research` colony polls, or the LinkedIn outbound flow the `linkedin_outbound_campaign` colony runs. Writing such a skill at `~/.hive/skills/` or `<project>/.hive/skills/` leaks it to every other colony, which will then see it at selection time.\n\n**Do not create the folder yourself with the terminal.** Once the colony has been forked (via `suggest_colony` → user confirms the Create Colony popup), call `write_skill` inside the colony:\n\n```\nwrite_skill(\n    skill_name=\"honeycomb-api-protocol\",\n    skill_description=\"How to query the HoneyComb staging API…\",\n    skill_body=\"## Operational Protocol\\n\\nAuth: …\",\n    skill_files=[{\"path\": \"scripts/fetch_tickers.py\", \"content\": \"…\"}],  # optional\n)\n```\n\nThe tool writes `~/.hive/colonies/<this_colony>/skills/honeycomb-api-protocol/SKILL.md` (plus any `skill_files`), which `SkillDiscovery` picks up as project scope when that colony's workers start — and ONLY that colony's workers. No cross-colony leakage.\n\nDo not write colony-bound skill folders by hand under `~/.hive/skills/`. A skill placed there is user-scoped and becomes visible to every colony on the machine — defeating the isolation you wanted.\n\n### Directory layout\n\n```\n<skill-name>/\n├── SKILL.md          # Required\n├── scripts/          # Optional — executable helpers\n├── references/       # Optional — on-demand docs\n└── assets/           # Optional — templates, data, images\n```\n\nRules:\n- The directory name **must** equal the `name` frontmatter field (for framework defaults, the directory is the unprefixed name, e.g. `writing-hive-skills/` for `hive.writing-hive-skills`).\n- Keep `SKILL.md` under ~500 lines. Move long reference material into `references/`.\n- Reference other files with relative paths from the skill root (`scripts/foo.py`, `references/API.md`). Keep references one level deep.\n\n### SKILL.md frontmatter\n\nRequired fields:\n\n| Field | Constraints |\n|-------|-------------|\n| `name` | 1–64 chars, `[a-z0-9-]`, no leading/trailing/consecutive hyphens. Must match the directory name. Framework defaults prefix with `hive.` |\n| `description` | 1–1024 chars. Must describe **what** the skill does **and when to use it**. Include trigger keywords the user is likely to say. |\n\nOptional fields:\n\n| Field | Notes |\n|-------|-------|\n| `license` | License name or reference to a bundled file |\n| `compatibility` | ≤500 chars. Only include if env requirements are non-trivial (network, tools, runtime) |\n| `metadata` | Free-form string→string map. Namespace keys to avoid collisions. Default skills set `type: default-skill`. |\n| `allowed-tools` | Experimental. Space-separated pre-approved tools, e.g. `Bash(curl:*) Bash(jq:*) Read` |\n\nMinimal template:\n\n```markdown\n---\nname: my-skill\ndescription: One sentence on what it does. One sentence on when to use it, with concrete trigger words the agent will see in user requests.\n---\n\n# My Skill\n\n<body>\n```\n\n### Writing a good `description`\n\nThis is the single most important field — it's the only thing the agent sees at skill-selection time.\n\n- **Bad**: `Helps with trading.`\n- **Good**: `Buy and sell shares on the HoneyComb exchange. Handles auth, slippage-protected orders, idempotent retries, and AMM output estimation. Use when placing trades or interacting with the AMM.`\n\nInclude verbs the user is likely to say (`buy`, `sell`, `place trade`) and proper nouns (`HoneyComb`, `AMM`).\n\n### Writing the body\n\nStructure the body for the agent, not a human reader:\n\n1. **Lead with what the agent can't guess** — API base URLs, auth shape, project conventions, specific function names. Skip generic background (\"PDFs are a document format\").\n2. **Show exact request/response shapes** — include JSON payloads, headers, status codes. Copy real examples rather than paraphrasing.\n3. **Document failure modes** — error codes, retry rules, rate limits. This is where skills earn their keep vs. a generic agent.\n4. **Give a short end-to-end example** — a \"typical flow\" section at the bottom anchors everything above.\n\nRecommended sections (adapt to the domain):\n- Authentication / setup\n- Core operations (one per endpoint or action)\n- Error reference table\n- Rate limits / gotchas\n- End-to-end example pattern\n\n### Progressive disclosure\n\nThree tiers of context cost:\n\n1. **Always loaded** (~100 tokens per skill): `name` + `description`. Keep tight.\n2. **Loaded on activation** (<5k tokens target): body of `SKILL.md`.\n3. **Loaded on demand**: files under `scripts/`, `references/`, `assets/`. The agent reads these only when the body points to them.\n\nIf a section is long and only needed sometimes (e.g., a full schema dump, rarely-used edge cases), move it to `references/SOMETHING.md` and link to it from the body: `See [the error catalog](references/ERRORS.md) for the full list.`\n\n### Scripts\n\nPut executable helpers in `scripts/`. They should:\n- Be self-contained or document dependencies in a comment header.\n- Print human-readable errors to stderr and exit non-zero on failure.\n- Accept arguments via CLI flags, not env vars (easier for the agent to invoke).\n\nReference them from the body by relative path:\n\n```markdown\nEstimate buy output with `scripts/estimate_buy.py --v-hc 1000000 --v-shares 1000000 --hc 500`.\n```\n\nFor Python scripts in a Hive project, prefer `uv run scripts/foo.py ...`.\n\n### Creating a new skill — workflow\n\n1. Pick a `<skill-name>` (lowercase-hyphenated).\n2. Decide scope: **colony** (pass content INLINE to `create_colony` — STOP here, do not hand-author the folder), project (`<project>/.hive/skills/`), user (`~/.hive/skills/`), or framework default (`core/framework/skills/_default_skills/` + registry entry).\n3. For the non-colony scopes: create the directory and write `SKILL.md` with frontmatter + body.\n4. Add `scripts/`, `references/`, `assets/` only if needed.\n5. Validate the frontmatter: name matches dir, description is specific, no forbidden characters.\n6. Validate using the Hive CLI:\n   ```bash\n   uv run hive skill validate <path-to-skill-dir>\n   uv run hive skill doctor\n   ```\n7. Confirm discovery with `uv run hive skill list`.\n8. Test by invoking a Hive agent on a task the skill should match — confirm it activates and follows the instructions.\n\n### Registering as a framework default\n\nWhen adding a skill as a shipped default:\n\n1. Place the directory under `core/framework/skills/_default_skills/<unprefixed-name>/`.\n2. Set frontmatter `name: hive.<unprefixed-name>` and `metadata.type: default-skill`.\n3. Add the mapping to `SKILL_REGISTRY` in `core/framework/skills/defaults.py`:\n   ```python\n   SKILL_REGISTRY: dict[str, str] = {\n       ...\n       \"hive.<unprefixed-name>\": \"<unprefixed-name>\",\n   }\n   ```\n4. If the skill uses `{{placeholder}}` substitution, add defaults to `_SKILL_DEFAULTS` in the same file.\n5. If the skill reads/writes shared buffer keys, list them in `DATA_BUFFER_KEYS`.\n\n### What NOT to put in a skill\n\n- Generic programming knowledge the agent already has.\n- Conversation-specific state (use memory or plans instead).\n- Secrets or credentials (skills are plaintext; reference env vars or credential stores).\n- Deeply nested reference chains — keep everything one hop from `SKILL.md`.\n\n<!-- File: core/framework/skills/_preset_skills/browser-automation/SKILL.md (Tokens: ~300 | Category: anthropic-skill) -->\n# browser-automation\n\nPath: `core/framework/skills/_preset_skills/browser-automation/SKILL.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/browser-automation/SKILL.md)\n\n<!-- File: core/framework/skills/_preset_skills/chart-creation-foundations/SKILL.md (Tokens: ~300 | Category: anthropic-skill) -->\n# chart-creation-foundations\n\nPath: `core/framework/skills/_preset_skills/chart-creation-foundations/SKILL.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/chart-creation-foundations/SKILL.md)\n\n<!-- File: core/framework/skills/_preset_skills/linkedin-automation/SKILL.md (Tokens: ~300 | Category: anthropic-skill) -->\n# linkedin-automation\n\nPath: `core/framework/skills/_preset_skills/linkedin-automation/SKILL.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/linkedin-automation/SKILL.md)\n\n<!-- File: core/framework/skills/_preset_skills/terminal-tools-foundations/references/exit_codes.md (Tokens: ~300 | Category: anthropic-skill) -->\n# References Skill\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-foundations/references/exit_codes.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-foundations/references/exit_codes.md)\n\n<!-- File: core/framework/skills/_preset_skills/terminal-tools-foundations/SKILL.md (Tokens: ~300 | Category: anthropic-skill) -->\n# terminal-tools-foundations\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-foundations/SKILL.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-foundations/SKILL.md)\n\n<!-- File: core/framework/skills/_preset_skills/terminal-tools-fs-search/references/find_predicates.md (Tokens: ~300 | Category: anthropic-skill) -->\n# References Skill\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-fs-search/references/find_predicates.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-fs-search/references/find_predicates.md)\n\n<!-- File: core/framework/skills/_preset_skills/terminal-tools-fs-search/references/ripgrep_cheatsheet.md (Tokens: ~300 | Category: anthropic-skill) -->\n# References Skill\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-fs-search/references/ripgrep_cheatsheet.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-fs-search/references/ripgrep_cheatsheet.md)\n\n<!-- File: core/framework/skills/_preset_skills/terminal-tools-fs-search/SKILL.md (Tokens: ~300 | Category: anthropic-skill) -->\n# terminal-tools-fs-search\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-fs-search/SKILL.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-fs-search/SKILL.md)\n\n<!-- File: core/framework/skills/_preset_skills/terminal-tools-job-control/references/signals.md (Tokens: ~300 | Category: anthropic-skill) -->\n# References Skill\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-job-control/references/signals.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-job-control/references/signals.md)\n\n<!-- File: core/framework/skills/_preset_skills/terminal-tools-job-control/SKILL.md (Tokens: ~300 | Category: anthropic-skill) -->\n# terminal-tools-job-control\n\nPath: `core/framework/skills/_preset_skills/terminal-tools-job-control/SKILL.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/core/framework/skills/_preset_skills/terminal-tools-job-control/SKILL.md)\n\n<!-- File: core/framework/skills/_preset_skills/terminal-tools-pty-sessions/SKILL.md (Tokens: ~1406 | Category: anthropic-skill) -->\n---\nname: hive.terminal-tools-pty-sessions\ndescription: Use when you need state across calls — building env vars, navigating with cd, driving REPLs (python -i, mysql, psql, node), or responding to interactive prompts (sudo password, ssh host-key confirmation, mysql connection). Teaches the prompt-sentinel exec pattern (default mode), raw I/O for REPLs (raw_send=True then read_only=True), the one-in-flight-per-session rule, and the close-or-leak-against-the-cap discipline. Bash on macOS — never zsh; explicit shell=/bin/zsh is rejected. Read before calling terminal_pty_open.\nmetadata:\n  author: hive\n  type: preset-skill\n  version: \"1.0\"\n---\n\n# Persistent PTY sessions\n\nPTY sessions are how you talk to interactive programs — programs that detect a terminal (`isatty()`) and behave differently when they don't see one. Use a session when:\n\n- You need state to persist across calls (`cd`, env vars, sourced scripts)\n- You're driving a REPL (`python -i`, `mysql`, `psql`, `node`, `irb`)\n- A program demands an interactive prompt (`sudo`, `ssh`, `npm login`, `gh auth login`)\n\nFor everything else, `terminal_exec` is simpler. Sessions cost more (per-session bash process, ring buffer, idle-reaping bookkeeping) and have a hard cap (`TERMINAL_TOOLS_MAX_PTY`, default 8).\n\n## Why PTY (and not subprocess pipes)\n\nSubprocess pipes break on every interactive program. The moment a program calls `isatty()` and sees False, it disables prompts, color, line-editing, password masking, progress bars — sometimes refuses to start. PTY makes us look like a real terminal so these programs work the same as in your shell.\n\nThe cost: PTY output includes terminal escape codes (cursor moves, color codes). The session captures them as-is; if you need clean text, strip ANSI escapes in your processing layer.\n\n## Bash on macOS — by deliberate policy\n\n`terminal_pty_open` always invokes `/bin/bash`, regardless of the user's `$SHELL`. macOS users: yes, even when zsh is your interactive default. This is the **terminal-tools-foundations** policy applied to PTYs.\n\nReasons:\n- zsh has command/builtin classes (`zmodload`, `=cmd` expansion, `zpty`, `ztcp`) that bypass bash-shaped security checks\n- One shell behavior across platforms eliminates \"works on Linux, breaks on macOS\" surprises\n- Bash is universal: any shell you've used will accept the bash subset\n\nThe bash invocation uses `--norc --noprofile` so user dotfiles don't leak in. PS1 is set to a unique sentinel for prompt detection. PS2 is empty. PROMPT_COMMAND is empty.\n\n## Three modes of `terminal_pty_run`\n\n### 1. Default: send command, wait for prompt sentinel\n\n```\nterminal_pty_run(session_id, command=\"ls -la\")\n  → { output, prompt_after: True, ... }\n```\n\nThe session writes `ls -la\\n`, waits for the sentinel that its custom PS1 emits, returns the slice between submission and prompt. **One in-flight call per session** — a concurrent call returns a `\"session busy\"` error.\n\n### 2. raw_send: send raw input, no waiting\n\n```\nterminal_pty_run(session_id, command=\"print('hi')\\n\", raw_send=True)\n  → { bytes_sent: 12 }\n```\n\nFor REPLs, vim keystrokes, password prompts. The session writes the bytes and returns immediately — it doesn't wait for a prompt (REPLs don't print bash's prompt; they print their own).\n\nAfter a `raw_send`, you typically follow with:\n\n### 3. read_only: drain currently-buffered output\n\n```\nterminal_pty_run(session_id, read_only=True, timeout_sec=2)\n  → { output: \"hi\\n\", more: False, ... }\n```\n\nReads whatever the session has accumulated since the last drain, with a brief settle window. Use after raw_send to capture the REPL's response.\n\n## Custom prompt detection (`expect`)\n\nWhen the command launches a program with its own prompt (Python REPL's `>>> `, mysql's `mysql> `, sudo's password prompt), the bash sentinel won't appear until the program exits. Override:\n\n```\nterminal_pty_run(session_id, command=\"python3\", expect=r\">>>\\s*$\", timeout_sec=10)\n  → output up to and including \">>>\", then control returns\n```\n\nFor sudo:\n\n```\nterminal_pty_run(session_id, command=\"sudo -k && sudo whoami\", expect=r\"[Pp]assword:\")\nterminal_pty_run(session_id, command=\"<password>\", raw_send=True, command=\"<password>\\n\")\nterminal_pty_run(session_id, read_only=True, timeout_sec=5)\n```\n\n(Treat passwords carefully — they end up in the ring buffer.)\n\n## Always close\n\n```\nterminal_pty_close(session_id)\n```\n\nLeaked sessions count against `TERMINAL_TOOLS_MAX_PTY` (default 8). Idle reaping happens lazily on every `_open` call (sessions inactive longer than `idle_timeout_sec`, default 1800s, are dropped) — but don't rely on it. Close when you're done.\n\nFor unresponsive sessions, `force=True` skips the graceful \"exit\" attempt and goes straight to SIGTERM/SIGKILL.\n\n## Common patterns\n\n### Stateful navigation\n\n```\nsid = terminal_pty_open(cwd=\"/\")\nterminal_pty_run(sid, command=\"cd /var/log\")\nterminal_pty_run(sid, command=\"ls -la *.log | head\")\nterminal_pty_close(sid)\n```\n\n### Python REPL\n\n```\nsid = terminal_pty_open()\nterminal_pty_run(sid, command=\"python3\", expect=r\">>>\\s*$\")\nterminal_pty_run(sid, command=\"x = 42\", raw_send=True)\nterminal_pty_run(sid, command=\"print(x*x)\\n\", raw_send=True)\nresult = terminal_pty_run(sid, read_only=True)  # → \"1764\\n>>> \"\nterminal_pty_run(sid, command=\"exit()\", raw_send=True)\nterminal_pty_close(sid)\n```\n\n### ssh with host-key prompt\n\n```\nsid = terminal_pty_open()\nterminal_pty_run(sid, command=\"ssh user@new-host\", expect=r\"\\(yes/no.*\\)\\?\")\nterminal_pty_run(sid, command=\"yes\\n\", raw_send=True)\nterminal_pty_run(sid, read_only=True, timeout_sec=10)  # password prompt or login\n```\n\n<!-- File: core/framework/skills/_preset_skills/terminal-tools-troubleshooting/SKILL.md (Tokens: ~1228 | Category: anthropic-skill) -->\n---\nname: hive.terminal-tools-troubleshooting\ndescription: Read when a terminal-tools call returned something surprising — empty stdout despite no error, exit_code is null, output_handle came back expired, \"too many jobs\" / \"session busy\" / \"too many PTYs\", warning was set unexpectedly, semantic_status disagrees with exit_code. Diagnostic recipes only — load on demand. Don't preload; the foundational skill covers the happy path.\nmetadata:\n  author: hive\n  type: preset-skill\n  version: \"1.0\"\n---\n\n# Troubleshooting terminal-tools\n\nRecipes for surprising results. Match the symptom to the section.\n\n## Empty `stdout` despite the command \"should have\" produced output\n\nPossible causes:\n1. Output went to **stderr** instead. Check `stderr` in the envelope (or use `merge_stderr=True` for jobs).\n2. Output was **fully truncated** because `max_output_kb` is too small. Check `stdout_truncated_bytes > 0`. Bump `max_output_kb` or paginate via `output_handle`.\n3. Command produced no output (correct, just unexpected — `silent` flags, no matches).\n4. Pipeline issue: the last stage of a pipe ran but stdout went elsewhere (`> /dev/null`, redirected via `2>&1`).\n5. Process is buffering its output and didn't flush before exit. Add `stdbuf -oL` (line-buffered) or `unbuffer` to the command.\n\n## `exit_code: null`\n\n| Cause | Other field |\n|---|---|\n| Auto-backgrounded | `auto_backgrounded: true, job_id: <X>` |\n| Hard timeout, process killed | `timed_out: true` |\n| Pre-spawn failure (command not found) | `error: ...` set, `pid: null` |\n| Still running (in `terminal_job_logs`) | `status: \"running\"` |\n\n## `output_handle` returned `expired: true`\n\n5-minute TTL. Either (a) you waited too long, or (b) the store evicted it under memory pressure (64 MB total cap, LRU eviction). Re-run the command.\n\nTo reduce risk: paginate the handle as soon as you receive it, or use `terminal_job_*` for huge outputs (4 MB ring buffer with offsets — no expiry).\n\n## \"too many jobs\" / `JobLimitExceeded`\n\n`TERMINAL_TOOLS_MAX_JOBS` (default 32) hit. Either:\n- Wait for jobs to exit (poll with `terminal_job_logs(wait_until_exit=True)`)\n- Kill old jobs: `terminal_job_manage(action=\"list\")` to see what's running, then `signal_term` the abandoned ones\n- Raise the cap via env (rare)\n\n## \"session busy\"\n\nA `terminal_pty_run` was issued while another `_run` is in flight on the same session. PTY sessions are single-threaded conversations. Wait for the prior call to return, or open a second session.\n\n## \"PTY cap reached\"\n\n`TERMINAL_TOOLS_MAX_PTY` (default 8) hit. Close idle sessions (`terminal_pty_close`). Idle reaping is lazy; force it by opening — no, actually, opening throws when the cap is hit. Just close manually.\n\n## `warning` is set, the command worked\n\nInformational only. The pattern matched (e.g. `rm -rf` literally appears, or `git push --force` was used). The command ran. The warning is your \"did I mean to do that?\" prompt — verify the side effect was intended before continuing.\n\n## `semantic_status: \"ok\"` but `exit_code: 1`\n\nWorking as designed. Some commands use exit 1 for legitimate non-error states:\n- `grep` / `rg` exit 1 when **no matches** found\n- `find` exit 1 when **some directories were unreadable** (typical on `/proc`, etc.)\n- `diff` exit 1 when **files differ**\n- `test` / `[` exit 1 when **condition is false**\n\nThe `semantic_message` field explains. Trust `semantic_status`, not raw `exit_code`.\n\n## `semantic_status: \"error\"` but `exit_code: 0`\n\nShouldn't happen. If it does, file a bug.\n\n## `truncated_bytes_dropped > 0` in `terminal_job_logs`\n\nYour `since_offset` was older than the ring buffer's floor — bytes evicted before you could read them. Either:\n- Poll faster (lower latency between calls)\n- Use `merge_stderr=True` (single 4 MB ring instead of 4 MB × 2)\n- Accept the gap and move forward from `next_offset`\n\n## `terminal_pty_open` succeeds but the first `_run` times out\n\nThe session may not have produced its first prompt sentinel within the 2-second startup window. Try:\n- A `terminal_pty_run(sid, read_only=True, timeout_sec=2)` to drain whatever's accumulated\n- A noop command (`terminal_pty_run(sid, command=\"true\")`) to force a prompt cycle\n\nCould also indicate the bash process died at startup — `terminal_pty_run(sid, ...)` would then return `\"session has exited\"`.\n\n## `shell=\"/bin/zsh\"` returned an error\n\nBy design. terminal-tools is bash-only on POSIX. Use `shell=True` (default `/bin/bash`) or omit `shell=` to exec directly.\n\n## A command in `shell=True` is interpreted differently than expected\n\nBash, not zsh, semantics. `**/*` doesn't recurse without `shopt -s globstar`; `=cmd` expansion doesn't work; arrays use `arr[idx]` not `${arr[idx]}` differently than zsh. When in doubt, the foundational skill's \"bash, not zsh\" section is the canonical statement.\n\n<!-- File: core/framework/skills/_preset_skills/x-automation/SKILL.md (Tokens: ~4129 | Category: anthropic-skill) -->\n---\nname: hive.x-automation\ndescription: Read before automating X / Twitter with browser_* tools. Verified flows for post, reply, delete, search-and-engage, plus the Draft.js compose quirks that silently disable the send button. Includes the daily-reply and job-market-reply playbooks. Requires hive.browser-automation for the underlying screenshot + coordinate workflow. Verified 2026-04-11.\nmetadata:\n  author: hive\n  type: default-skill\n  version: \"1.0\"\n  verified: 2026-04-11\n  requires_skill: hive.browser-automation\n---\n\n# X / Twitter Automation\n\nX uses **Draft.js** (the original Facebook rich-text editor) for the compose text area, which was the original canary for all the rich-text editor quirks the `browser-automation` skill now documents. Most of the site is otherwise stable — `data-testid` attributes have held up for years, the SPA is reasonably honest about what it renders, and shadow DOM is minimal. The hard parts are the composer, rate limiting, and the occasional anti-bot challenge.\n\n**Always activate `browser-automation` first.** This skill assumes you already know about CSS-px coordinates, click-first typing, and `Input.insertText`. The guidance below is X-specific.\n\n## Timing expectations\n\n- `browser_navigate(wait_until=\"load\")` returns in **1.3–1.6 s** on a warm cache.\n- After navigation, **`sleep(2–3)`** for SPA hydration before querying selectors.\n- Compose modal slide-in: **~1.5 s** after clicking reply / compose.\n- First 1–2 characters typed into the compose editor **may be dropped** — see \"Draft.js quirks\" below.\n\n## Verified selectors (2026-04-11)\n\n| Target | Selector |\n|---|---|\n| Home nav link | `a[data-testid='AppTabBar_Home_Link']` |\n| Explore nav link | `a[data-testid='AppTabBar_Explore_Link']` |\n| Notifications | `a[data-testid='AppTabBar_Notifications_Link']` |\n| Main search input | `input[data-testid='SearchBox_Search_Input']` |\n| Compose text area | `[data-testid='tweetTextarea_0']` (Draft.js contenteditable) |\n| Post / Tweet submit button | `[data-testid='tweetButton']` |\n| Reply button (on feed / tweet detail) | `[data-testid='reply']` |\n| Like button | `[data-testid='like']` |\n| Retweet / repost button | `[data-testid='retweet']` |\n| Caret (⋯) menu on a post | `[data-testid='caret']` |\n| Confirmation sheet confirm button | `[data-testid='confirmationSheetConfirm']` |\n| Tweet article wrapper | `article[data-testid='tweet']` |\n| Close modal / composer | `[aria-label='Close']` or press `Escape` |\n\nAll of these are light-DOM `data-testid` attributes — `wait_for_selector` and `browser_type(selector=...)` work on them directly, no shadow piercing needed.\n\n## Post new tweet flow\n\n```\nbrowser_navigate(\"https://x.com/home\", wait_until=\"load\")\nsleep(3)\n\n# Open the compose UI (click the post-new-tweet nav or use shortcut N)\nbrowser_press(\"n\")   # keyboard shortcut — opens compose modal\nsleep(1.5)\n\n# Click the textarea to make sure Draft.js is in edit mode\nta_rect = browser_get_rect(\"[data-testid='tweetTextarea_0']\")\nbrowser_click_coordinate(ta_rect.cx, ta_rect.cy)\nsleep(0.5)\n\n# Type — browser_type handles Draft.js correctly now via Input.insertText\nbrowser_type(\"[data-testid='tweetTextarea_0']\", tweet_text)\nsleep(1.0)  # let Draft.js commit state\n\n# Verify the Post button is enabled — never click blindly, Draft.js sometimes\n# doesn't register the input even with a prior click.\nstate = browser_evaluate(\"\"\"\n  (function(){\n    const btn = document.querySelector('[data-testid=\"tweetButton\"]');\n    if (!btn) return {found: false};\n    return {\n      found: true,\n      disabled: btn.disabled || btn.getAttribute('aria-disabled') === 'true',\n    };\n  })();\n\"\"\")\nif state['found'] and not state['disabled']:\n    browser_click(\"[data-testid='tweetButton']\")\n    sleep(2)\n    browser_press(\"Escape\")  # close any leftover modal\n```\n\n## Posting a tweet WITH an image\n\n**Critical: NEVER click the photo button.** On `x.com/compose/post` the media button is a styled `<button>` that triggers Chrome's native OS file picker when clicked — that dialog is unreachable via CDP and will wedge the automation. Instead, set the file directly on the hidden `<input type='file'>` element using `browser_upload`:\n\n```python\n# 1. Open the compose modal as usual\nbrowser_press(\"n\")\nsleep(1.5)\nbrowser_click_coordinate(ta_rect.cx, ta_rect.cy)\nsleep(0.5)\nbrowser_type(\"[data-testid='tweetTextarea_0']\", tweet_text)\n\n# 2. Find the hidden file input X uses for media uploads.\n#    X's input is marked with data-testid='fileInput' and accepts\n#    image/*,video/*. It's hidden (display:none) but still mounted.\ninputs = browser_evaluate(\"\"\"\n  (function(){\n    return Array.from(document.querySelectorAll('input[type=\"file\"]'))\n      .map(el => ({\n        testid: el.getAttribute('data-testid') || '',\n        accept: el.accept || '',\n        multiple: el.multiple,\n      }));\n  })();\n\"\"\")\n# Expect to see: [{testid: 'fileInput', accept: 'image/jpeg,...', multiple: true}]\n\n# 3. Set the file WITHOUT opening any dialog\nbrowser_upload(\n    selector=\"input[data-testid='fileInput']\",\n    file_paths=[\"/absolute/path/to/photo.png\"],\n)\nsleep(2)  # X takes ~1-2s to show the preview thumbnail\n\n# 4. Verify the preview rendered before posting — if not, the upload\n#    didn't land and Post button will fail.\npreview = browser_evaluate(\"\"\"\n  (function(){\n    // X renders uploaded media as an <img> with data-testid='attachments'\n    // (or similar) inside the composer.\n    const att = document.querySelector('[data-testid=\"attachments\"] img');\n    return { hasPreview: !!att };\n  })();\n\"\"\")\nif not preview['hasPreview']:\n    raise Exception(\"Upload didn't render in composer — do NOT click Post\")\n\n# 5. Now click Post as usual\nbrowser_click(\"[data-testid='tweetButton']\")\nsleep(3)  # media upload + post takes longer than text-only\nbrowser_press(\"Escape\")\n```\n\nIf you don't already have the image file on disk, write it first: `write_file(\"/tmp/x_upload.png\", base64_bytes)` or copy from a known location. `browser_upload` requires an absolute file path — relative paths and `~` expansion are not supported.\n\n## Reply to a post flow\n\nThe reply flow is the same shape as posting, with a few scroll / find-and-click steps before.\n\n```\nbrowser_navigate(\"https://x.com/home\", wait_until=\"load\")\nsleep(3)\n\n# Load content by scrolling — X lazy-loads feed items\nbrowser_scroll(direction=\"down\", amount=2000)\nsleep(1.5)\n\n# Find replyable tweets — reply buttons, in visual/feed order\ncandidates = browser_evaluate(\"\"\"\n  (function(){\n    const tweets = document.querySelectorAll('article[data-testid=\"tweet\"]');\n    const out = [];\n    tweets.forEach((t, i) => {\n      const reply = t.querySelector('[data-testid=\"reply\"]');\n      if (!reply) return;\n      const r = reply.getBoundingClientRect();\n      if (r.width <= 0 || r.y < 0 || r.y > window.innerHeight) return;\n      const text = (t.textContent || '').slice(0, 120);\n      out.push({\n        index: i,\n        preview: text,\n        cx: r.x + r.width/2,\n        cy: r.y + r.height/2,\n      });\n    });\n    return out;\n  })();\n\"\"\")\n\n# For each unreplied candidate...\nfor c in candidates:\n    if already_replied(c['preview']):\n        continue  # see dedup pattern below\n\n    # Click reply\n    browser_click_coordinate(c['cx'], c['cy'])\n    sleep(1.5)  # composer slide-in\n\n    # Click the textarea to focus Draft.js\n    ta = browser_get_rect(\"[data-testid='tweetTextarea_0']\")\n    browser_click_coordinate(ta.cx, ta.cy)\n    sleep(0.5)\n\n    # Type the reply\n    browser_type(\"[data-testid='tweetTextarea_0']\", reply_text)\n    sleep(1.5)   # Draft.js state commit takes a beat\n\n    # Verify button enabled\n    state = browser_evaluate(\"\"\"\n      (function(){\n        const b = document.querySelector('[data-testid=\"tweetButton\"]');\n        return b ? {d: b.disabled || b.getAttribute('aria-disabled') === 'true'} : {d: true};\n      })();\n    \"\"\")\n    if state['d']:\n        # Recovery: click the textarea again + one extra character toggles React state\n        browser_click_coordinate(ta.cx, ta.cy)\n        browser_press(\"End\")\n        browser_press(\" \")\n        browser_press(\"Backspace\")\n        sleep(0.5)\n    else:\n        browser_click(\"[data-testid='tweetButton']\")\n        sleep(2)\n        # Mark the task done in progress.db — see hive.colony-progress-tracker\n\n    # Close the composer (press Escape or click the Close button)\n    browser_press(\"Escape\")\n    sleep(random.uniform(10, 20))   # human cadence — see rate limits\n```\n\n## Search-and-engage flow\n\nFor \"daily reply to live posts matching query X\" — e.g. job-market replies.\n\n```\nquery = \"job market\"\nurl = f\"https://x.com/search?q={urllib.parse.quote(query)}&src=typed_query&f=live\"\nbrowser_navigate(url, wait_until=\"load\")\nsleep(3)\nbrowser_scroll(\"down\", 2000)\nsleep(1.5)\n\n# Same replyable-tweets probe as above, then same reply-to-tweet loop\n```\n\n## Delete a post flow\n\n```\nbrowser_navigate(\"https://x.com/<your_username>/with_replies\", wait_until=\"load\")\nsleep(3)\n\n# Find the target article (by text match or index)\ntarget_caret = browser_evaluate(\"\"\"\n  (function(target_text){\n    const tweets = document.querySelectorAll('article[data-testid=\"tweet\"]');\n    for (const t of tweets){\n      if (!(t.textContent || '').includes(target_text)) continue;\n      const caret = t.querySelector('[data-testid=\"caret\"]');\n      if (!caret) continue;\n      const r = caret.getBoundingClientRect();\n      return {cx: r.x + r.width/2, cy: r.y + r.height/2};\n    }\n    return null;\n  })();\n\"\"\", target_text)\n\nbrowser_click_coordinate(target_caret['cx'], target_caret['cy'])\nsleep(0.8)   # menu animation\n\n# The Delete menuitem doesn't have a stable data-testid — find by text\ndelete_rect = browser_evaluate(\"\"\"\n  (function(){\n    const items = document.querySelectorAll('[role=\"menuitem\"]');\n    for (const el of items){\n      if ((el.textContent || '').trim() === 'Delete'){\n        const r = el.getBoundingClientRect();\n        return {cx: r.x + r.width/2, cy: r.y + r.height/2};\n      }\n    }\n    return null;\n  })();\n\"\"\")\nbrowser_click_coordinate(delete_rect['cx'], delete_rect['cy'])\nsleep(0.8)\n\n# Confirmation sheet — this one DOES have a stable testid\nbrowser_click(\"[data-testid='confirmationSheetConfirm']\")\nsleep(1.5)\n```\n\n## Draft.js quirks\n\nX's compose editor is the canonical test case for every rich-text-editor bug the GCU bridge has ever had. What you need to know:\n\n- **Click the textarea first.** Mandatory. Without a native click-sourced focus event, Draft.js's editor state never enters edit mode, and the Post button stays disabled regardless of how much text you type. `browser_type` now does this click automatically.\n\n- **`browser_type` uses CDP `Input.insertText` by default**, which Draft.js accepts cleanly. The older approach — per-character `Input.dispatchKeyEvent` with `delay_ms=20` — *also* works, but insertText is more reliable and faster. Only pass `delay_ms > 0` (which falls back to per-char dispatch) if you're specifically testing the keystroke timing path.\n\n- **First 1–2 characters may be eaten** on the per-char dispatch path (not on insertText). If you see `\"estin\"` instead of `\"testin\"`, prepend a throwaway character or use insertText.\n\n- **Verify `tweetButton`'s `disabled` state** before clicking. Draft.js's internal state can disagree with the DOM text — verify framework state via a targeted `browser_evaluate` on `aria-disabled`.\n\n- **If the button stays disabled after typing**, use the recovery dance: click the textarea again, press `End`, press a space, press `Backspace`. This forces React to recompute `hasRealContent` and usually flips the button on.\n\n- **URL previews take a beat to render.** If your tweet ends with a URL, wait 2–3 s after typing so the link-card preview loads before you post — otherwise the tweet publishes without the card.\n\n## Rate limits and safety\n\n| Action | Limit |\n|---|---|\n| Tweets per hour | ~50 before throttling |\n| Replies per session | **5–10 per run**, randomized 10–20 s delays |\n| DMs per day | Varies by account age; 50–100 for established accounts |\n| Follow/unfollow | <400/day spread over time |\n| Like per day | 1000 max; 200–300 is safer |\n\nSignals you're being rate-limited or flagged:\n- 429 status in network responses (not always visible to the agent)\n- \"You are unable to Tweet\" banner\n- Redirect to `https://x.com/account/access` (anti-bot check)\n- Posts appearing to publish but not visible on your profile\n- Reply button click opens but composer never receives focus\n\nIf any of these appear, **stop the run, screenshot the state, and surface the issue.** Do not retry immediately.\n\n## Deduplication pattern\n\nDedup is handled by the colony progress queue, not a separate JSON file. The queen enqueues one row in the `tasks` table per reply target (keyed by tweet URL); workers claim, reply, and mark done. Already-`done` rows are skipped on the next claim — that's your crash-resume and cross-day dedup, for free. See `hive.colony-progress-tracker` for the full claim/update protocol.\n\nExtract the tweet URL via `browser_evaluate` so the queen can use it as the task key:\n\n```\nurl = browser_evaluate(\"\"\"\n  (function(article_index){\n    const t = document.querySelectorAll('article[data-testid=\"tweet\"]')[article_index];\n    if (!t) return null;\n    const link = t.querySelector('a[href*=\"/status/\"]');\n    return link ? link.href : null;\n  })();\n\"\"\", article_index)\n```\n\nIf you need to check whether a given tweet URL has already been replied to in a prior run (e.g., scanning live search results before enqueuing), query the queue directly:\n\n```bash\nsqlite3 \"<db_path>\" \"SELECT status FROM tasks WHERE payload LIKE '%\\\"tweet_url\\\":\\\"<url>\\\"%';\"\n```\n\nEmpty → not yet enqueued, safe to add. Otherwise honor the existing row's status.\n\n## Reply style guidelines\n\nThese are soft rules derived from the backed-up `x-daily-replies` and `x-job-market-replies` skills — tune per your operator's preference.\n\n**Daily replies (siren_fs persona, dark humorous):**\n- 2 sentences MAX\n- Dark, humorous, insightful, trendy\n- Must feel like a real person with opinions and edge\n- Must NOT sound like AI, use corporate speak, or be corny\n- Tie to current news/culture when possible\n- English only\n- Target: 5–8 replies per run\n- Skip posts that are purely images/video with no text context\n- Prioritize high-engagement accounts\n- Skip ads unless genuinely interesting\n\n**Job-market replies (casual slang + prediction-market CTA):**\n- 2–3 short sentences max\n- Casual slang, alt spellings: \"u\", \"fr\", \"lmao\", \"lol\"\n- Always include a profile-level CTA (\"check my profile if u wanna see…\")\n- Tie the reply to the economic / career angle of the original post\n- Vary templates — never identical text across replies\n- Max 10 replies per session\n\n## Common pitfalls\n\n- **Typing without clicking first → send button stays disabled.** Draft.js only enters edit mode after a native focus event. `browser_type` handles this automatically now, but if you're using raw CDP calls, click first.\n\n- **First 1–2 chars eaten on per-char dispatch.** Stick with `browser_type` default (uses `Input.insertText`). Only use `delay_ms=20` fallback if you need per-keystroke timing.\n\n- **Clicking Post with Draft.js state disagreeing.** Always verify `[data-testid=\"tweetButton\"]`'s `disabled` / `aria-disabled` before clicking. If disabled, run the recovery dance.\n\n- **Anti-bot challenge mid-run.** X occasionally shows a JavaScript challenge or redirects to `/account/access`. Detect by checking the URL after navigation and the presence of the home nav:\n  ```\n  challenged = browser_evaluate(\"\"\"\n    (function(){\n      return window.location.href.includes('/account/access') ||\n             !document.querySelector('a[data-testid=\"AppTabBar_Home_Link\"]');\n    })();\n  \"\"\")\n  ```\n  If challenged, stop and surface to the operator. Do not try to solve it.\n\n- **Composer modal fails to open on rapid clicks.** X debounces the reply button click. Always `sleep(1.5)` after clicking before trying to query the textarea.\n\n- **Navigation inside the SPA is preferred over full page loads.** Clicking a tweet to open its detail view keeps the compose state; using `browser_navigate` reloads everything and slows the run. Use `browser_click` on internal links when possible.\n\n- **X's `window.innerHeight` changes on compose modal open.** The modal takes over most of the viewport. Don't cache viewport dimensions across a compose open; re-query after the modal slide-in.\n\n- **URL-only tweets post without a link card if you click Post too fast.** Wait 2–3 s after typing a URL before clicking Post so the card preview renders.\n\n## Auth wall detection\n\nCheck logged-in state before any action:\n\n```\nlogged_in = browser_evaluate(\"\"\"\n  (function(){\n    return !!document.querySelector('a[data-testid=\"AppTabBar_Home_Link\"]') &&\n           !window.location.href.includes('/i/flow/login');\n  })();\n\"\"\")\n```\n\nIf not logged in, **stop immediately** and surface. Do not attempt to log in via automation.\n\n## See also\n\n- `browser-automation` skill — general CDP/coord/screenshot rules, click-then-type pattern, Input.insertText\n- `linkedin-automation` skill — LinkedIn equivalent\n\n<!-- File: tools/BROWSER_USE_PATTERNS.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Tools Skill\n\nPath: `tools/BROWSER_USE_PATTERNS.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/BROWSER_USE_PATTERNS.md)\n\n<!-- File: tools/browser-extension/manifest.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Browser-extension Skill\n\nPath: `tools/browser-extension/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/browser-extension/manifest.json)\n\n<!-- File: tools/BUILDING_TOOLS.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Tools Skill\n\nPath: `tools/BUILDING_TOOLS.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/BUILDING_TOOLS.md)\n\n<!-- File: tools/mcp_servers.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Tools Skill\n\nPath: `tools/mcp_servers.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/aden-hive/hive/HEAD/tools/mcp_servers.json)\n\n<!-- ... +118 more modular skills available via /api/skills/aden-hive/hive?path={path} -->\n</yakaai_skills>"}