{"id":"6f699bfe-c5fc-435e-80ad-1eaf153653a7","shortId":"TChxvZ","kind":"skill","title":"autonomous-agent-patterns","tagline":"Design patterns for building autonomous coding agents, inspired by [Cline](https://github.com/cline/cline) and [OpenAI Codex](https://github.com/openai/codex).","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","agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding"],"capabilities":["skill","source-sickn33","skill-autonomous-agent-patterns","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-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":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 37911 github stars · SKILL.md body (22,480 chars)","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-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:50:31.656Z","embedding":null,"createdAt":"2026-04-18T20:38:07.579Z","updatedAt":"2026-05-18T18:50:31.656Z","lastSeenAt":"2026-05-18T18:50:31.656Z","tsv":"'-1':449 '-3':271 '-3.5':259 '-4':265 '/)':2076 '/bin':999 '/claude/docs/tool-use)':2082 '/cline/cline)':17,39,2065 '/etc':997 '/mcp_servers':1987 '/openai/codex)':2070 '/openai/codex).':23,45 '/server.py':1990 '/usr':998 '0':701,1051,1107,1114 '1':80,397,636 '1.1':84 '1.2':225 '2':307,1673,1764 '2.1':311 '2.2':471 '2.3':593 '20':1544 '3':740 '3.1':744 '3.2':831 '3.3':968 '30':1095 '4':1117 '4.1':1120 '4.2':1333 '5':1477 '5.1':1480 '5.2':1679 '50':107 '5000':1222 '6':1842 '6.1':1848 'absolut':382 'access':1293 'act':91,173 'action':2060 'actual':676,681,696,699,736 'add':182,1508,1515,1536,1547,1575,1584,1603,1610,1869,1940 'agent':3,11,25,33,58,72,82,85,87,158,320,473,477,1130,1335,1340,1492,1687,1722,1776,1860,2017 'agentloop':99 'ai':57 'allow':775,881,1036,1078 'analysi':293 'analyz':938 'anthrop':2077 'api':62 'appear':665 'appli':713 'appropri':2022 'approv':66,755,785,824,832,848,851,893,896,900,902,904,922,925,927,2049 'approvalmanag':837 'approxim':1444 'architectur':83,229 'arg':219,224,638,856,909,910,916,935 'args.get':950 'ask':579,581,759,763,765,767,770,772,797,809,1422,2116 'assess':929 'async':1151,1206,1257,1285,1363,1402,1923 'audit':2045 'auto':154,757,758,784,823 'auto-approv':783,822 'autom':70,1119,1128 'automat':752 'autonom':2,9,24,31,56 'autonomous-agent-pattern':1 'avail':2057 'await':1170,1175,1178,1184,1189,1218,1223,1230,1272,1300,1377,1420,1459 'base':317,1047,1053,1936 'base64.b64encode':1201,1242 'best':2014 'block':2040 'bool':858,1007,1031,1143 'boundari':2124 'browser':69,555,558,562,1118,1121,1127,1358,1362 'browsertool':1126 'build':8,30,55 'call':61,166,169,172,180,190,200,214,940 'captur':576,1091,1181,1806,1812 'cat':994 'cd':1826,1837 'check':156,1032 'checklist':2016 'checkpoint':1712,1724,1761,1769,1771,1779,1782,1787,1792,1795,1799,1803 'checkpoint/resume':1680 'checkpointmanag':1683 'chmod':963 'choic':153 'clarif':2118 'class':98,231,315,318,357,598,748,836,971,1125,1338,1485,1682,1858 'claud':270 'clear':2019,2052,2091 'click':563,565,1208,1213,1238,1406,1417,1471 'cline':14,36,1495,1875,2062 'cmd':949,956,1037,1043,1048,1049,1054 'code':10,32,251,269,273,300,303,476,514,517,520,793,1950,1951,1977,1998,2044 'code/commands':974 'codex':20,42,2067 'command':538,542,546,554,813,826,948,951,988,1027,1029,1034,1040,1057,1062,1068,1069,1076,1079,1086 'complet':202 'complex':246,267 'config':779,842,846,1892,1902 'conflict':605 'connect':1887,1895 'const':1305,1317 'content':131,193,366,485,623,673,716,728,1289,1295,1299,1332,1383,1432,1517,1526,1533,1534,1586,1590,1600,1601,1647,1660 'content.count':678 'content.replace':717 'context':578,1478,1481,1488,1519,1626,1735,1737,1794,1796,1845,2072 'contextmanag':1486 'coord':1456,1461,1463,1473,1475 'coordin':1445 'core':81 'creat':68,488,1925,1931,1954,2010 'criteria':2127 'current':1374,1721 'cwd':1089 'danger':820,954,958,2038 'data':1398,1454 'datetime.now':1726 'debug':1135 'decid':90,155 'decis':262 'decod':1203,1244 'decomposit':2021 'def':100,122,209,253,275,323,344,373,410,416,624,838,849,928,978,1001,1025,1058,1139,1152,1207,1258,1286,1354,1364,1403,1499,1507,1535,1574,1602,1618,1694,1710,1767,1805,1876,1886,1924 'definit':524,527 'delet':816 'describ':1365,1373,1387,2095 'descript':335,363,381,391,403,616,1408,1415,1441,1928,1939,1964,1984 'design':5,27,59,73,309,596,2018 'detect':606 'diagnost':1606,1612,1615,1617,1664 'dialog':901,905 'dict':326,857,936,1718,1774,1811,1893 'differ':234,237 'dir':982,986,1554,1698,1701,1703,1706,1749 'directori':502,790,1102 'dirti':1834 'discov':1864,1907 'disk':829 'docs.anthropic.com':2081 'docs.anthropic.com/claude/docs/tool-use)':2080 'document.body':1308 'document.createtreewalker':1307 'dynam':1863 'edit':493,497,594,603,612,614,617,642,714,803 'editfiletool':599 'element':564,568,1216,1253,1350,1393,1412,1427,1439 'elif':290,297,1649,1661 'els':196,1115 'enabl':1133,2047 'end':399,425,443,450 'ensur':1008 'enum':750 'env':1096 'environ':977,1083,2107 'environment-specif':2106 'error':465,689,706,874,1074,1110,1251,1971,2025 'essenti':472 'etc':1820 'everi':768 'exact':644,650 'except':459,1245 'execut':94,174,210,345,349,417,539,625,973,1059,1080 'exist':1707 'expect':633,658,683,691,692 'expert':2112 'explan':2058 'f':436,466,672,690,725,734,875,1075,1196,1237,1252,1281,1436,1470,1525,1640,1654,1666,1750,1759,1762,1786,1789,1825,1836,1953,1986,1996,2009 'f.read':674,1527 'f.readlines':438 'f.write':726,1997 'fals':464,688,705,883,1046,1073,1250,1312 'fast':239,257,289 'fastmcp':1967 'fetch':1582,1944 'file':362,369,386,467,479,482,484,487,492,494,500,504,508,511,602,615,619,640,712,787,800,804,817,1509,1514,1516,1530,1542,1549,1555,1560,1562,1564,1565,1569,1571,1572,1638,1641,1818 'filenotfounderror':460 'filesystem':372 'find':525,530,647,1404,1411,1426,1437 'folder':506,1537,1546,1551 'format':828,1619,1624 'found':469,695,710,1255 'framework':1968 'fulli':751 'function/class':526 'generat':252,274,1947 'get':140,374,411,523,528,1287,1292,1302 'git':992,1816,1822,1828,1833,1839 'github.com':16,22,38,44,2064,2069 'github.com/cline/cline)':15,37,2063 'github.com/openai/codex)':2068 'github.com/openai/codex).':21,43 'gpt':258,264 'granular':2024 'grep':522 'handl':1972,2026 'hash':1819 'head':1832 'headless':1142,1150,1172 'high':807,965 'histori':185,1732,1734,1791,1793 'home':1098,1101 'hot':2000 'hot-reload':1999 'html':1591 'human':75 'human-in-the-loop':74 'id':191,1715,1729,1731,1752 'ide':1611 'identifi':1349 'imag':1397,1453 'implement':63,2037 'import':1855 'includ':651,1969 'inclus':409 'indent':1672,1763 'index':398 'info':1165 'inform':592 'init':101,254,839,979,1140,1355,1500,1695,1877 'inject':1482 'input':549,551,574,1271,2121 'inspir':12,34,1493 'instal':1980 'int':423,427,635,1543 'integ':390,402 'integr':1847 'interact':1392 'isoformat':1727 'isol':976,1082,1100 'item':1632,1636,1642,1646,1650,1656,1659,1662,1670 'iter':106,118,120,138,207 'jira':1945 'join':457,1677 'json':327,1447,1753 'json.dump':1760 'json.dumps':1669 'json.load':1788 'json.loads':220,1457 'kwarg':347 'let':1313 'level':746,859,866,871,885,912,918,943 'limit':2083 'line':388,392,400,404,422,426,437,441,444,445,446,448,451,458 'list':501,503,789,1390,1607 'llm':103,109,141,1357,1360,1628,1879,1881 'load':1197,1226 'log':2046 'long':1691 'long-run':1690 'loop':78,86,88 'low':780 'ls':993 'make':495 'manag':1479,1487 'mani':661 'markdown':1593 'match':649,1440,2092 'max':105,119,206,1541,1563 'mcp':1843,1849,1854,1867,1898,1934,1948,1957 'mcpagent':1859 'medium':795,967 'mention':1497 'messag':148 'metadata':1199,1240,1743,1745,1802,1804 'miss':2129 'model':228,235,240,244,249,277,1371,1424,1844,2071 'modelcontextprotocol.io':2075 'modelcontextprotocol.io/)':2074 'multi':227 'multi-model':226 'multimodelag':232 'must':648 'n':1324,1644,1645,1648,1658,1668,1675,1676 'name':333,360,613,854,862,878,890,898,908,915,924,933,946,1890,1905,1920,1982,1989,2005,2013 'navig':1159 'need':756 'networkidl':1228 'never':774,776,777,821 'new':715,727,1933 'node':991,1318 'node.textcontent.trim':1321,1323 'nodefilter.show':1309 'none':424,428,1116,1146,1148,1513,1545,1580,1608,1894 'notimplementederror':356 'npm':989 'null':1311 'number':1449,1451 'object':339 'observ':95,181 'occurr':634,659,677,682,684,693,694,697,700,737,738 'ok':1708 'open':432,557,559,668,721,1153,1521,1755,1781,1992 'openai':19,41,2066 'oper':480,2039 'option':145,556 'os.environ':1097 'os.makedirs':1704 'os.path.expanduser':1000 'os.path.join':1567,1747 'os.path.realpath':1015,1019 'os.walk':1557 'output':456,544,547,733,1092,1108,1195,1236,1280,1331,1469,2101 'overwrit':490 'page':567,1164,1177,1288,1298,1347,1366,1375 'paramet':337,375 'pars':1831 'part':1038,1044,1050,1630,1678 'parts.append':1639,1653,1665 'path':378,383,415,419,433,470,627,639,669,722,996,1003,1005,1009,1014,1016,1511,1522,1531,1532,1539,1558,1566,1573,1643,1746,1756,1766,1772,1783,1985,1993,2006,2007 'pattern':4,6,26,28,310,513,521,609,743,834,1123,1336,1483,1498,1851,1873 'per':761 'permiss':64,741,745,778,2035,2122 'permissionlevel':749 'permissionlevel.ask':801,805,814,818,863,886,919 'permissionlevel.auto':788,791,794,867 'permissionlevel.never':827,830,872 'plan':93,242,286 'playwright.chromium.launch':1171 'playwright/puppeteer':1132 'png':1187 'porcelain':1841 'power':243 'practic':2015 'precis':601 'problem':1604,1609,1616,1667,1671 'progress':2030,2053 'prompt':1621,1629 'proper':1970 'properti':322,340 'protocol':1846,2073 'provid':1489,2055 'purpos':238 'python':97,230,314,475,597,747,835,970,990,1124,1337,1484,1681,1852,1956,1976 'question':585 'quick':261 'r':434,670,1523,1784 'rais':355 'rang':136 'reach':208 'read':361,364,395,407,481,483,543,545,786 'readfiletool':358 'real':1013,1018,1024 'real_path.startswith':1022 'reason':92,247,268 'ref':1823 'refer':529,532 'relev':1813 'reliabl':611 'reload':2001 'replac':621,631,653,656,719,735 'request':850 'requests.get':1588 'requir':342,412,2120 'resourc':2061 'respons':142,146,1379,1428,1587 'response.content':204,1401,1458 'response.text':1594 'response.tool':165,171 'restor':1686,1768,1775 'result':96,177,183,195,354,1084 'result.returncode':1106,1113 'result.stderr.decode':1111 'result.stdout.decode':1109 'return':203,205,222,287,294,301,304,332,353,377,414,452,461,685,702,729,868,882,894,926,964,966,1021,1045,1052,1070,1103,1163,1191,1232,1247,1276,1325,1327,1400,1442,1465,1674,1765,1790,1821,1973,2008 'rev':1830 'rev-pars':1829 'review':2113 'rf':961 'risk':781,796,808,911,930,942 'rm':960 'role':129,187,1381,1430 'root':1553,1568 'run':123,537,553,812,947,1692 'safeti':742,2034,2123 'sandbox':969,1060,2041 'sandboxedexecut':972 'save':1684,1711,1720,1978 'schema':313,324,328,1921 'scope':2094 'screenshot':575,577,1183,1200,1202,1229,1241,1243,1343,1376,1399,1419,1455 'search':507,509,516,518,586,588,629,643,663,679,707,718,792 'search/replace':608 'see':1395 'select':276 'selector':1210,1220,1239,1256,1262,1274,1284,1353 'self':102,124,212,255,278,325,346,376,413,418,626,840,852,931,980,1004,1028,1061,1141,1155,1209,1261,1290,1356,1367,1407,1501,1510,1538,1577,1605,1622,1696,1713,1770,1808,1878,1889,1927 'self._assess_risk':913 'self._capture_workspace':1740 'self._execute_tool':178 'self._extract_name':1983 'self._format_tools':151 'self._get_parameters':341 'self._get_required':343 'self._restore_workspace':1798 'self.add':1570 'self.allowed':987,1056 'self.available':1884,1916 'self.blocked':995 'self.browser':1145,1168,1169,1361 'self.browser.new':1176 'self.browser.page.mouse.click':1460 'self.browser.screenshot':1378,1421 'self.config':845 'self.config.get':860 'self.connect':2002 'self.context':1506,1634 'self.context.append':1528,1595,1613 'self.description':336 'self.headless':1149,1173 'self.history':121,149 'self.history.append':128,186 'self.llm':108,1359,1880 'self.llm.chat':147,1380,1429 'self.llm.generate':1952 'self.max':117,137 'self.mcp':1882,1903 'self.models':256,288,295,302,305 'self.name':334 'self.page':1147,1174 'self.page.click':1219 'self.page.evaluate':1301 'self.page.fill':1273 'self.page.goto':1179 'self.page.screenshot':1185,1231 'self.page.title':1190 'self.page.url':1205 'self.page.wait':1224 'self.session':847,892,895,921 'self.storage':1700,1748 'self.tools':110,217 'self.ui':843 'self.ui.show':873,903 'self.validate':1067 'self.workspace':984,1020,1090,1099,1504 'send':548,550 'server':1850,1856,1883,1888,1899,1900,1901,1904,1906,1919,1935,1949,1958,1981,1988,2003,2004,2012 'server.list':1910 'session':762,1714,1728,1730,1751 'shell':541,1087 'shlex.split':1039 'show':899 'skill':50,53,2086 'skill-autonomous-agent-patterns' 'smart':263,296,306 'sonnet':272 'source-sickn33' 'special':248 'specif':622,939,2108 'start':387,394,421,440,447 'state':1182,1227,1688,1717,1723,1733,1736,1739,1741,1777,1801,1815 'state.get':1744 'status':1817,1840 'step':2029 'stop':406,2114 'storag':1697,1702,1705 'str':126,127,194,281,282,420,628,630,632,855,934,937,983,1006,1030,1063,1157,1211,1263,1265,1368,1409,1503,1512,1540,1579,1623,1699,1716,1719,1773,1810,1891,1929,1930 'string':380 'subprocess.getoutput':1824,1835 'subprocess.run':1085 'substitut':2104 'success':454,463,687,704,731,1072,1105,1193,1234,1249,1278,1329,1467,2126 'sudo':825,962 'symbol':535 'system':67,2036 't.name':111 'target':496 'task':125,132,201,279,284,291,298,1693,2020,2090 'termin':536 'test':1138,2110 'text':570,572,645,654,708,1260,1264,1268,1275,1294,1304,1310,1314,1322,1326,1385,1386,1434,1435 'think':89,139 'ticket':1946 'time':662,769,811 'timeout':1094,1221 'timeouterror':1246 'timestamp':1725 'titl':1188,1198 'tool':104,116,144,150,152,163,168,176,179,188,189,199,211,213,216,308,312,316,321,331,351,359,474,478,595,600,853,861,876,877,889,897,906,907,914,923,932,945,1122,1857,1868,1871,1885,1908,1909,1911,1913,1915,1917,1926,1942,1961,2011,2023,2078 'tool.execute':223 'tool.name':1918 'tool.schema':1922 'tool/function':60 'tool_call.arguments':221 'tool_call.id':192 'tool_call.name':218 'toolresult':348,429,453,462,637,686,703,730,1064,1071,1104,1158,1192,1212,1233,1248,1266,1277,1291,1328,1410,1466 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'treat':2099 'tri':430,1217 'true':455,732,869,1088,1093,1144,1194,1235,1279,1330,1468,1709 'turbo':260,266 'type':280,285,292,299,338,379,389,401,569,571,1186,1259,1267,1282,1384,1396,1433,1452,1529,1596,1614,1637,1651,1663 'ui':833,841,844,2050 'understand':515,1345 'undo/rollback':2056 'untrust':2043 'updat':2054 'url':560,1154,1156,1161,1180,1204,1576,1578,1581,1585,1589,1597,1598,1599,1652,1655,1657 'use':48,51,161,233,607,1131,1342,1369,1866,1965,2079,2084 'user':130,580,583,754,1382,1431,1938,2033 'ux':2048 'valid':666,675,1002,1026,2109 'visibl':1303,2031 'vision':1370,1423 'visual':1134,1334,1351,1414 'visualag':1339 'w':723,1757,1994 'walker':1306 'walker.currentnode':1319 'walker.nextnode':1316 'want':159 'web':587,590,1137,1346 'webpag':1389 'whitespac':652 'within':1011 'without':1352 'workflow':79 'workspac':981,985,1012,1017,1023,1502,1505,1738,1742,1797,1800,1807,1809,1814,1827,1838 'write':486,799 'x':1448,1462,1474 'y':1450,1464,1476","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-05-18T18:50:31.656Z"},{"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-05-07T22:40:47.284Z"}],"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","github":{"repo":"sickn33/antigravity-awesome-skills","stars":37911,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-05-18T08:24:49Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"318366fd9fd72a58f30bf695b5f4d9003472f20e","skill_md_path":"skills/autonomous-agent-patterns/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/autonomous-agent-patterns"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"autonomous-agent-patterns","description":"Design patterns for building autonomous coding agents, inspired by [Cline](https://github.com/cline/cline) and [OpenAI Codex](https://github.com/openai/codex)."},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/autonomous-agent-patterns"},"updatedAt":"2026-05-18T18:50:31.656Z"}}