{"id":"6f699bfe-c5fc-435e-80ad-1eaf153653a7","shortId":"TChxvZ","kind":"skill","title":"Autonomous Agent Patterns","tagline":"Antigravity Awesome Skills skill by Sickn33","description":"# 🕹️ Autonomous Agent Patterns\n\n> Design patterns for building autonomous coding agents, inspired by [Cline](https://github.com/cline/cline) and [OpenAI Codex](https://github.com/openai/codex).\n\n## When to Use This Skill\n\nUse this skill when:\n\n- Building autonomous AI agents\n- Designing tool/function calling APIs\n- Implementing permission and approval systems\n- Creating browser automation for agents\n- Designing human-in-the-loop workflows\n\n---\n\n## 1. Core Agent Architecture\n\n### 1.1 Agent Loop\n\n```\n┌─────────────────────────────────────────────────────────────┐\n│                     AGENT LOOP                               │\n│                                                              │\n│  ┌──────────┐    ┌──────────┐    ┌──────────┐              │\n│  │  Think   │───▶│  Decide  │───▶│   Act    │              │\n│  │ (Reason) │    │ (Plan)   │    │ (Execute)│              │\n│  └──────────┘    └──────────┘    └──────────┘              │\n│       ▲                               │                     │\n│       │         ┌──────────┐          │                     │\n│       └─────────│ Observe  │◀─────────┘                     │\n│                 │ (Result) │                                │\n│                 └──────────┘                                │\n└─────────────────────────────────────────────────────────────┘\n```\n\n```python\nclass AgentLoop:\n    def __init__(self, llm, tools, max_iterations=50):\n        self.llm = llm\n        self.tools = {t.name: t for t in tools}\n        self.max_iterations = max_iterations\n        self.history = []\n\n    def run(self, task: str) -> str:\n        self.history.append({\"role\": \"user\", \"content\": task})\n\n        for i in range(self.max_iterations):\n            # Think: Get LLM response with tool options\n            response = self.llm.chat(\n                messages=self.history,\n                tools=self._format_tools(),\n                tool_choice=\"auto\"\n            )\n\n            # Decide: Check if agent wants to use a tool\n            if response.tool_calls:\n                for tool_call in response.tool_calls:\n                    # Act: Execute the tool\n                    result = self._execute_tool(tool_call)\n\n                    # Observe: Add result to history\n                    self.history.append({\n                        \"role\": \"tool\",\n                        \"tool_call_id\": tool_call.id,\n                        \"content\": str(result)\n                    })\n            else:\n                # No more tool calls = task complete\n                return response.content\n\n        return \"Max iterations reached\"\n\n    def _execute_tool(self, tool_call) -> Any:\n        tool = self.tools[tool_call.name]\n        args = json.loads(tool_call.arguments)\n        return tool.execute(**args)\n```\n\n### 1.2 Multi-Model Architecture\n\n```python\nclass MultiModelAgent:\n    \"\"\"\n    Use different models for different purposes:\n    - Fast model for planning\n    - Powerful model for complex reasoning\n    - Specialized model for code generation\n    \"\"\"\n\n    def __init__(self):\n        self.models = {\n            \"fast\": \"gpt-3.5-turbo\",      # Quick decisions\n            \"smart\": \"gpt-4-turbo\",        # Complex reasoning\n            \"code\": \"claude-3-sonnet\",     # Code generation\n        }\n\n    def select_model(self, task_type: str) -> str:\n        if task_type == \"planning\":\n            return self.models[\"fast\"]\n        elif task_type == \"analysis\":\n            return self.models[\"smart\"]\n        elif task_type == \"code\":\n            return self.models[\"code\"]\n        return self.models[\"smart\"]\n```\n\n---\n\n## 2. Tool Design Patterns\n\n### 2.1 Tool Schema\n\n```python\nclass Tool:\n    \"\"\"Base class for agent tools\"\"\"\n\n    @property\n    def schema(self) -> dict:\n        \"\"\"JSON Schema for the tool\"\"\"\n        return {\n            \"name\": self.name,\n            \"description\": self.description,\n            \"parameters\": {\n                \"type\": \"object\",\n                \"properties\": self._get_parameters(),\n                \"required\": self._get_required()\n            }\n        }\n\n    def execute(self, **kwargs) -> ToolResult:\n        \"\"\"Execute the tool and return result\"\"\"\n        raise NotImplementedError\n\nclass ReadFileTool(Tool):\n    name = \"read_file\"\n    description = \"Read the contents of a file from the filesystem\"\n\n    def _get_parameters(self):\n        return {\n            \"path\": {\n                \"type\": \"string\",\n                \"description\": \"Absolute path to the file\"\n            },\n            \"start_line\": {\n                \"type\": \"integer\",\n                \"description\": \"Line to start reading from (1-indexed)\"\n            },\n            \"end_line\": {\n                \"type\": \"integer\",\n                \"description\": \"Line to stop reading at (inclusive)\"\n            }\n        }\n\n    def _get_required(self):\n        return [\"path\"]\n\n    def execute(self, path: str, start_line: int = None, end_line: int = None) -> ToolResult:\n        try:\n            with open(path, 'r') as f:\n                lines = f.readlines()\n\n            if start_line and end_line:\n                lines = lines[start_line-1:end_line]\n\n            return ToolResult(\n                success=True,\n                output=\"\".join(lines)\n            )\n        except FileNotFoundError:\n            return ToolResult(\n                success=False,\n                error=f\"File not found: {path}\"\n            )\n```\n\n### 2.2 Essential Agent Tools\n\n```python\nCODING_AGENT_TOOLS = {\n    # File operations\n    \"read_file\": \"Read file contents\",\n    \"write_file\": \"Create or overwrite a file\",\n    \"edit_file\": \"Make targeted edits to a file\",\n    \"list_directory\": \"List files and folders\",\n    \"search_files\": \"Search for files by pattern\",\n\n    # Code understanding\n    \"search_code\": \"Search for code patterns (grep)\",\n    \"get_definition\": \"Find function/class definition\",\n    \"get_references\": \"Find all references to a symbol\",\n\n    # Terminal\n    \"run_command\": \"Execute a shell command\",\n    \"read_output\": \"Read command output\",\n    \"send_input\": \"Send input to running command\",\n\n    # Browser (optional)\n    \"open_browser\": \"Open URL in browser\",\n    \"click_element\": \"Click on page element\",\n    \"type_text\": \"Type text into input\",\n    \"screenshot\": \"Capture screenshot\",\n\n    # Context\n    \"ask_user\": \"Ask the user a question\",\n    \"search_web\": \"Search the web for information\"\n}\n```\n\n### 2.3 Edit Tool Design\n\n```python\nclass EditFileTool(Tool):\n    \"\"\"\n    Precise file editing with conflict detection.\n    Uses search/replace pattern for reliable edits.\n    \"\"\"\n\n    name = \"edit_file\"\n    description = \"Edit a file by replacing specific content\"\n\n    def execute(\n        self,\n        path: str,\n        search: str,\n        replace: str,\n        expected_occurrences: int = 1\n    ) -> ToolResult:\n        \"\"\"\n        Args:\n            path: File to edit\n            search: Exact text to find (must match exactly, including whitespace)\n            replace: Text to replace with\n            expected_occurrences: How many times search should appear (validation)\n        \"\"\"\n        with open(path, 'r') as f:\n            content = f.read()\n\n        # Validate\n        actual_occurrences = content.count(search)\n        if actual_occurrences != expected_occurrences:\n            return ToolResult(\n                success=False,\n                error=f\"Expected {expected_occurrences} occurrences, found {actual_occurrences}\"\n            )\n\n        if actual_occurrences == 0:\n            return ToolResult(\n                success=False,\n                error=\"Search text not found in file\"\n            )\n\n        # Apply edit\n        new_content = content.replace(search, replace)\n\n        with open(path, 'w') as f:\n            f.write(new_content)\n\n        return ToolResult(\n            success=True,\n            output=f\"Replaced {actual_occurrences} occurrence(s)\"\n        )\n```\n\n---\n\n## 3. Permission & Safety Patterns\n\n### 3.1 Permission Levels\n\n```python\nclass PermissionLevel(Enum):\n    # Fully automatic - no user approval needed\n    AUTO = \"auto\"\n\n    # Ask once per session\n    ASK_ONCE = \"ask_once\"\n\n    # Ask every time\n    ASK_EACH = \"ask_each\"\n\n    # Never allow\n    NEVER = \"never\"\n\nPERMISSION_CONFIG = {\n    # Low risk - can auto-approve\n    \"read_file\": PermissionLevel.AUTO,\n    \"list_directory\": PermissionLevel.AUTO,\n    \"search_code\": PermissionLevel.AUTO,\n\n    # Medium risk - ask once\n    \"write_file\": PermissionLevel.ASK_ONCE,\n    \"edit_file\": PermissionLevel.ASK_ONCE,\n\n    # High risk - ask each time\n    \"run_command\": PermissionLevel.ASK_EACH,\n    \"delete_file\": PermissionLevel.ASK_EACH,\n\n    # Dangerous - never auto-approve\n    \"sudo_command\": PermissionLevel.NEVER,\n    \"format_disk\": PermissionLevel.NEVER\n}\n```\n\n### 3.2 Approval UI Pattern\n\n```python\nclass ApprovalManager:\n    def __init__(self, ui, config):\n        self.ui = ui\n        self.config = config\n        self.session_approvals = {}\n\n    def request_approval(self, tool_name: str, args: dict) -> bool:\n        level = self.config.get(tool_name, PermissionLevel.ASK_EACH)\n\n        if level == PermissionLevel.AUTO:\n            return True\n\n        if level == PermissionLevel.NEVER:\n            self.ui.show_error(f\"Tool '{tool_name}' is not allowed\")\n            return False\n\n        if level == PermissionLevel.ASK_ONCE:\n            if tool_name in self.session_approvals:\n                return self.session_approvals[tool_name]\n\n        # Show approval dialog\n        approved = self.ui.show_approval_dialog(\n            tool=tool_name,\n            args=args,\n            risk_level=self._assess_risk(tool_name, args)\n        )\n\n        if level == PermissionLevel.ASK_ONCE:\n            self.session_approvals[tool_name] = approved\n\n        return approved\n\n    def _assess_risk(self, tool_name: str, args: dict) -> str:\n        \"\"\"Analyze specific call for risk level\"\"\"\n        if tool_name == \"run_command\":\n            cmd = args.get(\"command\", \"\")\n            if any(danger in cmd for danger in [\"rm -rf\", \"sudo\", \"chmod\"]):\n                return \"HIGH\"\n        return \"MEDIUM\"\n```\n\n### 3.3 Sandboxing\n\n```python\nclass SandboxedExecution:\n    \"\"\"\n    Execute code/commands in isolated environment\n    \"\"\"\n\n    def __init__(self, workspace_dir: str):\n        self.workspace = workspace_dir\n        self.allowed_commands = [\"npm\", \"python\", \"node\", \"git\", \"ls\", \"cat\"]\n        self.blocked_paths = [\"/etc\", \"/usr\", \"/bin\", os.path.expanduser(\"~\")]\n\n    def validate_path(self, path: str) -> bool:\n        \"\"\"Ensure path is within workspace\"\"\"\n        real_path = os.path.realpath(path)\n        workspace_real = os.path.realpath(self.workspace)\n        return real_path.startswith(workspace_real)\n\n    def validate_command(self, command: str) -> bool:\n        \"\"\"Check if command is allowed\"\"\"\n        cmd_parts = shlex.split(command)\n        if not cmd_parts:\n            return False\n\n        base_cmd = cmd_parts[0]\n        return base_cmd in self.allowed_commands\n\n    def execute_sandboxed(self, command: str) -> ToolResult:\n        if not self.validate_command(command):\n            return ToolResult(\n                success=False,\n                error=f\"Command not allowed: {command}\"\n            )\n\n        # Execute in isolated environment\n        result = subprocess.run(\n            command,\n            shell=True,\n            cwd=self.workspace,\n            capture_output=True,\n            timeout=30,\n            env={\n                **os.environ,\n                \"HOME\": self.workspace,  # Isolate home directory\n            }\n        )\n\n        return ToolResult(\n            success=result.returncode == 0,\n            output=result.stdout.decode(),\n            error=result.stderr.decode() if result.returncode != 0 else None\n        )\n```\n\n---\n\n## 4. Browser Automation\n\n### 4.1 Browser Tool Pattern\n\n```python\nclass BrowserTool:\n    \"\"\"\n    Browser automation for agents using Playwright/Puppeteer.\n    Enables visual debugging and web testing.\n    \"\"\"\n\n    def __init__(self, headless: bool = True):\n        self.browser = None\n        self.page = None\n        self.headless = headless\n\n    async def open_url(self, url: str) -> ToolResult:\n        \"\"\"Navigate to URL and return page info\"\"\"\n        if not self.browser:\n            self.browser = await playwright.chromium.launch(headless=self.headless)\n            self.page = await self.browser.new_page()\n\n        await self.page.goto(url)\n\n        # Capture state\n        screenshot = await self.page.screenshot(type='png')\n        title = await self.page.title()\n\n        return ToolResult(\n            success=True,\n            output=f\"Loaded: {title}\",\n            metadata={\n                \"screenshot\": base64.b64encode(screenshot).decode(),\n                \"url\": self.page.url\n            }\n        )\n\n    async def click(self, selector: str) -> ToolResult:\n        \"\"\"Click on an element\"\"\"\n        try:\n            await self.page.click(selector, timeout=5000)\n            await self.page.wait_for_load_state(\"networkidle\")\n\n            screenshot = await self.page.screenshot()\n            return ToolResult(\n                success=True,\n                output=f\"Clicked: {selector}\",\n                metadata={\"screenshot\": base64.b64encode(screenshot).decode()}\n            )\n        except TimeoutError:\n            return ToolResult(\n                success=False,\n                error=f\"Element not found: {selector}\"\n            )\n\n    async def type_text(self, selector: str, text: str) -> ToolResult:\n        \"\"\"Type text into an input\"\"\"\n        await self.page.fill(selector, text)\n        return ToolResult(success=True, output=f\"Typed into {selector}\")\n\n    async def get_page_content(self) -> ToolResult:\n        \"\"\"Get accessible text content of the page\"\"\"\n        content = await self.page.evaluate(\"\"\"\n            () => {\n                // Get visible text\n                const walker = document.createTreeWalker(\n                    document.body,\n                    NodeFilter.SHOW_TEXT,\n                    null,\n                    false\n                );\n\n                let text = '';\n                while (walker.nextNode()) {\n                    const node = walker.currentNode;\n                    if (node.textContent.trim()) {\n                        text += node.textContent.trim() + '\\\\n';\n                    }\n                }\n                return text;\n            }\n        \"\"\")\n        return ToolResult(success=True, output=content)\n```\n\n### 4.2 Visual Agent Pattern\n\n```python\nclass VisualAgent:\n    \"\"\"\n    Agent that uses screenshots to understand web pages.\n    Can identify elements visually without selectors.\n    \"\"\"\n\n    def __init__(self, llm, browser):\n        self.llm = llm\n        self.browser = browser\n\n    async def describe_page(self) -> str:\n        \"\"\"Use vision model to describe current page\"\"\"\n        screenshot = await self.browser.screenshot()\n\n        response = self.llm.chat([\n            {\n                \"role\": \"user\",\n                \"content\": [\n                    {\"type\": \"text\", \"text\": \"Describe this webpage. List all interactive elements you see.\"},\n                    {\"type\": \"image\", \"data\": screenshot}\n                ]\n            }\n        ])\n\n        return response.content\n\n    async def find_and_click(self, description: str) -> ToolResult:\n        \"\"\"Find element by visual description and click it\"\"\"\n        screenshot = await self.browser.screenshot()\n\n        # Ask vision model to find element\n        response = self.llm.chat([\n            {\n                \"role\": \"user\",\n                \"content\": [\n                    {\n                        \"type\": \"text\",\n                        \"text\": f\"\"\"\n                        Find the element matching: \"{description}\"\n                        Return the approximate coordinates as JSON: {{\"x\": number, \"y\": number}}\n                        \"\"\"\n                    },\n                    {\"type\": \"image\", \"data\": screenshot}\n                ]\n            }\n        ])\n\n        coords = json.loads(response.content)\n        await self.browser.page.mouse.click(coords[\"x\"], coords[\"y\"])\n\n        return ToolResult(success=True, output=f\"Clicked at ({coords['x']}, {coords['y']})\")\n```\n\n---\n\n## 5. Context Management\n\n### 5.1 Context Injection Patterns\n\n````python\nclass ContextManager:\n    \"\"\"\n    Manage context provided to the agent.\n    Inspired by Cline's @-mention patterns.\n    \"\"\"\n\n    def __init__(self, workspace: str):\n        self.workspace = workspace\n        self.context = []\n\n    def add_file(self, path: str) -> None:\n        \"\"\"@file - Add file contents to context\"\"\"\n        with open(path, 'r') as f:\n            content = f.read()\n\n        self.context.append({\n            \"type\": \"file\",\n            \"path\": path,\n            \"content\": content\n        })\n\n    def add_folder(self, path: str, max_files: int = 20) -> None:\n        \"\"\"@folder - Add all files in folder\"\"\"\n        for root, dirs, files in os.walk(path):\n            for file in files[:max_files]:\n                file_path = os.path.join(root, file)\n                self.add_file(file_path)\n\n    def add_url(self, url: str) -> None:\n        \"\"\"@url - Fetch and add URL content\"\"\"\n        response = requests.get(url)\n        content = html_to_markdown(response.text)\n\n        self.context.append({\n            \"type\": \"url\",\n            \"url\": url,\n            \"content\": content\n        })\n\n    def add_problems(self, diagnostics: list) -> None:\n        \"\"\"@problems - Add IDE diagnostics\"\"\"\n        self.context.append({\n            \"type\": \"diagnostics\",\n            \"problems\": diagnostics\n        })\n\n    def format_for_prompt(self) -> str:\n        \"\"\"Format all context for LLM prompt\"\"\"\n        parts = []\n        for item in self.context:\n            if item[\"type\"] == \"file\":\n                parts.append(f\"## File: {item['path']}\\n```\\n{item['content']}\\n```\")\n            elif item[\"type\"] == \"url\":\n                parts.append(f\"## URL: {item['url']}\\n{item['content']}\")\n            elif item[\"type\"] == \"diagnostics\":\n                parts.append(f\"## Problems:\\n{json.dumps(item['problems'], indent=2)}\")\n\n        return \"\\n\\n\".join(parts)\n````\n\n### 5.2 Checkpoint/Resume\n\n```python\nclass CheckpointManager:\n    \"\"\"\n    Save and restore agent state for long-running tasks.\n    \"\"\"\n\n    def __init__(self, storage_dir: str):\n        self.storage_dir = storage_dir\n        os.makedirs(storage_dir, exist_ok=True)\n\n    def save_checkpoint(self, session_id: str, state: dict) -> str:\n        \"\"\"Save current agent state\"\"\"\n        checkpoint = {\n            \"timestamp\": datetime.now().isoformat(),\n            \"session_id\": session_id,\n            \"history\": state[\"history\"],\n            \"context\": state[\"context\"],\n            \"workspace_state\": self._capture_workspace(state[\"workspace\"]),\n            \"metadata\": state.get(\"metadata\", {})\n        }\n\n        path = os.path.join(self.storage_dir, f\"{session_id}.json\")\n        with open(path, 'w') as f:\n            json.dump(checkpoint, f, indent=2)\n\n        return path\n\n    def restore_checkpoint(self, checkpoint_path: str) -> dict:\n        \"\"\"Restore agent state from checkpoint\"\"\"\n        with open(checkpoint_path, 'r') as f:\n            checkpoint = json.load(f)\n\n        return {\n            \"history\": checkpoint[\"history\"],\n            \"context\": checkpoint[\"context\"],\n            \"workspace\": self._restore_workspace(checkpoint[\"workspace_state\"]),\n            \"metadata\": checkpoint[\"metadata\"]\n        }\n\n    def _capture_workspace(self, workspace: str) -> dict:\n        \"\"\"Capture relevant workspace state\"\"\"\n        # Git status, file hashes, etc.\n        return {\n            \"git_ref\": subprocess.getoutput(f\"cd {workspace} && git rev-parse HEAD\"),\n            \"git_dirty\": subprocess.getoutput(f\"cd {workspace} && git status --porcelain\")\n        }\n```\n\n---\n\n## 6. MCP (Model Context Protocol) Integration\n\n### 6.1 MCP Server Pattern\n\n```python\nfrom mcp import Server, Tool\n\nclass MCPAgent:\n    \"\"\"\n    Agent that can dynamically discover and use MCP tools.\n    'Add a tool that...' pattern from Cline.\n    \"\"\"\n\n    def __init__(self, llm):\n        self.llm = llm\n        self.mcp_servers = {}\n        self.available_tools = {}\n\n    def connect_server(self, name: str, config: dict) -> None:\n        \"\"\"Connect to an MCP server\"\"\"\n        server = Server(config)\n        self.mcp_servers[name] = server\n\n        # Discover tools\n        tools = server.list_tools()\n        for tool in tools:\n            self.available_tools[tool.name] = {\n                \"server\": name,\n                \"schema\": tool.schema\n            }\n\n    async def create_tool(self, description: str) -> str:\n        \"\"\"\n        Create a new MCP server based on user description.\n        'Add a tool that fetches Jira tickets'\n        \"\"\"\n        # Generate MCP server code\n        code = self.llm.generate(f\"\"\"\n        Create a Python MCP server with a tool that does:\n        {description}\n\n        Use the FastMCP framework. Include proper error handling.\n        Return only the Python code.\n        \"\"\")\n\n        # Save and install\n        server_name = self._extract_name(description)\n        path = f\"./mcp_servers/{server_name}/server.py\"\n\n        with open(path, 'w') as f:\n            f.write(code)\n\n        # Hot-reload\n        self.connect_server(server_name, {\"path\": path})\n\n        return f\"Created tool: {server_name}\"\n```\n\n---\n\n## Best Practices Checklist\n\n### Agent Design\n\n- [ ] Clear task decomposition\n- [ ] Appropriate tool granularity\n- [ ] Error handling at each step\n- [ ] Progress visibility to user\n\n### Safety\n\n- [ ] Permission system implemented\n- [ ] Dangerous operations blocked\n- [ ] Sandbox for untrusted code\n- [ ] Audit logging enabled\n\n### UX\n\n- [ ] Approval UI is clear\n- [ ] Progress updates provided\n- [ ] Undo/rollback available\n- [ ] Explanation of actions\n\n---\n\n## Resources\n\n- [Cline](https://github.com/cline/cline)\n- [OpenAI Codex](https://github.com/openai/codex)\n- [Model Context Protocol](https://modelcontextprotocol.io/)\n- [Anthropic Tool Use](https://docs.anthropic.com/claude/docs/tool-use)\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["autonomous","agent","patterns","antigravity","awesome","skills","sickn33"],"capabilities":["skill","source-sickn33","category-antigravity-awesome-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/autonomous-agent-patterns","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"install_from":"skills.sh"}},"qualityScore":"0.300","qualityRationale":"deterministic score 0.30 from registry signals: · indexed on skills.sh · published under sickn33/antigravity-awesome-skills","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill:v1","enrichmentVersion":1,"enrichedAt":"2026-04-25T09:40:48.071Z","embedding":null,"createdAt":"2026-04-18T20:38:07.579Z","updatedAt":"2026-04-25T09:40:48.071Z","lastSeenAt":"2026-04-25T09:40:48.071Z","tsv":"'-1':435 '-3':257 '-3.5':245 '-4':251 '/)':2062 '/bin':985 '/claude/docs/tool-use)':2068 '/cline/cline)':25,2051 '/etc':983 '/mcp_servers':1973 '/openai/codex)':2056 '/openai/codex).':31 '/server.py':1976 '/usr':984 '0':687,1037,1093,1100 '1':66,383,622 '1.1':70 '1.2':211 '2':293,1659,1750 '2.1':297 '2.2':457 '2.3':579 '20':1530 '3':726 '3.1':730 '3.2':817 '3.3':954 '30':1081 '4':1103 '4.1':1106 '4.2':1319 '5':1463 '5.1':1466 '5.2':1665 '50':93 '5000':1208 '6':1828 '6.1':1834 'absolut':368 'access':1279 'act':77,159 'action':2046 'actual':662,667,682,685,722 'add':168,1494,1501,1522,1533,1561,1570,1589,1596,1855,1926 'agent':2,11,19,44,58,68,71,73,144,306,459,463,1116,1321,1326,1478,1673,1708,1762,1846,2003 'agentloop':85 'ai':43 'allow':761,867,1022,1064 'analysi':279 'analyz':924 'anthrop':2063 'antigrav':4 'api':48 'appear':651 'appli':699 'appropri':2008 'approv':52,741,771,810,818,834,837,879,882,886,888,890,908,911,913,2035 'approvalmanag':823 'approxim':1430 'architectur':69,215 'arg':205,210,624,842,895,896,902,921 'args.get':936 'ask':565,567,745,749,751,753,756,758,783,795,1408,2102 'assess':915 'async':1137,1192,1243,1271,1349,1388,1909 'audit':2031 'auto':140,743,744,770,809 'auto-approv':769,808 'autom':56,1105,1114 'automat':738 'autonom':1,10,17,42 'avail':2043 'await':1156,1161,1164,1170,1175,1204,1209,1216,1258,1286,1363,1406,1445 'awesom':5 'base':303,1033,1039,1922 'base64.b64encode':1187,1228 'best':2000 'block':2026 'bool':844,993,1017,1129 'boundari':2110 'browser':55,541,544,548,1104,1107,1113,1344,1348 'browsertool':1112 'build':16,41 'call':47,152,155,158,166,176,186,200,926 'captur':562,1077,1167,1792,1798 'cat':980 'category-antigravity-awesome-skills' 'cd':1812,1823 'check':142,1018 'checklist':2002 'checkpoint':1698,1710,1747,1755,1757,1765,1768,1773,1778,1781,1785,1789 'checkpoint/resume':1666 'checkpointmanag':1669 'chmod':949 'choic':139 'clarif':2104 'class':84,217,301,304,343,584,734,822,957,1111,1324,1471,1668,1844 'claud':256 'clear':2005,2038,2077 'click':549,551,1194,1199,1224,1392,1403,1457 'cline':22,1481,1861,2048 'cmd':935,942,1023,1029,1034,1035,1040 'code':18,237,255,259,286,289,462,500,503,506,779,1936,1937,1963,1984,2030 'code/commands':960 'codex':28,2053 'command':524,528,532,540,799,812,934,937,974,1013,1015,1020,1026,1043,1048,1054,1055,1062,1065,1072 'complet':188 'complex':232,253 'config':765,828,832,1878,1888 'conflict':591 'connect':1873,1881 'const':1291,1303 'content':117,179,352,471,609,659,702,714,1275,1281,1285,1318,1369,1418,1503,1512,1519,1520,1572,1576,1586,1587,1633,1646 'content.count':664 'content.replace':703 'context':564,1464,1467,1474,1505,1612,1721,1723,1780,1782,1831,2058 'contextmanag':1472 'coord':1442,1447,1449,1459,1461 'coordin':1431 'core':67 'creat':54,474,1911,1917,1940,1996 'criteria':2113 'current':1360,1707 'cwd':1075 'danger':806,940,944,2024 'data':1384,1440 'datetime.now':1712 'debug':1121 'decid':76,141 'decis':248 'decod':1189,1230 'decomposit':2007 'def':86,108,195,239,261,309,330,359,396,402,610,824,835,914,964,987,1011,1044,1125,1138,1193,1244,1272,1340,1350,1389,1485,1493,1521,1560,1588,1604,1680,1696,1753,1791,1862,1872,1910 'definit':510,513 'delet':802 'describ':1351,1359,1373,2081 'descript':321,349,367,377,389,602,1394,1401,1427,1914,1925,1950,1970 'design':13,45,59,295,582,2004 'detect':592 'diagnost':1592,1598,1601,1603,1650 'dialog':887,891 'dict':312,843,922,1704,1760,1797,1879 'differ':220,223 'dir':968,972,1540,1684,1687,1689,1692,1735 'directori':488,776,1088 'dirti':1820 'discov':1850,1893 'disk':815 'docs.anthropic.com':2067 'docs.anthropic.com/claude/docs/tool-use)':2066 'document.body':1294 'document.createtreewalker':1293 'dynam':1849 'edit':479,483,580,589,598,600,603,628,700,789 'editfiletool':585 'element':550,554,1202,1239,1336,1379,1398,1413,1425 'elif':276,283,1635,1647 'els':182,1101 'enabl':1119,2033 'end':385,411,429,436 'ensur':994 'enum':736 'env':1082 'environ':963,1069,2093 'environment-specif':2092 'error':451,675,692,860,1060,1096,1237,1957,2011 'essenti':458 'etc':1806 'everi':754 'exact':630,636 'except':445,1231 'execut':80,160,196,331,335,403,525,611,959,1045,1066 'exist':1693 'expect':619,644,669,677,678 'expert':2098 'explan':2044 'f':422,452,658,676,711,720,861,1061,1182,1223,1238,1267,1422,1456,1511,1626,1640,1652,1736,1745,1748,1772,1775,1811,1822,1939,1972,1982,1995 'f.read':660,1513 'f.readlines':424 'f.write':712,1983 'fals':450,674,691,869,1032,1059,1236,1298 'fast':225,243,275 'fastmcp':1953 'fetch':1568,1930 'file':348,355,372,453,465,468,470,473,478,480,486,490,494,497,588,601,605,626,698,773,786,790,803,1495,1500,1502,1516,1528,1535,1541,1546,1548,1550,1551,1555,1557,1558,1624,1627,1804 'filenotfounderror':446 'filesystem':358 'find':511,516,633,1390,1397,1412,1423 'folder':492,1523,1532,1537 'format':814,1605,1610 'found':455,681,696,1241 'framework':1954 'fulli':737 'function/class':512 'generat':238,260,1933 'get':126,360,397,509,514,1273,1278,1288 'git':978,1802,1808,1814,1819,1825 'github.com':24,30,2050,2055 'github.com/cline/cline)':23,2049 'github.com/openai/codex)':2054 'github.com/openai/codex).':29 'gpt':244,250 'granular':2010 'grep':508 'handl':1958,2012 'hash':1805 'head':1818 'headless':1128,1136,1158 'high':793,951 'histori':171,1718,1720,1777,1779 'home':1084,1087 'hot':1986 'hot-reload':1985 'html':1577 'human':61 'human-in-the-loop':60 'id':177,1701,1715,1717,1738 'ide':1597 'identifi':1335 'imag':1383,1439 'implement':49,2023 'import':1841 'includ':637,1955 'inclus':395 'indent':1658,1749 'index':384 'info':1151 'inform':578 'init':87,240,825,965,1126,1341,1486,1681,1863 'inject':1468 'input':535,537,560,1257,2107 'inspir':20,1479 'instal':1966 'int':409,413,621,1529 'integ':376,388 'integr':1833 'interact':1378 'isoformat':1713 'isol':962,1068,1086 'item':1618,1622,1628,1632,1636,1642,1645,1648,1656 'iter':92,104,106,124,193 'jira':1931 'join':443,1663 'json':313,1433,1739 'json.dump':1746 'json.dumps':1655 'json.load':1774 'json.loads':206,1443 'kwarg':333 'let':1299 'level':732,845,852,857,871,898,904,929 'limit':2069 'line':374,378,386,390,408,412,423,427,430,431,432,434,437,444 'list':487,489,775,1376,1593 'llm':89,95,127,1343,1346,1614,1865,1867 'load':1183,1212 'log':2032 'long':1677 'long-run':1676 'loop':64,72,74 'low':766 'ls':979 'make':481 'manag':1465,1473 'mani':647 'markdown':1579 'match':635,1426,2078 'max':91,105,192,1527,1549 'mcp':1829,1835,1840,1853,1884,1920,1934,1943 'mcpagent':1845 'medium':781,953 'mention':1483 'messag':134 'metadata':1185,1226,1729,1731,1788,1790 'miss':2115 'model':214,221,226,230,235,263,1357,1410,1830,2057 'modelcontextprotocol.io':2061 'modelcontextprotocol.io/)':2060 'multi':213 'multi-model':212 'multimodelag':218 'must':634 'n':1310,1630,1631,1634,1644,1654,1661,1662 'name':319,346,599,840,848,864,876,884,894,901,910,919,932,1876,1891,1906,1968,1975,1991,1999 'navig':1145 'need':742 'networkidl':1214 'never':760,762,763,807 'new':701,713,1919 'node':977,1304 'node.textcontent.trim':1307,1309 'nodefilter.show':1295 'none':410,414,1102,1132,1134,1499,1531,1566,1594,1880 'notimplementederror':342 'npm':975 'null':1297 'number':1435,1437 'object':325 'observ':81,167 'occurr':620,645,663,668,670,679,680,683,686,723,724 'ok':1694 'open':418,543,545,654,707,1139,1507,1741,1767,1978 'openai':27,2052 'oper':466,2025 'option':131,542 'os.environ':1083 'os.makedirs':1690 'os.path.expanduser':986 'os.path.join':1553,1733 'os.path.realpath':1001,1005 'os.walk':1543 'output':442,530,533,719,1078,1094,1181,1222,1266,1317,1455,2087 'overwrit':476 'page':553,1150,1163,1274,1284,1333,1352,1361 'paramet':323,361 'pars':1817 'part':1024,1030,1036,1616,1664 'parts.append':1625,1639,1651 'path':364,369,401,405,419,456,613,625,655,708,982,989,991,995,1000,1002,1497,1508,1517,1518,1525,1544,1552,1559,1629,1732,1742,1752,1758,1769,1971,1979,1992,1993 'pattern':3,12,14,296,499,507,595,729,820,1109,1322,1469,1484,1837,1859 'per':747 'permiss':50,727,731,764,2021,2108 'permissionlevel':735 'permissionlevel.ask':787,791,800,804,849,872,905 'permissionlevel.auto':774,777,780,853 'permissionlevel.never':813,816,858 'plan':79,228,272 'playwright.chromium.launch':1157 'playwright/puppeteer':1118 'png':1173 'porcelain':1827 'power':229 'practic':2001 'precis':587 'problem':1590,1595,1602,1653,1657 'progress':2016,2039 'prompt':1607,1615 'proper':1956 'properti':308,326 'protocol':1832,2059 'provid':1475,2041 'purpos':224 'python':83,216,300,461,583,733,821,956,976,1110,1323,1470,1667,1838,1942,1962 'question':571 'quick':247 'r':420,656,1509,1770 'rais':341 'rang':122 'reach':194 'read':347,350,381,393,467,469,529,531,772 'readfiletool':344 'real':999,1004,1010 'real_path.startswith':1008 'reason':78,233,254 'ref':1809 'refer':515,518 'relev':1799 'reliabl':597 'reload':1987 'replac':607,617,639,642,705,721 'request':836 'requests.get':1574 'requir':328,398,2106 'resourc':2047 'respons':128,132,1365,1414,1573 'response.content':190,1387,1444 'response.text':1580 'response.tool':151,157 'restor':1672,1754,1761 'result':82,163,169,181,340,1070 'result.returncode':1092,1099 'result.stderr.decode':1097 'result.stdout.decode':1095 'return':189,191,208,273,280,287,290,318,339,363,400,438,447,671,688,715,854,868,880,912,950,952,1007,1031,1038,1056,1089,1149,1177,1218,1233,1262,1311,1313,1386,1428,1451,1660,1751,1776,1807,1959,1994 'rev':1816 'rev-pars':1815 'review':2099 'rf':947 'risk':767,782,794,897,916,928 'rm':946 'role':115,173,1367,1416 'root':1539,1554 'run':109,523,539,798,933,1678 'safeti':728,2020,2109 'sandbox':955,1046,2027 'sandboxedexecut':958 'save':1670,1697,1706,1964 'schema':299,310,314,1907 'scope':2080 'screenshot':561,563,1169,1186,1188,1215,1227,1229,1329,1362,1385,1405,1441 'search':493,495,502,504,572,574,615,629,649,665,693,704,778 'search/replace':594 'see':1381 'select':262 'selector':1196,1206,1225,1242,1248,1260,1270,1339 'self':88,110,198,241,264,311,332,362,399,404,612,826,838,917,966,990,1014,1047,1127,1141,1195,1247,1276,1342,1353,1393,1487,1496,1524,1563,1591,1608,1682,1699,1756,1794,1864,1875,1913 'self._assess_risk':899 'self._capture_workspace':1726 'self._execute_tool':164 'self._extract_name':1969 'self._format_tools':137 'self._get_parameters':327 'self._get_required':329 'self._restore_workspace':1784 'self.add':1556 'self.allowed':973,1042 'self.available':1870,1902 'self.blocked':981 'self.browser':1131,1154,1155,1347 'self.browser.new':1162 'self.browser.page.mouse.click':1446 'self.browser.screenshot':1364,1407 'self.config':831 'self.config.get':846 'self.connect':1988 'self.context':1492,1620 'self.context.append':1514,1581,1599 'self.description':322 'self.headless':1135,1159 'self.history':107,135 'self.history.append':114,172 'self.llm':94,1345,1866 'self.llm.chat':133,1366,1415 'self.llm.generate':1938 'self.max':103,123 'self.mcp':1868,1889 'self.models':242,274,281,288,291 'self.name':320 'self.page':1133,1160 'self.page.click':1205 'self.page.evaluate':1287 'self.page.fill':1259 'self.page.goto':1165 'self.page.screenshot':1171,1217 'self.page.title':1176 'self.page.url':1191 'self.page.wait':1210 'self.session':833,878,881,907 'self.storage':1686,1734 'self.tools':96,203 'self.ui':829 'self.ui.show':859,889 'self.validate':1053 'self.workspace':970,1006,1076,1085,1490 'send':534,536 'server':1836,1842,1869,1874,1885,1886,1887,1890,1892,1905,1921,1935,1944,1967,1974,1989,1990,1998 'server.list':1896 'session':748,1700,1714,1716,1737 'shell':527,1073 'shlex.split':1025 'show':885 'sickn33':9 'skill':6,7,36,39,2072 'smart':249,282,292 'sonnet':258 'source-sickn33' 'special':234 'specif':608,925,2094 'start':373,380,407,426,433 'state':1168,1213,1674,1703,1709,1719,1722,1725,1727,1763,1787,1801 'state.get':1730 'status':1803,1826 'step':2015 'stop':392,2100 'storag':1683,1688,1691 'str':112,113,180,267,268,406,614,616,618,841,920,923,969,992,1016,1049,1143,1197,1249,1251,1354,1395,1489,1498,1526,1565,1609,1685,1702,1705,1759,1796,1877,1915,1916 'string':366 'subprocess.getoutput':1810,1821 'subprocess.run':1071 'substitut':2090 'success':440,449,673,690,717,1058,1091,1179,1220,1235,1264,1315,1453,2112 'sudo':811,948 'symbol':521 'system':53,2022 't.name':97 'target':482 'task':111,118,187,265,270,277,284,1679,2006,2076 'termin':522 'test':1124,2096 'text':556,558,631,640,694,1246,1250,1254,1261,1280,1290,1296,1300,1308,1312,1371,1372,1420,1421 'think':75,125 'ticket':1932 'time':648,755,797 'timeout':1080,1207 'timeouterror':1232 'timestamp':1711 'titl':1174,1184 'tool':90,102,130,136,138,149,154,162,165,174,175,185,197,199,202,294,298,302,307,317,337,345,460,464,581,586,839,847,862,863,875,883,892,893,900,909,918,931,1108,1843,1854,1857,1871,1894,1895,1897,1899,1901,1903,1912,1928,1947,1997,2009,2064 'tool.execute':209 'tool.name':1904 'tool.schema':1908 'tool/function':46 'tool_call.arguments':207 'tool_call.id':178 'tool_call.name':204 'toolresult':334,415,439,448,623,672,689,716,1050,1057,1090,1144,1178,1198,1219,1234,1252,1263,1277,1314,1396,1452 'treat':2085 'tri':416,1203 'true':441,718,855,1074,1079,1130,1180,1221,1265,1316,1454,1695 'turbo':246,252 'type':266,271,278,285,324,365,375,387,555,557,1172,1245,1253,1268,1370,1382,1419,1438,1515,1582,1600,1623,1637,1649 'ui':819,827,830,2036 'understand':501,1331 'undo/rollback':2042 'untrust':2029 'updat':2040 'url':546,1140,1142,1147,1166,1190,1562,1564,1567,1571,1575,1583,1584,1585,1638,1641,1643 'use':34,37,147,219,593,1117,1328,1355,1852,1951,2065,2070 'user':116,566,569,740,1368,1417,1924,2019 'ux':2034 'valid':652,661,988,1012,2095 'visibl':1289,2017 'vision':1356,1409 'visual':1120,1320,1337,1400 'visualag':1325 'w':709,1743,1980 'walker':1292 'walker.currentnode':1305 'walker.nextnode':1302 'want':145 'web':573,576,1123,1332 'webpag':1375 'whitespac':638 'within':997 'without':1338 'workflow':65 'workspac':967,971,998,1003,1009,1488,1491,1724,1728,1783,1786,1793,1795,1800,1813,1824 'write':472,785 'x':1434,1448,1460 'y':1436,1450,1462","prices":[{"id":"c788b550-a396-44b3-b7a2-ff7704167803","listingId":"6f699bfe-c5fc-435e-80ad-1eaf153653a7","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T20:38:07.579Z"}],"sources":[{"listingId":"6f699bfe-c5fc-435e-80ad-1eaf153653a7","source":"github","sourceId":"sickn33/antigravity-awesome-skills/autonomous-agent-patterns","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/autonomous-agent-patterns","isPrimary":false,"firstSeenAt":"2026-04-18T21:31:37.378Z","lastSeenAt":"2026-04-25T06:50:30.380Z"},{"listingId":"6f699bfe-c5fc-435e-80ad-1eaf153653a7","source":"skills_sh","sourceId":"sickn33/antigravity-awesome-skills/autonomous-agent-patterns","sourceUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/autonomous-agent-patterns","isPrimary":true,"firstSeenAt":"2026-04-18T20:38:07.579Z","lastSeenAt":"2026-04-25T09:40:48.071Z"}],"details":{"listingId":"6f699bfe-c5fc-435e-80ad-1eaf153653a7","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"autonomous-agent-patterns","source":"skills_sh","category":"antigravity-awesome-skills","skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/autonomous-agent-patterns"},"updatedAt":"2026-04-25T09:40:48.071Z"}}